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

simplifier ou accelerer la macro !!!

6 réponses
Avatar
DOS SANTOS JOAQUIM
Salut le forum,

Après quelques nuits blanches, j'ai enfin réussi à pondre une macro qui me
copie les valeurs d'une colonne en comparrant les codes de 2 classeurs
distincts.

Mais le probléme est que la macro m'affiche un résulat au bout de 30 ou 50
econde suivant le fichier PControl

Comment faire pour simplifier ou accélérer la macro

A+ le forum

la macro:

Sub gestion()
'
' gestion Macro
' Macro enregistrée le 21/07/2005 par DOS SANTOS Joaquim
'
' Touche de raccourci du clavier: Ctrl+m
'
Application.Goto Reference:="gestion"

'Déclaration des variables globales
Dim app2Excel As Excel.Application 'Application Excel
Dim Pcontrol As Excel.Workbook 'Classeur Excel
Dim PcontrolSheet As Excel.Worksheet 'Feuille Excel
Dim Plagecodecommand As Range
Dim PlagecodePcontrol As Range
Dim PlageventePcontrol As Range
Dim Plageventecommand As Range

'Ouverture de l'application
Set app2Excel = CreateObject("Excel.Application")
'Ouverture d'un fichier Excel
Set Pcontrol = app2Excel.Workbooks.Open("C:\Documents and
Settings\Zimour.TOSMONOTE\Bureau\marge\PControl.xls")
'PcontrolShhet correspond à la première feuille du fichier Pcontrol.xls
Set PcontrolSheet = Pcontrol.Worksheets(1)
Set Sheet = ActiveWorkbook.ActiveSheet

'Plagecode définit les plages contentant les codes des marchandises dans les
2 feuilles de calcul
Set Plagecodecommand = ActiveSheet.Range("C11:C443")
Set Plageventecommand = ActiveSheet.Range("I11:I443")
Set PlagecodePcontrol = PcontrolSheet.Range("A10:A327")
Set PlageventePcontrol = PcontrolSheet.Range("G10:G327")

'Déclaration des variables locales

Dim ii As Integer
Dim jj As Integer
Dim Vente As Single
Dim codePcourant As Integer
Dim codeCcourant As Integer
Dim indicecodePcontrol As Integer
Dim longueur As Integer


For ii = 1 To 432
codeCcourant = Plagecodecommand(ii)
For jj = 1 To 317
codePcourant = PlagecodePcontrol(jj)
If codeCcourant = codePcourant Then Plageventecommand(ii) =
PlageventePcontrol(jj)



Next jj
Next ii
Pcontrol.Close
End Sub

6 réponses

Avatar
Patrick BASTARD
Bonjour, *DOS SANTOS JOAQUIM*

Cela fait près de 137 000 boucles...
30 secondes, c'est vite passé, non ?


--
Bien amicordialement,
P. Bastard



Salut le forum,

Après quelques nuits blanches, j'ai enfin réussi à pondre une macro
qui me copie les valeurs d'une colonne en comparrant les codes de 2
classeurs distincts.

Mais le probléme est que la macro m'affiche un résulat au bout de 30
ou 50 econde suivant le fichier PControl

Comment faire pour simplifier ou accélérer la macro

A+ le forum

la macro:

Sub gestion()
'
' gestion Macro
' Macro enregistrée le 21/07/2005 par DOS SANTOS Joaquim
'
' Touche de raccourci du clavier: Ctrl+m
'
Application.Goto Reference:="gestion"

'Déclaration des variables globales
Dim app2Excel As Excel.Application 'Application Excel
Dim Pcontrol As Excel.Workbook 'Classeur Excel
Dim PcontrolSheet As Excel.Worksheet 'Feuille Excel
Dim Plagecodecommand As Range
Dim PlagecodePcontrol As Range
Dim PlageventePcontrol As Range
Dim Plageventecommand As Range

'Ouverture de l'application
Set app2Excel = CreateObject("Excel.Application")
'Ouverture d'un fichier Excel
Set Pcontrol = app2Excel.Workbooks.Open("C:Documents and
SettingsZimour.TOSMONOTEBureaumargePControl.xls")
'PcontrolShhet correspond à la première feuille du fichier
Pcontrol.xls
Set PcontrolSheet = Pcontrol.Worksheets(1)
Set Sheet = ActiveWorkbook.ActiveSheet

'Plagecode définit les plages contentant les codes des marchandises
dans les 2 feuilles de calcul
Set Plagecodecommand = ActiveSheet.Range("C11:C443")
Set Plageventecommand = ActiveSheet.Range("I11:I443")
Set PlagecodePcontrol = PcontrolSheet.Range("A10:A327")
Set PlageventePcontrol = PcontrolSheet.Range("G10:G327")

'Déclaration des variables locales

Dim ii As Integer
Dim jj As Integer
Dim Vente As Single
Dim codePcourant As Integer
Dim codeCcourant As Integer
Dim indicecodePcontrol As Integer
Dim longueur As Integer


For ii = 1 To 432
codeCcourant = Plagecodecommand(ii)
For jj = 1 To 317
codePcourant = PlagecodePcontrol(jj)
If codeCcourant = codePcourant Then Plageventecommand(ii) > PlageventePcontrol(jj)



Next jj
Next ii
Pcontrol.Close
End Sub


Avatar
DOS SANTOS JOAQUIM
Salut,

As-tu une idée pour simplifier la macro?


Bonjour, *DOS SANTOS JOAQUIM*

Cela fait près de 137 000 boucles...
30 secondes, c'est vite passé, non ?


--
Bien amicordialement,
P. Bastard



Salut le forum,

Après quelques nuits blanches, j'ai enfin réussi à pondre une macro
qui me copie les valeurs d'une colonne en comparrant les codes de 2
classeurs distincts.

Mais le probléme est que la macro m'affiche un résulat au bout de 30
ou 50 econde suivant le fichier PControl

Comment faire pour simplifier ou accélérer la macro

A+ le forum

la macro:

Sub gestion()
'
' gestion Macro
' Macro enregistrée le 21/07/2005 par DOS SANTOS Joaquim
'
' Touche de raccourci du clavier: Ctrl+m
'
Application.Goto Reference:="gestion"

'Déclaration des variables globales
Dim app2Excel As Excel.Application 'Application Excel
Dim Pcontrol As Excel.Workbook 'Classeur Excel
Dim PcontrolSheet As Excel.Worksheet 'Feuille Excel
Dim Plagecodecommand As Range
Dim PlagecodePcontrol As Range
Dim PlageventePcontrol As Range
Dim Plageventecommand As Range

'Ouverture de l'application
Set app2Excel = CreateObject("Excel.Application")
'Ouverture d'un fichier Excel
Set Pcontrol = app2Excel.Workbooks.Open("C:Documents and
SettingsZimour.TOSMONOTEBureaumargePControl.xls")
'PcontrolShhet correspond à la première feuille du fichier
Pcontrol.xls
Set PcontrolSheet = Pcontrol.Worksheets(1)
Set Sheet = ActiveWorkbook.ActiveSheet

'Plagecode définit les plages contentant les codes des marchandises
dans les 2 feuilles de calcul
Set Plagecodecommand = ActiveSheet.Range("C11:C443")
Set Plageventecommand = ActiveSheet.Range("I11:I443")
Set PlagecodePcontrol = PcontrolSheet.Range("A10:A327")
Set PlageventePcontrol = PcontrolSheet.Range("G10:G327")

'Déclaration des variables locales

Dim ii As Integer
Dim jj As Integer
Dim Vente As Single
Dim codePcourant As Integer
Dim codeCcourant As Integer
Dim indicecodePcontrol As Integer
Dim longueur As Integer


For ii = 1 To 432
codeCcourant = Plagecodecommand(ii)
For jj = 1 To 317
codePcourant = PlagecodePcontrol(jj)
If codeCcourant = codePcourant Then Plageventecommand(ii) > > PlageventePcontrol(jj)



Next jj
Next ii
Pcontrol.Close
End Sub







Avatar
MPi
Salut,

Tu pourrais essayer avec la fonction Find qui est assez rapide.
Bien sûr, il te faut faire au moins une boucle. À toi de savoir si tu peux
la faire à l'inverse et utiliser celle qui a 317 lignes.

Ça donnerait quelque chose comme ceci. Il ne reste qu'à modifier les noms
des classeurs 2 et 3 et adapter au besoin.

Avec les mêmes chiffres comme code dans les 2 fichiers (pour être certain
qu'ils soient trouvés), ça prend 1 ou 2 secondes pour terminer, du moins ici
avec un Celeron 1.7 mghz /512 megs de RAM

Sub gestion()
'Déclaration des variables globales
Dim Plagecodecommand As Range
Dim Plageventecommand As Range
Dim ii As Integer
Dim Recherche, Adresse

'Plagecode définit les plages contentant les codes des marchandises dans
les 2 feuilles de calcul
Set Plagecodecommand =
Workbooks("Classeur2").ActiveSheet.Range("C11:C443")
Set Plageventecommand =
Workbooks("Classeur2").ActiveSheet.Range("I11:I443")

For ii = 1 To 432
Set Recherche =
Workbooks("Classeur3").ActiveSheet.Range("A10:A327").Find(Plagecodecommand(ii))
If Not Recherche Is Nothing Then
Adresse= Recherche.Address ' Ici c'est l'adresse du code trouvé
If Plagecodecommand(ii) =
Workbooks("Classeur3").ActiveSheet.Range(Adresse) Then
Plagecodecommand(ii).Offset(0, 6) =
Workbooks("Classeur3").ActiveSheet.Range(Adresse).Offset(0, 7)
End If
End If
Next

MsgBox "Terminé"
End Sub

Michel


Salut le forum,

Après quelques nuits blanches, j'ai enfin réussi à pondre une macro qui me
copie les valeurs d'une colonne en comparrant les codes de 2 classeurs
distincts.

Mais le probléme est que la macro m'affiche un résulat au bout de 30 ou 50
econde suivant le fichier PControl

Comment faire pour simplifier ou accélérer la macro

A+ le forum

la macro:

Sub gestion()
'
' gestion Macro
' Macro enregistrée le 21/07/2005 par DOS SANTOS Joaquim
'
' Touche de raccourci du clavier: Ctrl+m
'
Application.Goto Reference:="gestion"

'Déclaration des variables globales
Dim app2Excel As Excel.Application 'Application Excel
Dim Pcontrol As Excel.Workbook 'Classeur Excel
Dim PcontrolSheet As Excel.Worksheet 'Feuille Excel
Dim Plagecodecommand As Range
Dim PlagecodePcontrol As Range
Dim PlageventePcontrol As Range
Dim Plageventecommand As Range

'Ouverture de l'application
Set app2Excel = CreateObject("Excel.Application")
'Ouverture d'un fichier Excel
Set Pcontrol = app2Excel.Workbooks.Open("C:Documents and
SettingsZimour.TOSMONOTEBureaumargePControl.xls")
'PcontrolShhet correspond à la première feuille du fichier Pcontrol.xls
Set PcontrolSheet = Pcontrol.Worksheets(1)
Set Sheet = ActiveWorkbook.ActiveSheet

'Plagecode définit les plages contentant les codes des marchandises dans les
2 feuilles de calcul
Set Plagecodecommand = ActiveSheet.Range("C11:C443")
Set Plageventecommand = ActiveSheet.Range("I11:I443")
Set PlagecodePcontrol = PcontrolSheet.Range("A10:A327")
Set PlageventePcontrol = PcontrolSheet.Range("G10:G327")

'Déclaration des variables locales

Dim ii As Integer
Dim jj As Integer
Dim Vente As Single
Dim codePcourant As Integer
Dim codeCcourant As Integer
Dim indicecodePcontrol As Integer
Dim longueur As Integer


For ii = 1 To 432
codeCcourant = Plagecodecommand(ii)
For jj = 1 To 317
codePcourant = PlagecodePcontrol(jj)
If codeCcourant = codePcourant Then Plageventecommand(ii) =
PlageventePcontrol(jj)



Next jj
Next ii
Pcontrol.Close
End Sub



Avatar
DOS SANTOS JOAQUIM
Salut MPi,

L'idée est trés interressante.

mais lorsque je change une valeur dans le premier classeur, je ne l'a
retrouve pas dans le second classeur apres avoir lancé la macro
Pourquoi ?

"MPi" wrote:

Salut,

Tu pourrais essayer avec la fonction Find qui est assez rapide.
Bien sûr, il te faut faire au moins une boucle. À toi de savoir si tu peux
la faire à l'inverse et utiliser celle qui a 317 lignes.

Ça donnerait quelque chose comme ceci. Il ne reste qu'à modifier les noms
des classeurs 2 et 3 et adapter au besoin.

Avec les mêmes chiffres comme code dans les 2 fichiers (pour être certain
qu'ils soient trouvés), ça prend 1 ou 2 secondes pour terminer, du moins ici
avec un Celeron 1.7 mghz /512 megs de RAM

Sub gestion()
'Déclaration des variables globales
Dim Plagecodecommand As Range
Dim Plageventecommand As Range
Dim ii As Integer
Dim Recherche, Adresse

'Plagecode définit les plages contentant les codes des marchandises dans
les 2 feuilles de calcul
Set Plagecodecommand =
Workbooks("Classeur2").ActiveSheet.Range("C11:C443")
Set Plageventecommand =
Workbooks("Classeur2").ActiveSheet.Range("I11:I443")

For ii = 1 To 432
Set Recherche =
Workbooks("Classeur3").ActiveSheet.Range("A10:A327").Find(Plagecodecommand(ii))
If Not Recherche Is Nothing Then
Adresse= Recherche.Address ' Ici c'est l'adresse du code trouvé
If Plagecodecommand(ii) =
Workbooks("Classeur3").ActiveSheet.Range(Adresse) Then
Plagecodecommand(ii).Offset(0, 6) =
Workbooks("Classeur3").ActiveSheet.Range(Adresse).Offset(0, 7)
End If
End If
Next

MsgBox "Terminé"
End Sub

Michel


Salut le forum,

Après quelques nuits blanches, j'ai enfin réussi à pondre une macro qui me
copie les valeurs d'une colonne en comparrant les codes de 2 classeurs
distincts.

Mais le probléme est que la macro m'affiche un résulat au bout de 30 ou 50
econde suivant le fichier PControl

Comment faire pour simplifier ou accélérer la macro

A+ le forum

la macro:

Sub gestion()
'
' gestion Macro
' Macro enregistrée le 21/07/2005 par DOS SANTOS Joaquim
'
' Touche de raccourci du clavier: Ctrl+m
'
Application.Goto Reference:="gestion"

'Déclaration des variables globales
Dim app2Excel As Excel.Application 'Application Excel
Dim Pcontrol As Excel.Workbook 'Classeur Excel
Dim PcontrolSheet As Excel.Worksheet 'Feuille Excel
Dim Plagecodecommand As Range
Dim PlagecodePcontrol As Range
Dim PlageventePcontrol As Range
Dim Plageventecommand As Range

'Ouverture de l'application
Set app2Excel = CreateObject("Excel.Application")
'Ouverture d'un fichier Excel
Set Pcontrol = app2Excel.Workbooks.Open("C:Documents and
SettingsZimour.TOSMONOTEBureaumargePControl.xls")
'PcontrolShhet correspond à la première feuille du fichier Pcontrol.xls
Set PcontrolSheet = Pcontrol.Worksheets(1)
Set Sheet = ActiveWorkbook.ActiveSheet

'Plagecode définit les plages contentant les codes des marchandises dans les
2 feuilles de calcul
Set Plagecodecommand = ActiveSheet.Range("C11:C443")
Set Plageventecommand = ActiveSheet.Range("I11:I443")
Set PlagecodePcontrol = PcontrolSheet.Range("A10:A327")
Set PlageventePcontrol = PcontrolSheet.Range("G10:G327")

'Déclaration des variables locales

Dim ii As Integer
Dim jj As Integer
Dim Vente As Single
Dim codePcourant As Integer
Dim codeCcourant As Integer
Dim indicecodePcontrol As Integer
Dim longueur As Integer


For ii = 1 To 432
codeCcourant = Plagecodecommand(ii)
For jj = 1 To 317
codePcourant = PlagecodePcontrol(jj)
If codeCcourant = codePcourant Then Plageventecommand(ii) =
PlageventePcontrol(jj)



Next jj
Next ii
Pcontrol.Close
End Sub





Avatar
MPi
Salut,

Peut-être faudrait-il forcer la sélection de la cellule A1 juste avant la
boucle (?)
Il se pourrait qu'Excel refasse la recherche à partir du dernier endroit
vers la fin. Ou encore utiliser FindNext ou FindFirst

À tester...
Workbooks("Classeur3").ActiveSheet.Range("A1").Select
For ii = 1 To 432
...........

Michel


Salut MPi,

L'idée est trés interressante.

mais lorsque je change une valeur dans le premier classeur, je ne l'a
retrouve pas dans le second classeur apres avoir lancé la macro
Pourquoi ?

"MPi" wrote:

Salut,

Tu pourrais essayer avec la fonction Find qui est assez rapide.
Bien sûr, il te faut faire au moins une boucle. À toi de savoir si tu peux
la faire à l'inverse et utiliser celle qui a 317 lignes.

Ça donnerait quelque chose comme ceci. Il ne reste qu'à modifier les noms
des classeurs 2 et 3 et adapter au besoin.

Avec les mêmes chiffres comme code dans les 2 fichiers (pour être certain
qu'ils soient trouvés), ça prend 1 ou 2 secondes pour terminer, du moins ici
avec un Celeron 1.7 mghz /512 megs de RAM

Sub gestion()
'Déclaration des variables globales
Dim Plagecodecommand As Range
Dim Plageventecommand As Range
Dim ii As Integer
Dim Recherche, Adresse

'Plagecode définit les plages contentant les codes des marchandises dans
les 2 feuilles de calcul
Set Plagecodecommand =
Workbooks("Classeur2").ActiveSheet.Range("C11:C443")
Set Plageventecommand =
Workbooks("Classeur2").ActiveSheet.Range("I11:I443")

For ii = 1 To 432
Set Recherche =
Workbooks("Classeur3").ActiveSheet.Range("A10:A327").Find(Plagecodecommand(ii))
If Not Recherche Is Nothing Then
Adresse= Recherche.Address ' Ici c'est l'adresse du code trouvé
If Plagecodecommand(ii) =
Workbooks("Classeur3").ActiveSheet.Range(Adresse) Then
Plagecodecommand(ii).Offset(0, 6) =
Workbooks("Classeur3").ActiveSheet.Range(Adresse).Offset(0, 7)
End If
End If
Next

MsgBox "Terminé"
End Sub

Michel


Salut le forum,

Après quelques nuits blanches, j'ai enfin réussi à pondre une macro qui me
copie les valeurs d'une colonne en comparrant les codes de 2 classeurs
distincts.

Mais le probléme est que la macro m'affiche un résulat au bout de 30 ou 50
econde suivant le fichier PControl

Comment faire pour simplifier ou accélérer la macro

A+ le forum

la macro:

Sub gestion()
'
' gestion Macro
' Macro enregistrée le 21/07/2005 par DOS SANTOS Joaquim
'
' Touche de raccourci du clavier: Ctrl+m
'
Application.Goto Reference:="gestion"

'Déclaration des variables globales
Dim app2Excel As Excel.Application 'Application Excel
Dim Pcontrol As Excel.Workbook 'Classeur Excel
Dim PcontrolSheet As Excel.Worksheet 'Feuille Excel
Dim Plagecodecommand As Range
Dim PlagecodePcontrol As Range
Dim PlageventePcontrol As Range
Dim Plageventecommand As Range

'Ouverture de l'application
Set app2Excel = CreateObject("Excel.Application")
'Ouverture d'un fichier Excel
Set Pcontrol = app2Excel.Workbooks.Open("C:Documents and
SettingsZimour.TOSMONOTEBureaumargePControl.xls")
'PcontrolShhet correspond à la première feuille du fichier Pcontrol.xls
Set PcontrolSheet = Pcontrol.Worksheets(1)
Set Sheet = ActiveWorkbook.ActiveSheet

'Plagecode définit les plages contentant les codes des marchandises dans les
2 feuilles de calcul
Set Plagecodecommand = ActiveSheet.Range("C11:C443")
Set Plageventecommand = ActiveSheet.Range("I11:I443")
Set PlagecodePcontrol = PcontrolSheet.Range("A10:A327")
Set PlageventePcontrol = PcontrolSheet.Range("G10:G327")

'Déclaration des variables locales

Dim ii As Integer
Dim jj As Integer
Dim Vente As Single
Dim codePcourant As Integer
Dim codeCcourant As Integer
Dim indicecodePcontrol As Integer
Dim longueur As Integer


For ii = 1 To 432
codeCcourant = Plagecodecommand(ii)
For jj = 1 To 317
codePcourant = PlagecodePcontrol(jj)
If codeCcourant = codePcourant Then Plageventecommand(ii) =
PlageventePcontrol(jj)



Next jj
Next ii
Pcontrol.Close
End Sub







Avatar
abcd
si j'ai bien compris ce qaue tu fais, tu lis et écris plusieurs cell ules
à la suite. Pour cela il serait bien plus rapide de lire tout d'un c oup,
travailler sur un tableau, puis copier le résultat final d'un coup
également (si tu modifies plusieurs cellules).

Bref, ne pas travailler sur des cellules mais sur des tableaux en
mémoire. C'est énormément plus rapide.

http://xcell05.free.fr/pages/prog/accvba.htm#Excel