OVH Cloud OVH Cloud

Code Excel VBA dans une dll VB6

4 réponses
Avatar
PM
Bonjour !
et merci pour les indications qui m'ont déjà été données, par exemple par
Nicolas G, en réponse à ma question du 3 nov 8:50.

J' ai fait un exemple avec affichage de "coucou" et, évidemment, ça marche.
(!)
Maintenant je veux que ma dll travaille sur le classeur Excel qui va
l'appeler comme du code VBA qui serait placé dans ce classeur.
Dois-je faire référence au classeur dans la dll ?
Par exemple, voici un bout de code VBA dans Excel


Sub tab_brut()

Dim c3 As Integer 'dernière colonne du tableau de saisie
Dim i As Integer

Application.ScreenUpdating = False
.......... etc.

Puis-je laisser ainsi, la dll étant appelée par le classeur, ou bien dois-je
faire qqch du genre :

Sub tab_brut(nom_du_classeur As String)

Dim c3 As Integer 'dernière colonne du tableau de saisie
Dim i As Integer

Dim SH As New Excel.Workbook
Set SH = nom_du_classeur

SH.Application.ScreenUpdating = False


La version ci-dessus ne marche pas : SH = nom_du_classeur ne colle pas
puisque c'est un string...
Comment faire référence au classeur appellant déjà ouvert ?

Merci !

4 réponses

Avatar
ng
Salut,

Si tu veux travailler ton classeur depuis ta DLL il suffit de faire ceci par
exemple :

'//Code VB de la DLL :

Option Explicit

'//on pourrait typer l'objet mais il faudrait faire une ref a excel ds ta
dll
Private m_oClasseurRef As Object

'//ton code... tu peux travailler avec l'objet m_oClasseurRef qui sera ton
'//classeur excel (si tu veux l'intellisence, type l'objet cf plus haut).


Public Sub SetClasseurObj(oRef As Object)
Set m_oClasseurRef = oRef
End Sub
Private Sub Class_Terminate()
Set m_oClasseurRef = Nothing
End Sub

'//Sous excel :

'//Déclaration et création d'une instance de ta classe VB avec New...
'//Puis tout au début :
Call oMonObjetClasse.SetClasseurObj(ThisWorkbook)


Voila, si ca t'interesse je peux faire un exemple, je viens (enfin) de
réinstaller excel ;)

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

PM wrote:
Bonjour !
et merci pour les indications qui m'ont déjà été données, par exemple
par Nicolas G, en réponse à ma question du 3 nov 8:50.

J' ai fait un exemple avec affichage de "coucou" et, évidemment, ça
marche. (!)
Maintenant je veux que ma dll travaille sur le classeur Excel qui va
l'appeler comme du code VBA qui serait placé dans ce classeur.
Dois-je faire référence au classeur dans la dll ?
Par exemple, voici un bout de code VBA dans Excel


Sub tab_brut()

Dim c3 As Integer 'dernière colonne du tableau de saisie
Dim i As Integer

Application.ScreenUpdating = False
.......... etc.

Puis-je laisser ainsi, la dll étant appelée par le classeur, ou bien
dois-je faire qqch du genre :

Sub tab_brut(nom_du_classeur As String)

Dim c3 As Integer 'dernière colonne du tableau de saisie
Dim i As Integer

Dim SH As New Excel.Workbook
Set SH = nom_du_classeur

SH.Application.ScreenUpdating = False


La version ci-dessus ne marche pas : SH = nom_du_classeur ne colle pas
puisque c'est un string...
Comment faire référence au classeur appellant déjà ouvert ?

Merci !


Avatar
ng
Salut,

Voila je n'ai pas pu résister j'ai fait un exemple, je le poste en pièce
jointe dans mon prochain message, voici quand même le code :

'//Projet DLL ActiveX nommé VBAExcel avec une ref a excel et un classe
nommée MaClasse1 :
Option Explicit

Private m_oWorkBook As Excel.Workbook


Public Sub SetWorkBook(oWB As Object)
Set m_oWorkBook = oWB
End Sub

Private Sub Class_Terminate()
Set m_oWorkBook = Nothing
End Sub

'//Fonction exemple
Public Sub CompleteCell(wCol As Integer, wFromRow As Integer, wToRow As
Integer)
Dim i As Integer, oSheet As Excel.Worksheet
Set oSheet = m_oWorkBook.ActiveSheet
Call Randomize(Timer)
For i = wFromRow To wToRow
oSheet.Cells(i, wCol) = "Nb VBA #" & i & "="
oSheet.Cells(i, wCol + 1) = Int(Rnd * 10000 + 1000)
Next
End Sub


'//Code dans la feuille excel (qui contient un commandbutton) :

Private Sub CommandButton1_Click()
'//on peut aussi créer ca en public une bonne fois pour toute !
Dim oMaClasse As VBAExcel.MaClasse1
Set oMaClasse = New VBAExcel.MaClasse1

'//référence pr la dll
Call oMaClasse.SetWorkBook(ThisWorkbook)

'//fonction de test :
Call oMaClasse.CompleteCell(2, 5, 25)

Set oMaClasse = Nothing
End Sub

Voila :)

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

ng wrote:
Salut,

Si tu veux travailler ton classeur depuis ta DLL il suffit de faire
ceci par exemple :

'//Code VB de la DLL :

Option Explicit

'//on pourrait typer l'objet mais il faudrait faire une ref a excel
ds ta dll
Private m_oClasseurRef As Object

'//ton code... tu peux travailler avec l'objet m_oClasseurRef qui
sera ton '//classeur excel (si tu veux l'intellisence, type l'objet
cf plus haut).

Public Sub SetClasseurObj(oRef As Object)
Set m_oClasseurRef = oRef
End Sub
Private Sub Class_Terminate()
Set m_oClasseurRef = Nothing
End Sub

'//Sous excel :

'//Déclaration et création d'une instance de ta classe VB avec New...
'//Puis tout au début :
Call oMonObjetClasse.SetClasseurObj(ThisWorkbook)


Voila, si ca t'interesse je peux faire un exemple, je viens (enfin) de
réinstaller excel ;)


PM wrote:
Bonjour !
et merci pour les indications qui m'ont déjà été données, par exemple
par Nicolas G, en réponse à ma question du 3 nov 8:50.

J' ai fait un exemple avec affichage de "coucou" et, évidemment, ça
marche. (!)
Maintenant je veux que ma dll travaille sur le classeur Excel qui va
l'appeler comme du code VBA qui serait placé dans ce classeur.
Dois-je faire référence au classeur dans la dll ?
Par exemple, voici un bout de code VBA dans Excel


Sub tab_brut()

Dim c3 As Integer 'dernière colonne du tableau de
saisie Dim i As Integer

Application.ScreenUpdating = False
.......... etc.

Puis-je laisser ainsi, la dll étant appelée par le classeur, ou bien
dois-je faire qqch du genre :

Sub tab_brut(nom_du_classeur As String)

Dim c3 As Integer 'dernière colonne du tableau de
saisie Dim i As Integer

Dim SH As New Excel.Workbook
Set SH = nom_du_classeur

SH.Application.ScreenUpdating = False


La version ci-dessus ne marche pas : SH = nom_du_classeur ne colle
pas puisque c'est un string...
Comment faire référence au classeur appellant déjà ouvert ?

Merci !




Avatar
ng
(voila donc dans cet exemple m_oWorkBook est typé est permet donc
l'utilisation de l'intellesence.)

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

ng wrote:
Salut,

Voila je n'ai pas pu résister j'ai fait un exemple, je le poste en
pièce jointe dans mon prochain message, voici quand même le code :

'//Projet DLL ActiveX nommé VBAExcel avec une ref a excel et un classe
nommée MaClasse1 :
Option Explicit

Private m_oWorkBook As Excel.Workbook


Public Sub SetWorkBook(oWB As Object)
Set m_oWorkBook = oWB
End Sub

Private Sub Class_Terminate()
Set m_oWorkBook = Nothing
End Sub

'//Fonction exemple
Public Sub CompleteCell(wCol As Integer, wFromRow As Integer, wToRow
As Integer)
Dim i As Integer, oSheet As Excel.Worksheet
Set oSheet = m_oWorkBook.ActiveSheet
Call Randomize(Timer)
For i = wFromRow To wToRow
oSheet.Cells(i, wCol) = "Nb VBA #" & i & "="
oSheet.Cells(i, wCol + 1) = Int(Rnd * 10000 + 1000)
Next
End Sub


'//Code dans la feuille excel (qui contient un commandbutton) :

Private Sub CommandButton1_Click()
'//on peut aussi créer ca en public une bonne fois pour toute !
Dim oMaClasse As VBAExcel.MaClasse1
Set oMaClasse = New VBAExcel.MaClasse1

'//référence pr la dll
Call oMaClasse.SetWorkBook(ThisWorkbook)

'//fonction de test :
Call oMaClasse.CompleteCell(2, 5, 25)

Set oMaClasse = Nothing
End Sub

Voila :)


ng wrote:
Salut,

Si tu veux travailler ton classeur depuis ta DLL il suffit de faire
ceci par exemple :

'//Code VB de la DLL :

Option Explicit

'//on pourrait typer l'objet mais il faudrait faire une ref a excel
ds ta dll
Private m_oClasseurRef As Object

'//ton code... tu peux travailler avec l'objet m_oClasseurRef qui
sera ton '//classeur excel (si tu veux l'intellisence, type l'objet
cf plus haut).

Public Sub SetClasseurObj(oRef As Object)
Set m_oClasseurRef = oRef
End Sub
Private Sub Class_Terminate()
Set m_oClasseurRef = Nothing
End Sub

'//Sous excel :

'//Déclaration et création d'une instance de ta classe VB avec New...
'//Puis tout au début :
Call oMonObjetClasse.SetClasseurObj(ThisWorkbook)


Voila, si ca t'interesse je peux faire un exemple, je viens (enfin)
de réinstaller excel ;)


PM wrote:
Bonjour !
et merci pour les indications qui m'ont déjà été données, par
exemple par Nicolas G, en réponse à ma question du 3 nov 8:50.

J' ai fait un exemple avec affichage de "coucou" et, évidemment, ça
marche. (!)
Maintenant je veux que ma dll travaille sur le classeur Excel qui va
l'appeler comme du code VBA qui serait placé dans ce classeur.
Dois-je faire référence au classeur dans la dll ?
Par exemple, voici un bout de code VBA dans Excel


Sub tab_brut()

Dim c3 As Integer 'dernière colonne du tableau de
saisie Dim i As Integer

Application.ScreenUpdating = False
.......... etc.

Puis-je laisser ainsi, la dll étant appelée par le classeur, ou bien
dois-je faire qqch du genre :

Sub tab_brut(nom_du_classeur As String)

Dim c3 As Integer 'dernière colonne du tableau de
saisie Dim i As Integer

Dim SH As New Excel.Workbook
Set SH = nom_du_classeur

SH.Application.ScreenUpdating = False


La version ci-dessus ne marche pas : SH = nom_du_classeur ne colle
pas puisque c'est un string...
Comment faire référence au classeur appellant déjà ouvert ?

Merci !






Avatar
PM
C'est vraiment super sympa ce que t'as fait : ça y est, ça s'est débloqué
dans ma tête !!
Il faut effectivement passer un objet workbook à la dll... et c'est
lumineusement clair : c'est ThisWorkbook !

Mille et mille mercis. Je vais y travailler demain...

Patrick
(un béotien un petit peu moins béotien...)


"ng" a écrit dans le message de news:

Voila l'exemple en question, il fut bien entendu compiler la DLL avant de
faire quoi que ce soit.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

ng wrote:
Salut,

Si tu veux travailler ton classeur depuis ta DLL il suffit de faire
ceci par exemple :

'//Code VB de la DLL :

Option Explicit

'//on pourrait typer l'objet mais il faudrait faire une ref a excel
ds ta dll
Private m_oClasseurRef As Object

'//ton code... tu peux travailler avec l'objet m_oClasseurRef qui
sera ton '//classeur excel (si tu veux l'intellisence, type l'objet
cf plus haut).


Public Sub SetClasseurObj(oRef As Object)
Set m_oClasseurRef = oRef
End Sub
Private Sub Class_Terminate()
Set m_oClasseurRef = Nothing
End Sub

'//Sous excel :

'//Déclaration et création d'une instance de ta classe VB avec New...
'//Puis tout au début :
Call oMonObjetClasse.SetClasseurObj(ThisWorkbook)


Voila, si ca t'interesse je peux faire un exemple, je viens (enfin) de
réinstaller excel ;)


PM wrote:
Bonjour !
et merci pour les indications qui m'ont déjà été données, par exemple
par Nicolas G, en réponse à ma question du 3 nov 8:50.

J' ai fait un exemple avec affichage de "coucou" et, évidemment, ça
marche. (!)
Maintenant je veux que ma dll travaille sur le classeur Excel qui va
l'appeler comme du code VBA qui serait placé dans ce classeur.
Dois-je faire référence au classeur dans la dll ?
Par exemple, voici un bout de code VBA dans Excel


Sub tab_brut()

Dim c3 As Integer 'dernière colonne du tableau de
saisie Dim i As Integer

Application.ScreenUpdating = False
.......... etc.

Puis-je laisser ainsi, la dll étant appelée par le classeur, ou bien
dois-je faire qqch du genre :

Sub tab_brut(nom_du_classeur As String)

Dim c3 As Integer 'dernière colonne du tableau de
saisie Dim i As Integer

Dim SH As New Excel.Workbook
Set SH = nom_du_classeur

SH.Application.ScreenUpdating = False


La version ci-dessus ne marche pas : SH = nom_du_classeur ne colle
pas puisque c'est un string...
Comment faire référence au classeur appellant déjà ouvert ?

Merci !