Besoin d'aide sur variable matricielle en vba

Résolu/Fermé
jen_peplu Messages postés 33 Date d'inscription samedi 4 décembre 2010 Statut Membre Dernière intervention 25 mars 2012 - 10 juil. 2011 à 18:52
jen_peplu Messages postés 33 Date d'inscription samedi 4 décembre 2010 Statut Membre Dernière intervention 25 mars 2012 - 15 juil. 2011 à 08:03
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


9 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 10/07/2011 à 22:11
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

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
0
jen_peplu Messages postés 33 Date d'inscription samedi 4 décembre 2010 Statut Membre Dernière intervention 25 mars 2012
11 juil. 2011 à 20:35
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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 12/07/2011 à 08:28
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
0
jen_peplu Messages postés 33 Date d'inscription samedi 4 décembre 2010 Statut Membre Dernière intervention 25 mars 2012
12 juil. 2011 à 20:17
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 13/07/2011 à 08:40
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
0
jen_peplu Messages postés 33 Date d'inscription samedi 4 décembre 2010 Statut Membre Dernière intervention 25 mars 2012
14 juil. 2011 à 06:34
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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 14/07/2011 à 08:09
!!!!!
Abandon du suivi...
0
jen_peplu Messages postés 33 Date d'inscription samedi 4 décembre 2010 Statut Membre Dernière intervention 25 mars 2012
14 juil. 2011 à 18:13
Merci pour tout, désolé si je t'ai ennuyé.

Cordialement
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
14 juil. 2011 à 19:58
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...

Le chêne aussi était un gland, avant d'être un chêne
0
jen_peplu Messages postés 33 Date d'inscription samedi 4 décembre 2010 Statut Membre Dernière intervention 25 mars 2012
15 juil. 2011 à 08:03
Bonjour
Je le conçois très bien, vous êtes là gracieusement pour nous aider et je comprends qu'au bout d'un moment l'on puisse vous paraître pénible. Mais le plus
frustrant, ce sont les réponses que je ne comprends pas.

Bonne journée
0