Probleme ùacro matricielle

Résolu
boomer11 Messages postés 39 Date d'inscription samedi 30 avril 2011 Statut Membre Dernière intervention 26 juin 2012 - 12 juil. 2011 à 18:58
boomer11 Messages postés 39 Date d'inscription samedi 30 avril 2011 Statut Membre Dernière intervention 26 juin 2012 - 16 juil. 2011 à 16:23
Bonjour,

J'ai 2 colonnes dans 2 feuilles différentes excel 2003
Je cherche à comparer les 2 colonnes,et en extraire les valeurs des cellules manquantes d'une colonne à l'autre et ainsi les transcrire dans une autre colonne directement par l'intermédiaire de la macro!

Ebauche:

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 zon As Range
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
 
  If Tablo3 <> "" Then ReDim Preserve Tablo3(UBound(Tablo3) + 1)

   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


Voilà si quelqu'un a une idée pour m'aiguiller?

Merci

11 réponses

boomer11 Messages postés 39 Date d'inscription samedi 30 avril 2011 Statut Membre Dernière intervention 26 juin 2012
14 juil. 2011 à 03:17
allez j'ai encore tout repris,

Sub Tableau()

Dim Tablo1, Tablo2, Tablo3, nb
Dim I As Integer, J As Integer
Dim bol As Boolean
Dim Adr As Worksheet, Par As Worksheet
Dim zon As Range
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)
ReDim Tablo3(1 To 1)

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
 nb = nb + 1
 ReDim Preserve Tablo3(1 To nb)
  Tablo3(nb) = Tablo1(I, 1)
   Debug.Print Tablo3(nb)
    End If
   bol = False
Next I
End Sub

maintenant je crois que tout fonctionne mais il me reste à faire apparaitre les resultats du tablo3 dans une msgbox, et là je coince

j'espere que cette fois je vais y arriver!!!
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 juil. 2011 à 07:45
Non :
Dim I, J As Integer ==>> I est typé en Variant (par défaut) et J en Integer
Dim I As Integer, J As Integer ==>> I et J sont typés en Integer

Si ton problème est résolu ===>> clique sur "Réponse acceptée" là où se trouve ta solution.

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 juil. 2011 à 19:41
Bonjour,
Où est ta ligne d'erreur, si tu en as une ?
Je ne comprends pas cette ligne :
If Tablo3 <> "" Then ReDim Preserve Tablo3(UBound(Tablo3) + 1)

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 juil. 2011 à 20:12
Bon...
1) - Quand on a un message d'erreur ===>> on le dit et on le précise ...
2) - Quand on développe et qu'on tombe sur une difficulté, le premier réflexe est normalement de l'isoler.
Voici, par exemple, une petite demo ===>> Un UserForm avec deux boutons de Commande Commandbutton1 et CommandButton2
Dans commandbutton1 : l'analogue de ton code (oublie donc tes cellules) ===>> Erreur, non ?
Dans Commandbutton2 : du logique ===>> Ah , ça marche ! Que lindo !

Private Sub Command1_Click()
   Dim tablo3
   If tablo3 <> "" Then ReDim Preserve tablo3(UBound(tablo3) + 1)
   tablo3(UBound(tablo3)) = 3
End Sub


Private Sub Command2_Click()
  ReDim tablo3(0)
  If tablo3(0) <> "" Then ReDim Preserve tablo3(UBound(tablo3) + 1)
  tablo3(UBound(tablo3)) = 3
  If tablo3(0) <> "" Then ReDim Preserve tablo3(UBound(tablo3) + 1)
  tablo3(UBound(tablo3)) = 4
  For I = 0 To UBound(tablo3)
    MsgBox tablo3(I)
  Next
End Sub


Ben =)==>> Essaye maintenant de comprendre pourquoi (pas difficile du tout).

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0

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

Posez votre question
boomer11 Messages postés 39 Date d'inscription samedi 30 avril 2011 Statut Membre Dernière intervention 26 juin 2012
12 juil. 2011 à 21:50
bonjour ucfoutu,

la ligne d'erreur est:
incompatibilité de type!
 Tablo3(UBound(Tablo3)) = Tablo1(I, 1)

Je ne comprends pas cette ligne :
Code Visual Basic :

If Tablo3 <> "" Then ReDim Preserve Tablo3(UBound(Tablo3) + 1)

En fait, il faut que le tableau 3 soit redimensionner avec les nouvelles valeurs reçues apres avoir boucler sur les 2 autres tableaux

j'essaie de voir ou tu veux en venir, et j'y travail

merci pour les reponses
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 juil. 2011 à 07:21
C'est la condition
If Tablo3 <> ""
qui ne risque (jamais) pas d'être vérifiée !
Puisque tu as au départ :
Dim Tablo1, Tablo2, Tablo3
*==>> donc tablo3 est une variable de type variant ===>> puis ton code va voir si elle contient une chaine non vide ===>> elle n'en contient pas ===>> ta variable tablo3 (qui n'est donc encore rien d'autre qu'un Variant et pas un tableau) ne se transforme pas par miracle en un tabeau redimensionné ===>> et ta ligne suivante, à savoir :
Tablo3(UBound(Tablo3)) = Tablo1(I, 1)

est alors surprenante et incompréhensible (pour VB surtout )
____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
boomer11 Messages postés 39 Date d'inscription samedi 30 avril 2011 Statut Membre Dernière intervention 26 juin 2012
13 juil. 2011 à 07:26
Bon, j'ai retravailler la macro

Sub Tableau()

Dim Tablo1, Tablo2, tablo3, tablo4
Dim i As Integer, j As Integer
Dim bol As Boolean
Dim Adr As Worksheet, Par As Worksheet
Dim zon As Range
Dim derligneAdr As Integer
Dim derlignePar As Integer
Dim x, y
Dim nb
x = 21
y = 21
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)
ReDim tablo3(1 To 1)
For i = 1 To UBound(Tablo1, 1)
 For j = 1 To UBound(Tablo2, 1)
 If Tablo1(i, 1) <> Tablo2(j, 1) Then
 nb = nb + 1
 ReDim Preserve tablo3(1 To nb)
  tablo3(nb) = Tablo1(i, 1)
   Debug.Print tablo3(nb)
 Exit For
 
  End If
 Next j
  
 x = x + 1
 Range("A" & x) = tablo3(nb)
  Next i
  
   ReDim tablo4(1 To 1)
For j = 1 To UBound(Tablo2, 1)
For i = 1 To UBound(Tablo1, 1)
 If Tablo2(j, 1) <> Tablo1(i, 1) Then
 nb = nb + 1
 ReDim Preserve tablo4(1 To nb)
  tablo4(nb) = Tablo2(j, 1)
   Debug.Print tablo4(nb)
 Exit For
 
  End If
  Next i
 
 y = y + 1
 Range("B" & y) = tablo4(nb)
 Next j
End Sub


Là, le probleme est que les 2 colonnes ou j'affiche mes resultats me donnent quand même des resultats identiques!!!

je cherche encore où est l'erreur
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 juil. 2011 à 06:54
mais il me reste à faire apparaitre les resultats du tablo3 dans une msgbox, et là je coince

Dans nune msgbox ? (es-tu certain ?) ===>>
soit le_tableau le tableau concerné et dimensionné comme tu l'as dimensionné (1 to 1)
For x = 1 to Ubound(le_tableau)
  msgbox le_tableau(x)
next

!!
____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 juil. 2011 à 07:00
correction/précision :

"et dimensionné comme tu l'as dimensionné (1 to 1) puis redimensionné (1 to nb)"

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
boomer11 Messages postés 39 Date d'inscription samedi 30 avril 2011 Statut Membre Dernière intervention 26 juin 2012
16 juil. 2011 à 01:39
Oui c'est vrai,

j'ai été obligé de le dimensionner au début (1 to 1) car sinon il ne voulait pas me le redimensionner après en me préservant les nouvelles valeurs!!!
Sinon je me suis servit de ta methode en l'a modifiant un peu pour afficher toutes mes valeurs dans la MsgBox(La tienne affichant valeur par valeur) et ça marche impeccable

Je poste la modification:

For x = 1 To UBound(Tablo3)
     Resultat = Resultat & Tablo3(x) & vbCrLf
Next
MsgBox Resultat


Juste une derniere question,Est-ce que :

Dim I, J As Integer

Est pareil que :

Dim I As Integer, J As Integer


Encore merci pour les précisions
boomer
0
boomer11 Messages postés 39 Date d'inscription samedi 30 avril 2011 Statut Membre Dernière intervention 26 juin 2012
16 juil. 2011 à 16:23
Ok

Merci pour tout
0
Rejoignez-nous