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   -
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

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  2. jen_peplu Messages postés 33 Date d'inscription   Statut Membre Dernière intervention  
     
    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
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  4. jen_peplu Messages postés 33 Date d'inscription   Statut Membre Dernière intervention  
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jen_peplu Messages postés 33 Date d'inscription   Statut Membre Dernière intervention  
     
    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
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      !!!!!
      Abandon du suivi...
      0
  7. jen_peplu Messages postés 33 Date d'inscription   Statut Membre Dernière intervention  
     
    Merci pour tout, désolé si je t'ai ennuyé.

    Cordialement
    0
  8. nicocorico Messages postés 846 Statut Membre 138
     
    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
  9. jen_peplu Messages postés 33 Date d'inscription   Statut Membre Dernière intervention  
     
    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