Besoin d'aide sur variable matricielle en vba
Résolu
jen_peplu
Messages postés
33
Date d'inscription
Statut
Membre
Dernière intervention
-
jen_peplu Messages postés 33 Date d'inscription Statut Membre Dernière intervention -
jen_peplu Messages postés 33 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je souhaite avec ce code, boucler sur deux tableaux, récupérer les valeurs de Tablo1 manquantes dans Tablo2, puis les ajouter dans Tablo3 pour ensuite les coller dans une plage d'une feuille excel.
Je boucle sur les Tablo1 et Tablo2, mais je n'arrive pas à insérer les valeurs dans Tablo3, par contre je les affiche bien dans la fenêtre exécution avec "Debug.Print = x".
C'est la première fois que je me sers des variables matricielles et là je bloque.
Pourriez-vous m'aider à écrire la ligne qui me manque, s'il vous plaît ?
Option Explicit
Option Base 1
Sub Tableau()
Dim Tablo1, Tablo2, Tablo3
Dim bol As Boolean
Dim Adr, Par As Worksheet
Dim I, J As Byte
Dim derligneAdr As Byte
Dim derlignePar As Byte
Dim x As Variant
Set Adr = Sheets("ADRESSE")
Set Par = Sheets("Param")
derligneAdr = Adr.Range("A300").End(xlUp).Row
derlignePar = Par.Range("D300").End(xlUp).Row
Tablo1 = Adr.Range("A1:A" & derligneAdr)
Tablo2 = Par.Range("D2:D" & derlignePar)
For I = 1 To UBound(Tablo1, 1)
For J = 1 To UBound(Tablo2, 1)
If Tablo1(I, 1) = Tablo2(J, 1) Then bol = True
Next J
If bol = False Then
Stop
If Tablo3 <> "" Then ReDim Preserve Tablo3(UBound(Tablo3) + 1)
'Tablo3(UBound(Tablo3)) = Tablo1(I, 1) ??????????????
x = Tablo1(I, 1)
Debug.Print x
End If
bol = False
Next I
Erase Tablo1
Erase Tablo2
Erase Tablo3
Set Adr = Nothing
Set Par = Nothing
End Sub
Cordialement
jen_peplu
Je souhaite avec ce code, boucler sur deux tableaux, récupérer les valeurs de Tablo1 manquantes dans Tablo2, puis les ajouter dans Tablo3 pour ensuite les coller dans une plage d'une feuille excel.
Je boucle sur les Tablo1 et Tablo2, mais je n'arrive pas à insérer les valeurs dans Tablo3, par contre je les affiche bien dans la fenêtre exécution avec "Debug.Print = x".
C'est la première fois que je me sers des variables matricielles et là je bloque.
Pourriez-vous m'aider à écrire la ligne qui me manque, s'il vous plaît ?
Option Explicit
Option Base 1
Sub Tableau()
Dim Tablo1, Tablo2, Tablo3
Dim bol As Boolean
Dim Adr, Par As Worksheet
Dim I, J As Byte
Dim derligneAdr As Byte
Dim derlignePar As Byte
Dim x As Variant
Set Adr = Sheets("ADRESSE")
Set Par = Sheets("Param")
derligneAdr = Adr.Range("A300").End(xlUp).Row
derlignePar = Par.Range("D300").End(xlUp).Row
Tablo1 = Adr.Range("A1:A" & derligneAdr)
Tablo2 = Par.Range("D2:D" & derlignePar)
For I = 1 To UBound(Tablo1, 1)
For J = 1 To UBound(Tablo2, 1)
If Tablo1(I, 1) = Tablo2(J, 1) Then bol = True
Next J
If bol = False Then
Stop
If Tablo3 <> "" Then ReDim Preserve Tablo3(UBound(Tablo3) + 1)
'Tablo3(UBound(Tablo3)) = Tablo1(I, 1) ??????????????
x = Tablo1(I, 1)
Debug.Print x
End If
bol = False
Next I
Erase Tablo1
Erase Tablo2
Erase Tablo3
Set Adr = Nothing
Set Par = Nothing
End Sub
Cordialement
jen_peplu
A voir également:
- Besoin d'aide sur variable matricielle en vba
- Incompatibilité de type vba ✓ - Forum Programmation
- Impossible de créer le fichier de travail. vérifiez la variable d'environnement temp ✓ - Forum Word
- Excel compter cellule couleur sans vba - Guide
- Msgbox vba variable ✓ - Forum VB / VBA
- Vba attendre 1 seconde ✓ - Forum VB / VBA
9 réponses
bonsoir,
quelques remarques:
"stop" n'est pas une instruction VBa
Dim Adr, Par As Worksheet
Dim I, J As Byte
Adr et I sont donc des variant
il faut écrire
Dim Adr as worksheet, Par As Worksheet
Dim I as byte, J As Byte
d'autre part tu cherche la dernière ligne non vide avant 300 donc i et J doivent être des integer (puisque 300>255)
instructions inutiles: la fin de la macro éteint les variables
Erase Tablo1
Erase Tablo2
Erase Tablo3
Set Adr = Nothing
Set Par = Nothing
-----
code proposé à adapter à ta structure
demo
https://www.cjoint.com/?3GkwfSYSksi
Michel
quelques remarques:
"stop" n'est pas une instruction VBa
Dim Adr, Par As Worksheet
Dim I, J As Byte
Adr et I sont donc des variant
il faut écrire
Dim Adr as worksheet, Par As Worksheet
Dim I as byte, J As Byte
d'autre part tu cherche la dernière ligne non vide avant 300 donc i et J doivent être des integer (puisque 300>255)
instructions inutiles: la fin de la macro éteint les variables
Erase Tablo1
Erase Tablo2
Erase Tablo3
Set Adr = Nothing
Set Par = Nothing
-----
code proposé à adapter à ta structure
Option Explicit Option Base 1 Sub regrouper() Dim Lig_fin As Integer, Cptr As Integer, Cptr_out As Integer, Ref As String 'type à adapter Dim Dico As Object Dim Tablo1, Tablo3 With Sheets(2) Lig_fin = .Columns(2).Find("*", .Range("B1"), , , , xlPrevious).Row Set Dico = CreateObject("scripting.dictionary") For Cptr = 1 To Lig_fin Ref = Cells(Cptr, "B") If Not Dico.exists(Ref) Then Dico.Add Ref, Ref End If Next End With With Sheets(1) Lig_fin = .Columns(1).Find("*", .Range("A1"), , , , xlPrevious).Row Tablo1 = Application.Transpose(.Range("A1:A" & Lig_fin).Value) ReDim Tablo3(1) For Cptr = 1 To UBound(Tablo1) Ref = .Cells(Cptr, "A") If Not Dico.exists(Ref) Then Cptr_out = Cptr_out + 1 ReDim Preserve Tablo3(Cptr_out) Tablo3(Cptr_out) = Tablo1(Cptr) End If Next End With Application.ScreenUpdating = False With Sheets(3) With .Range("C1").Resize(Cptr_out, 1) .Value = Application.Transpose(Tablo3) .Borders.Weight = xlThin End With .Activate End With End Sub
demo
https://www.cjoint.com/?3GkwfSYSksi
Michel
Bonsoir Michel
Merci d'avoir répondu à ma question, tu as dû t'en apercevoir, je suis un néophyte en programmation et je ne comprends pas tout dans tes lignes de codes, après avoir testé la démo, ce que tu me proposes ne fait pas exactement ce que je recherche.
Je boucle et prélève les valeurs manquantes de Tablo2, dans Tablo1.
Je souhaiterai coller ces valeurs dans Tablo3. Et ce, je n'arrive pas à le faire.
Si je fais "Debug.Print" je visualise ces valeurs dans la fenêtre exécution, jusque là cela marche.
Comment écrire pour coller dans Tablo3 les valeurs manquantes trouvées, et accessoirement les coller dans feuille1 colonne "A".
J'ai trouvé "Stop" sur un forum, et cela me permet d'arrêter la macro dessus quand elle a bouclé et trouvé une valeur, ça fonctionne.
Merci pour tes remarques, c'est toujours instructifs (j'en ai bien besoin).
Cordialement
Jen_peplu
Merci d'avoir répondu à ma question, tu as dû t'en apercevoir, je suis un néophyte en programmation et je ne comprends pas tout dans tes lignes de codes, après avoir testé la démo, ce que tu me proposes ne fait pas exactement ce que je recherche.
Je boucle et prélève les valeurs manquantes de Tablo2, dans Tablo1.
Je souhaiterai coller ces valeurs dans Tablo3. Et ce, je n'arrive pas à le faire.
Si je fais "Debug.Print" je visualise ces valeurs dans la fenêtre exécution, jusque là cela marche.
Comment écrire pour coller dans Tablo3 les valeurs manquantes trouvées, et accessoirement les coller dans feuille1 colonne "A".
J'ai trouvé "Stop" sur un forum, et cela me permet d'arrêter la macro dessus quand elle a bouclé et trouvé une valeur, ça fonctionne.
Merci pour tes remarques, c'est toujours instructifs (j'en ai bien besoin).
Cordialement
Jen_peplu
Bonjour
Tu avais écrit
Je souhaite avec ce code, boucler sur deux tableaux, récupérer les valeurs de Tablo1 manquantes dans Tablo2
--
et maintenant
Je boucle et prélève les valeurs manquantes de Tablo2, dans Tablo1.
??????????????
Stop:
ca existe effectivement mais c'est la 1° fois que je la vois depuis >10 ans de VBA...
elle ne sert a rien:pour arr^ter une macro en cours d'essai, tu as les points d'arr^t (F9) ou clic dans la bande vertical gauche de l'éditeur VBE sur la ligne voulue
de plus elle est dangereuse car il faut détruire une ligne de code avant la livraison.
maintenant, tu fais ce que tu veux...
????
Michel
Tu avais écrit
Je souhaite avec ce code, boucler sur deux tableaux, récupérer les valeurs de Tablo1 manquantes dans Tablo2
--
et maintenant
Je boucle et prélève les valeurs manquantes de Tablo2, dans Tablo1.
??????????????
Stop:
ca existe effectivement mais c'est la 1° fois que je la vois depuis >10 ans de VBA...
elle ne sert a rien:pour arr^ter une macro en cours d'essai, tu as les points d'arr^t (F9) ou clic dans la bande vertical gauche de l'éditeur VBE sur la ligne voulue
de plus elle est dangereuse car il faut détruire une ligne de code avant la livraison.
maintenant, tu fais ce que tu veux...
????
Michel
Bonsoir Michel,
Je suis arrivé à ce que je voulais éviter, semer la confusion, je m'en excuse.
Le fichier que tu m'as proposé ne fait pas ce que je souhaite.
Je ne souhaite pas fusionner les deux listes, après comparaison de Tablo1 et Tablo2, je veux stocker les valeurs qui se trouvent dans Tablo1 mais pas dans Tablo2 dans Tablo3 et accessoirement les coller dans une feuille.
Je mets le code modifié comme tu me l'as conseillé.
Option Explicit
Option Base 1
Sub Tableau()
Dim Tablo1, Tablo2, Tablo3
Dim I As Integer, J As Integer
Dim bol As Boolean
Dim Adr As Worksheet, Par As Worksheet
Dim derligneAdr As Integer
Dim derlignePar As Integer
Set Adr = Sheets("ADRESSE")
Set Par = Sheets("Param")
derligneAdr = Adr.Range("A300").End(xlUp).Row
derlignePar = Par.Range("D300").End(xlUp).Row
Tablo1 = Adr.Range("A1:A" & derligneAdr)
Tablo2 = Par.Range("D2:D" & derlignePar)
For I = 1 To UBound(Tablo1, 1)
For J = 1 To UBound(Tablo2, 1)
If Tablo1(I, 1) = Tablo2(J, 1) Then bol = True
Next J
If bol = False Then 'jusque là ça fonctionne.
If Tablo3 <> "" Then ReDim Preserve Tablo3(UBound(Tablo3) + 1) 'il y a peut-être une erreur sur cette ligne ?
Tablo3(UBound(Tablo3)) = Tablo1(I, 1) '??????????????????? c'est là que je n'arrive pas à écrire dans le Tablo3 les valeurs du Tablo1 manquantes dans Tablo2
End If
bol = False
Next I
End Sub
Encore mille excuses pour la confusion engendrée, j'espère avoir été plus clair cette fois et merci pour tes conseils et ta patience.
Cordialement
Jen_peplu
Je suis arrivé à ce que je voulais éviter, semer la confusion, je m'en excuse.
Le fichier que tu m'as proposé ne fait pas ce que je souhaite.
Je ne souhaite pas fusionner les deux listes, après comparaison de Tablo1 et Tablo2, je veux stocker les valeurs qui se trouvent dans Tablo1 mais pas dans Tablo2 dans Tablo3 et accessoirement les coller dans une feuille.
Je mets le code modifié comme tu me l'as conseillé.
Option Explicit
Option Base 1
Sub Tableau()
Dim Tablo1, Tablo2, Tablo3
Dim I As Integer, J As Integer
Dim bol As Boolean
Dim Adr As Worksheet, Par As Worksheet
Dim derligneAdr As Integer
Dim derlignePar As Integer
Set Adr = Sheets("ADRESSE")
Set Par = Sheets("Param")
derligneAdr = Adr.Range("A300").End(xlUp).Row
derlignePar = Par.Range("D300").End(xlUp).Row
Tablo1 = Adr.Range("A1:A" & derligneAdr)
Tablo2 = Par.Range("D2:D" & derlignePar)
For I = 1 To UBound(Tablo1, 1)
For J = 1 To UBound(Tablo2, 1)
If Tablo1(I, 1) = Tablo2(J, 1) Then bol = True
Next J
If bol = False Then 'jusque là ça fonctionne.
If Tablo3 <> "" Then ReDim Preserve Tablo3(UBound(Tablo3) + 1) 'il y a peut-être une erreur sur cette ligne ?
Tablo3(UBound(Tablo3)) = Tablo1(I, 1) '??????????????????? c'est là que je n'arrive pas à écrire dans le Tablo3 les valeurs du Tablo1 manquantes dans Tablo2
End If
bol = False
Next I
End Sub
Encore mille excuses pour la confusion engendrée, j'espère avoir été plus clair cette fois et merci pour tes conseils et ta patience.
Cordialement
Jen_peplu
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
il manquait 1 point devant un cells....
https://www.cjoint.com/?3GniD2WazJN
le dictionary permet de résoudre le pb en 2 boucles mais tu sembles vouloir garder tablo2 et boucler (derligneAdr x derlignePar) fois
comme tu veux....
pour progresser
https://bidou.developpez.com/article/VBA/
Michel
il manquait 1 point devant un cells....
https://www.cjoint.com/?3GniD2WazJN
le dictionary permet de résoudre le pb en 2 boucles mais tu sembles vouloir garder tablo2 et boucler (derligneAdr x derlignePar) fois
comme tu veux....
pour progresser
https://bidou.developpez.com/article/VBA/
Michel
Bonjour Michel
Apparemment, je suis dans l'erreur en persistant dans ma voie. Pouquoi ?
Dans ".Find("*", .Range" que veut dire "*" ?
Merci pour le lien, maintenant, je vais décoder ton code pour coder le mien mais il y a des choses que je n'ai jamais utilisé, comme "CreateObject", il faut un début à tout et je n'en suis toujours qu'au début, au besoin je reviendrai.
Cordialement
Jen_peplu
Apparemment, je suis dans l'erreur en persistant dans ma voie. Pouquoi ?
Dans ".Find("*", .Range" que veut dire "*" ?
Merci pour le lien, maintenant, je vais décoder ton code pour coder le mien mais il y a des choses que je n'ai jamais utilisé, comme "CreateObject", il faut un début à tout et je n'en suis toujours qu'au début, au besoin je reviendrai.
Cordialement
Jen_peplu
T'inquiètes quand on débute c'est jamais facile, et c'est pas toujours évident non plus de garder patience quand on conseille, et il faut que tu prennes bien le temps d'apprendre par toi-même, de rechercher, de réfléchir... Buter sur un problème pendant des jours, c'est parfois désespérant mais c'est là qu'on apprend le plus!
alors bon courage...
alors bon courage...
Le chêne aussi était un gland, avant d'être un chêne