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 !) :


Find, méthode


Recherche une information spécifique dans une plage et renvoie un objet Range qui représente la première cellule où cette information apparaît. Cette méthode renvoie la valeur Nothing si l'information n'est pas trouvée. N'affecte ni la sélection ni la cellule active.

Pour plus d'informations sur la fonction de feuille de calcul Find de Visual Basic, consultez Utilisation des fonctions de feuille de calcul dans Visual Basic.

Syntaxe

expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte)

expression Obligatoire. Expression qui renvoie un objet Range.

What Argument de type Variant obligatoire. L'élément à rechercher. Il peut s'agir d'une chaîne de caractères ou de tout autre type de données Microsoft Excel.

After Argument de type Variant facultatif. La cellule après laquelle vous souhaitez commencer la recherche. Cela correspond à la position de la cellule active lorsqu'une recherche est effectuée à partir de l'interface utilisateur. Notez que l'argument After doit désigner une seule cellule de la plage et que la recherche commence après cette cellule ; la recherche ne porte pas sur la cellule spécifiée avant que la méthode y revienne avoir exploré la totalité de la plage de recherche. Si vous ne spécifiez pas cet argument, la recherche commence après la cellule située dans le coin supérieur gauche de la plage.

LookIn Argument de type Variant facultatif. Il peut s'agir de l'une des constantes XlFindLookIn suivantes : xlFormulas, xlValues ou xlComments.

LookAt Argument de type Variant facultatif. Il peut s'agir de l'une des constantes XlLookAt suivantes : xlPart ou xlWhole.

SearchOrder Argument de type Variant facultatif. Il peut s'agir de l'une des constantes XlSearchOrder suivantes : xlByColumns ou xlByRows.

SearchDirection Argument de type Variant facultatif. Il peut s'agir de l'une des constantes XlSearchDirection suivantes : xlNext ou xlPrevious. La constante par défaut est xlNext.

MatchCase Argument de type Variant facultatif. Affectez-lui la valeur True pour que la recherche respecte la casse. La valeur par défaut est False.

MatchByte Argument de type Variant facultatif. Cet argument est utilisé uniquement si vous avez sélectionné ou installé la prise en charge des langues codées sur deux octets. Affectez-lui la valeur True pour que les caractères codés sur deux octets correspondent uniquement à des caractères codés sur deux octets. Affectez-lui la valeur False pour que les caractères codés sur deux octets correspondent à leurs équivalents codés sur un octet.

Remarques

Les paramètres des arguments LookIn, LookAt, SearchOrder et MatchByte sont enregistrés chaque fois que vous utilisez cette méthode. Si vous ne spécifiez aucun paramètre pour ces arguments lors du prochain appel de la méthode, les paramètres enregistrés sont utilisés. Le fait de définir les paramètres de ces arguments modifie les paramètres de la boîte de dialogue Rechercher, ce qui a pour effet de changer les paramètres enregistrés qui sont utilisés lorsque vous ne spécifiez pas les arguments. Pour éviter toute ambiguïté, définissez ces arguments de façon explicite chaque fois que vous utilisez cette méthode.

Les méthodes FindNext et FindPrevious permettent de répéter la recherche.

Lorsque la recherche atteint la fin de la plage de recherche spécifiée, elle revient au début de cette plage. Pour arrêter une recherche lorsqu'elle revient au point de départ, enregistrez l'adresse de la première cellule trouvée, puis comparez l'adresse de chaque cellule ultérieurement trouvée avec l'adresse enregistrée.

Pour effectuer des recherches plus complexes, utilisez une instruction For Each...Next avec l'opérateur Like. Par exemple, l'exemple de code suivant montre comment rechercher toutes les cellules de la plage A1:C5 qui utilisent une police dont le nom commence par les lettres « Cour ». Lorsque Microsoft Excel trouve une cellule correspondante, il lui affecte la police Times New Roman.

For Each c In [A1:C5]
If c.Font.Name Like 'Cour*' Then
c.Font.Name = 'Times New Roman'
End If
Next
 
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
Retour