exécuter une macro (Public Sub) situer dans un module de classe
8 réponses
isabelle
salut à tous,
voici mon gros problème:
à partir de ThisWorkbook, comment exécuter une macro (Public Sub
ComboBox_Source) située dans le module de classe ("suivi"), c'est une feuille du
classeur.
Dim code(2), S As String
code(0) = "Private Sub Workbook_Open"
code(1) = "Application.Run (""suivi!ComboBox_Source"")"
'<-------------------problème
code(2) = "End Sub"
For i = 0 To 2
S = S & code(i) & Chr(10)
Next
Set MyVB = ActiveWorkbook.VBProject.VBComponents("ThisWorkBook").CodeModule
MyVB.AddFromString S
la macro (Public Sub ComboBox_Source) appelle une autre macro (Public Sub tri(a,
gauc, droi)) située sur le même module de classe ("suivi")
tous cela parce ce que j'envoie l'onglet "suivi" par courriel et j'aimerais bien
qu'à l'ouverture du fichier (même à partir d'outlook) que le ComboBox fonctionne
et que ces données soient triées.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
MichD
Bonjour Isabelle,
J'ai un peu de difficulté à saisir la structure de ton code...
Peux-tu publier ton fichier pour le code, une version simplifiée des macros pertinentes afin de voir comment ce dernier se déploie. Les données de la feuille de calcul ne sont pas requises!
'---------------------------------- tous cela parce ce que j'envoie l'onglet "suivi" par courriel et j'aimerais bien qu'à l'ouverture du fichier (même à partir d'outlook) que le ComboBox fonctionne et que ces données soient triées. '----------------------------------
Je ne connais pas les versions de Windows et de Microsoft Office à partir desquelles tu travailles, ces dernières ne permettent pas de faire cela facilement. La sécurité a été renforcée. On doit spécifier dans les options d'Excel, les répertoires où Excel peut accéder sans problème et, c'est sans compter "le contrôle du compte utilisateur" qui intervient régulièrement.
J'ai un peu de difficulté à saisir la structure de ton code...
Peux-tu publier ton fichier pour le code, une version simplifiée des macros
pertinentes afin de voir comment ce dernier se déploie. Les données de la
feuille de calcul ne sont pas requises!
'----------------------------------
tous cela parce ce que j'envoie l'onglet "suivi" par courriel et j'aimerais
bien qu'à l'ouverture du fichier (même à partir d'outlook) que le ComboBox
fonctionne et que ces données soient triées.
'----------------------------------
Je ne connais pas les versions de Windows et de Microsoft Office à partir
desquelles tu travailles, ces dernières ne permettent pas de faire cela
facilement. La sécurité a été renforcée. On doit spécifier dans les options
d'Excel, les répertoires où Excel peut accéder sans problème et, c'est sans
compter "le contrôle du compte utilisateur" qui intervient régulièrement.
J'ai un peu de difficulté à saisir la structure de ton code...
Peux-tu publier ton fichier pour le code, une version simplifiée des macros pertinentes afin de voir comment ce dernier se déploie. Les données de la feuille de calcul ne sont pas requises!
'---------------------------------- tous cela parce ce que j'envoie l'onglet "suivi" par courriel et j'aimerais bien qu'à l'ouverture du fichier (même à partir d'outlook) que le ComboBox fonctionne et que ces données soient triées. '----------------------------------
Je ne connais pas les versions de Windows et de Microsoft Office à partir desquelles tu travailles, ces dernières ne permettent pas de faire cela facilement. La sécurité a été renforcée. On doit spécifier dans les options d'Excel, les répertoires où Excel peut accéder sans problème et, c'est sans compter "le contrôle du compte utilisateur" qui intervient régulièrement.
Dans le module "feuil1", je n'ai rien modifié, mais je me demande pourquoi l'utilisateur utilise l'objet "Dictionary" ?
'----------------------------------- Public Sub ComboBox_Source() Set f = Sheets("suivi") Set MonDico = CreateObject("Scripting.Dictionary") a = f.Range("D6:D" & f.Range("D65536").End(xlUp).Row) ' tableau (n,1) For i = LBound(a) To UBound(a) MonDico(a(i, 1)) = "" Next i Temp = MonDico.keys Call tri(Temp, LBound(Temp), UBound(Temp)) f.ComboBox1.List = Temp End Sub '-----------------------------------
Ceci ne serait pas suffisant? '----------------------------------- Public Sub ComboBox_Source() Dim Tblo As Variant
with Sheets("suivi") Tblo = .Range("D6:D" & f.Range("D65536").End(xlUp).Row) ' tableau (n,1) Call tri(Tblo, LBound(Tblo), UBound(Tblo)) .ComboBox1.List = Tblo End With
End Sub '-----------------------------------
Bonjour,
Voici ton fichier. (pas tester)
http://cjoint.com/?DEktuq1hJGR
Dans le module "feuil1", je n'ai rien modifié, mais je me demande pourquoi
l'utilisateur utilise l'objet "Dictionary" ?
'-----------------------------------
Public Sub ComboBox_Source()
Set f = Sheets("suivi")
Set MonDico = CreateObject("Scripting.Dictionary")
a = f.Range("D6:D" & f.Range("D65536").End(xlUp).Row) ' tableau (n,1)
For i = LBound(a) To UBound(a)
MonDico(a(i, 1)) = ""
Next i
Temp = MonDico.keys
Call tri(Temp, LBound(Temp), UBound(Temp))
f.ComboBox1.List = Temp
End Sub
'-----------------------------------
Ceci ne serait pas suffisant?
'-----------------------------------
Public Sub ComboBox_Source()
Dim Tblo As Variant
with Sheets("suivi")
Tblo = .Range("D6:D" & f.Range("D65536").End(xlUp).Row) ' tableau
(n,1)
Call tri(Tblo, LBound(Tblo), UBound(Tblo))
.ComboBox1.List = Tblo
End With
Dans le module "feuil1", je n'ai rien modifié, mais je me demande pourquoi l'utilisateur utilise l'objet "Dictionary" ?
'----------------------------------- Public Sub ComboBox_Source() Set f = Sheets("suivi") Set MonDico = CreateObject("Scripting.Dictionary") a = f.Range("D6:D" & f.Range("D65536").End(xlUp).Row) ' tableau (n,1) For i = LBound(a) To UBound(a) MonDico(a(i, 1)) = "" Next i Temp = MonDico.keys Call tri(Temp, LBound(Temp), UBound(Temp)) f.ComboBox1.List = Temp End Sub '-----------------------------------
Ceci ne serait pas suffisant? '----------------------------------- Public Sub ComboBox_Source() Dim Tblo As Variant
with Sheets("suivi") Tblo = .Range("D6:D" & f.Range("D65536").End(xlUp).Row) ' tableau (n,1) Call tri(Tblo, LBound(Tblo), UBound(Tblo)) .ComboBox1.List = Tblo End With
Pour '------------------------ With Destwb ÉcrireCode Destwb, .Worksheets(1).CodeName 'Ajouter .SaveAs TempFilePath & TempFileName & FileExtStr, FileFormat:=FileFormatNum
'.../le reste du code...
MichD
J'ai omis d'inclure la procédure de tri pour le "Tblo"
SortArray = Tblo Col = Numéro de la colonne de la plage de cellules, comme dans ta procédure, tu charges seulement les données d'une colonne dans le Tblo, Col = 1 peu importe la colonne
'-------------------------------------------------------------- Sub QuickSort(SortArray, col, L, R) 'Tom Ogilvy 'Originally Posted by Jim Rech 10/20/98 Excel.Programming 'Modified to sort on first column of a two dimensional array 'Modified to handle a second dimension greater than 1 (or zero) Dim i, j, X, Y, mm
i = L j = R X = SortArray((L + R) / 2, col)
While (i <= j) While (SortArray(i, col) < X And i < R) i = i + 1 Wend While (X < SortArray(j, col) And j > L) j = j - 1 Wend If (i <= j) Then For mm = LBound(SortArray, 2) To UBound(SortArray, 2) Y = SortArray(i, mm) SortArray(i, mm) = SortArray(j, mm) SortArray(j, mm) = Y Next mm i = i + 1 j = j - 1 End If Wend If (L < j) Then Call QuickSort(SortArray, col, L, j) If (i < R) Then Call QuickSort(SortArray, col, i, R) End Sub '--------------------------------------------------------------
'----------------------------------- Public Sub ComboBox_Source() Dim Tblo As Variant
with Sheets("suivi") Tblo = .Range("D6:D" & f.Range("D65536").End(xlUp).Row) ' tableau (n,1) Call QuickSort Tblo, 1, LBound(Tblo, 1), UBound(Tblo, 1) .ComboBox1.List = Tblo End With
End Sub '-----------------------------------
J'ai omis d'inclure la procédure de tri pour le "Tblo"
SortArray = Tblo
Col = Numéro de la colonne de la plage de cellules, comme dans ta procédure,
tu charges seulement
les données d'une colonne dans le Tblo, Col = 1 peu importe la
colonne
'--------------------------------------------------------------
Sub QuickSort(SortArray, col, L, R)
'Tom Ogilvy
'Originally Posted by Jim Rech 10/20/98 Excel.Programming
'Modified to sort on first column of a two dimensional array
'Modified to handle a second dimension greater than 1 (or zero)
Dim i, j, X, Y, mm
i = L
j = R
X = SortArray((L + R) / 2, col)
While (i <= j)
While (SortArray(i, col) < X And i < R)
i = i + 1
Wend
While (X < SortArray(j, col) And j > L)
j = j - 1
Wend
If (i <= j) Then
For mm = LBound(SortArray, 2) To UBound(SortArray, 2)
Y = SortArray(i, mm)
SortArray(i, mm) = SortArray(j, mm)
SortArray(j, mm) = Y
Next mm
i = i + 1
j = j - 1
End If
Wend
If (L < j) Then Call QuickSort(SortArray, col, L, j)
If (i < R) Then Call QuickSort(SortArray, col, i, R)
End Sub
'--------------------------------------------------------------
'-----------------------------------
Public Sub ComboBox_Source()
Dim Tblo As Variant
with Sheets("suivi")
Tblo = .Range("D6:D" & f.Range("D65536").End(xlUp).Row) ' tableau
(n,1)
Call QuickSort Tblo, 1, LBound(Tblo, 1), UBound(Tblo, 1)
.ComboBox1.List = Tblo
End With
J'ai omis d'inclure la procédure de tri pour le "Tblo"
SortArray = Tblo Col = Numéro de la colonne de la plage de cellules, comme dans ta procédure, tu charges seulement les données d'une colonne dans le Tblo, Col = 1 peu importe la colonne
'-------------------------------------------------------------- Sub QuickSort(SortArray, col, L, R) 'Tom Ogilvy 'Originally Posted by Jim Rech 10/20/98 Excel.Programming 'Modified to sort on first column of a two dimensional array 'Modified to handle a second dimension greater than 1 (or zero) Dim i, j, X, Y, mm
i = L j = R X = SortArray((L + R) / 2, col)
While (i <= j) While (SortArray(i, col) < X And i < R) i = i + 1 Wend While (X < SortArray(j, col) And j > L) j = j - 1 Wend If (i <= j) Then For mm = LBound(SortArray, 2) To UBound(SortArray, 2) Y = SortArray(i, mm) SortArray(i, mm) = SortArray(j, mm) SortArray(j, mm) = Y Next mm i = i + 1 j = j - 1 End If Wend If (L < j) Then Call QuickSort(SortArray, col, L, j) If (i < R) Then Call QuickSort(SortArray, col, i, R) End Sub '--------------------------------------------------------------
'----------------------------------- Public Sub ComboBox_Source() Dim Tblo As Variant
with Sheets("suivi") Tblo = .Range("D6:D" & f.Range("D65536").End(xlUp).Row) ' tableau (n,1) Call QuickSort Tblo, 1, LBound(Tblo, 1), UBound(Tblo, 1) .ComboBox1.List = Tblo End With
End Sub '-----------------------------------
isabelle
bonjour Denis,
il y a un message d'erreur sur la ligne
Case 52: If .HasVBProject Then
je pense que c'est du au déplacement du code ÉcrireCode
Pour '------------------------ With Destwb ÉcrireCode Destwb, .Worksheets(1).CodeName 'Ajouter .SaveAs TempFilePath & TempFileName & FileExtStr, FileFormat:=FileFormatNum
'.../le reste du code...
MichD
Écrit de cette manière, cela ne génère pas d'erreur
Dans le code original, cette ligne Select Case .FileFormat est écrite de cette manìere : Select Case Sourcewb.FileFormat
Je ne peux pas deviner quel classeur l'auteur a en tête!!!
'--------------------------------------------- With Destwb If Val(Application.Version) < 12 Then 'You use Excel 97-2003 FileExtStr = ".xls": FileFormatNum = -4143 Else 'You use Excel 2007-2013 Select Case .FileFormat Case 51: FileExtStr = ".xlsx": FileFormatNum = 51 Case 52: If .HasVBProject Then FileExtStr = ".xlsm": FileFormatNum = 52 Else FileExtStr = ".xlsx": FileFormatNum = 51 End If Case 56: FileExtStr = ".xls": FileFormatNum = 56 Case Else: FileExtStr = ".xlsb": FileFormatNum = 50 End Select End If End With '---------------------------------------------
Écrit de cette manière, cela ne génère pas d'erreur
Dans le code original, cette ligne Select Case .FileFormat
est écrite de cette manìere : Select Case Sourcewb.FileFormat
Je ne peux pas deviner quel classeur l'auteur a en tête!!!
'---------------------------------------------
With Destwb
If Val(Application.Version) < 12 Then
'You use Excel 97-2003
FileExtStr = ".xls": FileFormatNum = -4143
Else
'You use Excel 2007-2013
Select Case .FileFormat
Case 51: FileExtStr = ".xlsx": FileFormatNum = 51
Case 52:
If .HasVBProject Then
FileExtStr = ".xlsm": FileFormatNum = 52
Else
FileExtStr = ".xlsx": FileFormatNum = 51
End If
Case 56: FileExtStr = ".xls": FileFormatNum = 56
Case Else: FileExtStr = ".xlsb": FileFormatNum = 50
End Select
End If
End With
'---------------------------------------------
Écrit de cette manière, cela ne génère pas d'erreur
Dans le code original, cette ligne Select Case .FileFormat est écrite de cette manìere : Select Case Sourcewb.FileFormat
Je ne peux pas deviner quel classeur l'auteur a en tête!!!
'--------------------------------------------- With Destwb If Val(Application.Version) < 12 Then 'You use Excel 97-2003 FileExtStr = ".xls": FileFormatNum = -4143 Else 'You use Excel 2007-2013 Select Case .FileFormat Case 51: FileExtStr = ".xlsx": FileFormatNum = 51 Case 52: If .HasVBProject Then FileExtStr = ".xlsm": FileFormatNum = 52 Else FileExtStr = ".xlsx": FileFormatNum = 51 End If Case 56: FileExtStr = ".xls": FileFormatNum = 56 Case Else: FileExtStr = ".xlsb": FileFormatNum = 50 End Select End If End With '---------------------------------------------
isabelle
c'est bon Denis, tout fonctionne correctement, un gros merci pour ton aide,
isabelle
Le 2014-05-10 15:51, MichD a écrit :
Écrit de cette manière, cela ne génère pas d'erreur
Dans le code original, cette ligne Select Case .FileFormat est écrite de cette manìere : Select Case Sourcewb.FileFormat
c'est bon Denis, tout fonctionne correctement,
un gros merci pour ton aide,
isabelle
Le 2014-05-10 15:51, MichD a écrit :
Écrit de cette manière, cela ne génère pas d'erreur
Dans le code original, cette ligne Select Case .FileFormat
est écrite de cette manìere : Select Case Sourcewb.FileFormat