Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

pourquoi ça marche pas

  • Initiateur de la discussion Initiateur de la discussion marie
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

M

marie

Guest
voici le code que j'ai mis

Option Explicit
Sub Macro1()
'
' Macro1 Macro
' Macro enregistrée le 23/06/2005 par FCI
'
Workbooks.Open ('G:\\COMPTA2005\\Transports\\Détail factures TNT 2005')
Application.ScreenUpdating = False
Dim X, Y, Z As Integer
For X = 1 To 65536
If Worksheets('Détail').Cells(X, 1) = '29905' Then
Z = Workbooks('TNT.xls').Worksheets('Feuil2').Range('A65536').End(xlUp).Row
For Y = 1 To 30
Workbooks('TNT.xls').Worksheets('Feuil2').Cells(Z, Y) = Workbooks('Détail factures TNT 2005').Worksheets('Détail').Cells(X, Y) Next
End If
Next
Application.ScreenUpdating = True
ActiveWindow.Close
End Sub


Ce qui est rouge j'ai erreur du type 9 il me dise d'utiliser for each next mais je sais pas comment faire


Merci
 
Bonjour

D'abord on dit Bonjour 'Petite Marie' (tien ça me rappelle une chanson B) )

Option Explicit
Sub Macro1()
'
' Macro1 Macro
' Macro enregistrée le 23/06/2005 par FCI
'
Workbooks.Open ('G:COMPTA2005TransportsDétail factures TNT 2005')
Application.ScreenUpdating = False
Dim X as Long, Yas byte, Z As Integer '<=== il faut declarer les variables comme ceci sinon elles sont variant mais l'erruer n'est pas là
For X = 1 To 65536
If Worksheets('Détail').Cells(X, 1) = '29905' Then
Z = Workbooks('TNT.xls').Worksheets('Feuil2').Range('A65536').End(xlUp).Row
For Y = 1 To 30
Workbooks(\\'TNT.xls\\').Worksheets(\\'Feuil2\\').Cells(Z, Y) = Workbooks(\\'Détail factures TNT
2005\\').Worksheets(\\'Détail\\').Cells(X, Y)
Next '<==== A LA ligne le NEXT
End If
Next
Application.ScreenUpdating = True
ActiveWindow.Close
End Sub

Bon courage

Message édité par: Pascal76, à: 23/06/2005 10:57

Message édité par: Pascal76, à: 23/06/2005 11:01
 
Re

Modifies cette ligne déjà

For X = 1 To 65536

par

For x = 1 to Workbooks('Détail factures TNT
2005').Worksheets('Détail').range('A65536').end(xlup).row

Car là tu boucles sur tes 65536 lignes

ensuite pour vraiment aller plus vite il faut passer par des tableaux variables
 
Bonjour Marie, Pascal, bonjour le forum,

Toujours en retard car Pascal en plus d'être bon il est rapide. Mais je viens quand même le titiller un peu...
En principe, déclarer la variable Z comme Integer est suffisant dans la grande majorité des classeurs qui atteignent rarement la ligne 32 768 (qui provoquerait un bug car la limite Integer est 32 767). Donc, si ça rebugue, ça peut venir de la. Modifier Dim Z as Integer par Dim Z as Long...
Pour être plus clair dans la lecture du code j'aurais aussi rajouter Z au Next que Pascal t'a demandé de mettre à la ligne : Next Z. Pour la même raison le second Next plus bas, je l'aurais écrit : Next X

Maintenant Marie, j'imagine que ta macro est très longue à s'éxécuter car elle boucle sur 65536 cellules !!! Est-ce que tu cherches réellement toutes les cellules contenant la chaîne '29905' ou bien seulement la première ? Si c'est le cas un Exit For serait le bienvenu. Dans tous les cas je te recommanderais la methode Find à mon sens plus rapide qu'une boucle sur 65536 cellules.


Édition

Encore plus en retard que je pensais !!! Vous avez déjà corrigé...

Message édité par: Robert, à: 23/06/2005 11:56
 
bonjour à vous tous

trouvé sur la toile à propos de find


En VBA, la formule la plus élégante, et la plus efficace :
Columns(C:C).Find('*', [C1], , , , xlPrevious).Select va sélectionner la dernière cellule (réellement) non vide de la colonne C.
Elle utilise la fonction de recherche Find.
Dans la colonne C, on recherche la chaîne de caractères '*', c'est à n'importe quelle chaîne de caractères (* est un caractère joker qui peut représenter n'importe quel caractère ou groupe de caractères).
Et on recherche cette chaîne à partir de C1, première cellule de la colonne, en partant vers le haut (xlPrevious). Excel, à défaut de pouvoir chercher plus haut que C1, va balayer toutes les cellules à partir de C65536 en allant vers le haut, et donc trouver la dernière cellule occupée de la colonne.
On peut même se passer de la cellule de départ, Excel partant par défaut de la première :
Columns(3).Find('*', , , , , xlPrevious).Select (ne pas oublier les 5 virgules !).
Rows(2).Find('*', , , , , xlPrevious).Column donnera de même le numéro de colonne de la dernière cellule de la deuxième ligne,
Cells.Find('*', , , , , xlPrevious).Row le numéro de la dernière ligne non vide.
et Cells.Find('*', , , , xlByColumns, xlPrevious).Column le numéro de la dernière colonne non vide.

au code qui suit j'ajouterais .Value pcq value parfois????

Workbooks('TNT.xls').Worksheets('Feuil2').Cells(Z, Y) = Workbooks('Détail factures TNT
2005').Worksheets('Détail').Cells(X, Y).value

au revoir 😉
 
Bonjour le fil, bonjour le forum,

Marie, Find est l'équivalent VBA d'une recherche dans Excel. Tu sais avec [Ctrl]+[F] ou par le menu Edition/Rechercher. Plutôt que de faire une boucle sur d'innombrables cellules pour voir si elles contiennent une valeur, la méthode Find te renvoie l'adresse de la première cellule contenant cette valeur. Ci-dessous un copier/coller de l'aide VBA concernant cette méthode (attention c'est un peu long !) :


 
Re

Et bien Robert ça va pas ???

Faut faire attention à ton âge avec cette chaleur !!! 🙂 🙂 🙂

Pour Marie si tu vaux aller plus vite :

soit tu utilises La méthode Find

soit tu passes par des tableaux variables

Bon courage

Message édité par: Pascal76, à: 23/06/2005 17:32
 
Bonjour

Voici ta macro modifiée

Tu devrais voir une différence en rapidité si je ne me suis pas trompé 😉

Sub Macro1()

Dim MonTableauSource As Variant
Dim MonTableauCible()
Dim MaLigne As Integer
Dim X As Integer, y As Integer, z As Byte

Workbooks.Open ('G:COMPTA2005TransportsDétail factures TNT 2005')

MaLigne = Worksheets('Détail').Range('A65536').End(xlUp).Row

y = 0
MonTableauSource = Worksheets('Détail').Range(Cells(1, 1), Cells(MaLigne, 30))
For X = 1 To MaLigne
If MonTableauSource(X, 1) = 29905 Then
y = y + 1
ReDim Preserve MonTableauCible(1 To 30, 1 To y)
For z = 1 To 30
MonTableauCible(z, y) = MonTableauSource(X, z)
Next
End If
Next

MaLigne = Workbooks('TNT.xls').Worksheets('Feuil2').Range('A65536').End(xlUp).Row + 1


Workbooks('TNT.xls').Worksheets('Feuil2').Range('a' & MaLigne).Resize(UBound(MonTableauCible, 2), UBound(MonTableauCible, 1)) = Application.Transpose(MonTableauCible)


ActiveWindow.Close

End Sub

Bonne journée

Message édité par: Pascal76, à: 24/06/2005 07:24
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
5
Affichages
904
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…