Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

exécuter une macro (Public Sub) situer dans un module de classe

8 réponses
Avatar
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.

merci de vos lumières!
isabelle

8 réponses

Avatar
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.

Je suis à l'extérieur pour la matinée.

MichD
---------------------------------------------------------------
Avatar
isabelle
merci Denis!, le voici : http://cjoint.com/?DEkrcSXPVxP

Le 2014-05-10 06:16, MichD a écrit :
Bonjour Isabelle,

J'ai un peu de difficulté à saisir la structure de ton code...

Peux-tu publier ton fichier pour le code,
Avatar
MichD
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

End Sub
'-----------------------------------
Avatar
MichD
OUPS, dans le code de la procédure du module1

Modifie ceci :
'------------------------
With Destwb
.SaveAs TempFilePath & TempFileName & FileExtStr,
FileFormat:=FileFormatNum

'--------------
ÉcrireCode Destwb, .Worksheets(1).CodeName 'Ajouter
.Save
'--------------
'------------------------

Pour
'------------------------
With Destwb
ÉcrireCode Destwb, .Worksheets(1).CodeName 'Ajouter
.SaveAs TempFilePath & TempFileName & FileExtStr,
FileFormat:=FileFormatNum

'.../le reste du code...
Avatar
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
'-----------------------------------
Avatar
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

isabelle

Le 2014-05-10 13:38, MichD a écrit :
OUPS, dans le code de la procédure du module1

Modifie ceci :
'------------------------
With Destwb
.SaveAs TempFilePath & TempFileName & FileExtStr, FileFormat:=FileFormatNum

'--------------
ÉcrireCode Destwb, .Worksheets(1).CodeName 'Ajouter
.Save
'--------------
'------------------------

Pour
'------------------------
With Destwb
ÉcrireCode Destwb, .Worksheets(1).CodeName 'Ajouter
.SaveAs TempFilePath & TempFileName & FileExtStr, FileFormat:=FileFormatNum

'.../le reste du code...
Avatar
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
'---------------------------------------------
Avatar
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