Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/09/2011, 15h47   #1
Invité de passage
 
Homme Baptiste LATRUBESSE
Ingénieur développement matériel électronique
Inscription : septembre 2011
Messages : 2
Détails du profil
Informations personnelles :
Nom : Homme Baptiste LATRUBESSE
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement matériel électronique
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : septembre 2011
Messages : 2
Points : 2
Points : 2
Par défaut Comparaison de deux tableaux de string

Bonjour,

Je suis actuellement en train de développer un outils pour Excel permettant de mettre à jour automatique une liste de liens hypertexts en les comparant à une base de données existante.
Arrive donc le moment où je dois comparer mes deux tableaux (attention, un tableau au sens array, pas en temps que feuille Excel) et pour le faire, j'utilise ce morceau de code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Private Sub ComparaisonTableau()
 
Dim BdD() As String
Dim TaC() As String
Dim InString() As String
 
Dim i As Integer
 
'Définition de la taille des tableaux
 
ReDim BdD(10)
ReDim TaC(10)
ReDim InString(10)
 
'Définition du tableau post scan
 
TaC(1) = "paul"
TaC(2) = "dany"
TaC(3) = "leandro"
TaC(4) = "simon"
TaC(5) = "hubert"
TaC(6) = "roberto"
TaC(7) = "baptiste"
 
'definition du tableau de la base de donnés
 
BdD(6) = "paul"
BdD(1) = "leandro"
BdD(2) = "baptiste"
BdD(3) = "hubert"
BdD(4) = "simon"
BdD(5) = "dany"
 
'boucle pour tester tous les membres du tableau postscan
For i = 0 To UBound(TaC)
 
    InString = Filter(BdD, TaC(i), True)
 
    If (UBound(InString) <> 0) Then
        MsgBox ("Ceci n'existe pas dans la base de données : " & TaC(i))
        'Debug.Print InString(i)
    End If
 
 
 
Next i
 
End Sub
Mais là, j'ai un souci. Quand je compile et je que fais tourner le code, je devrais n'avoir qu'une fenêtre qui s'ouvre avec écrit dedans "Ceci n'existe pas dans la base de données : roberto" or j'ai en plus 4 fenêtre qui s'ouvre en cascade (une avant le bon message et 3 après) avec juste écrit "Ceci n'existe pas dans la base de données :".

J'ai essayé d'affiné la définition de la taille de mes tableaux, mais même avec TaC comprennant que 7 variables, j'ai une fenêtre qui s'ouvre quand même avant la bonne ( les 3 après ne s'affiche plus, ce qui est logique). C'est n'est pas un réel problème en soit, sauf que je vais avoir un très grand nombre de variables pour mes tableaux TaC et BdD, il n'est donc pas envisageable d'avoir à appuyer une bonne centaine de fois sur Ok à chaque fois qu'on lance la routine.
Voilà donc ma première question, quelqu'un a-t-il une solution pour régler ce problème.

Pour la deuxième question, pense avoir la réponse mais j'espère me tromper, est-il possible de garder mes tableaux en dynamique (donc sans avoir à initialiser le nombre de variables à l'intérieur) car je vais avoir un grand nombre de données, et ce nombres est variable ?

Merci d'avance pour l'aider qu'il est possible d'apporter à un novice du VBA comme moi.

Cordialement,
Truc machin chose
TrucMachinChose est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 16h11   #2
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
La première qui s'affiche, ça doit être parce que tes tableaux sont indicés à partir de 0.
C'est d'ailleurs implicite dans ta boucle puisque tu la fais partir de 'i=0' et qu'apparemment ça ne lève pas d'exception du style "l'indice n'appartient pas à la sélection".

Afin de ne pas se faire avoir, le mieux est de se fixer une règle dès le départ. En haut du module (avant la déclaration de la procédure):

Code :
1
2
3
Option Base 0    'indice à partir de 0
'ou
Option Base 1    'indice à partir de 1
Tu peux également éviter les ambigüités dans le redimensionnement en précisant les bornes:

Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 16h12   #3
Membre éprouvé
 
Homme Franck PRESSE
Inscription : août 2010
Messages : 202
Détails du profil
Informations personnelles :
Nom : Homme Franck PRESSE
Âge : 38
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : août 2010
Messages : 202
Points : 444
Points : 444
Bonjour,
Voyons déjà les deux premiers points...
Pour tes 4 msgbox vides, tu as bien compris que :
Code :
1
2
3
4
5
6
7
8
9
10
ReDim TaC(10)
'.......
TaC(1) = "paul"
TaC(2) = "dany"
TaC(3) = "leandro"
TaC(4) = "simon"
TaC(5) = "hubert"
TaC(6) = "roberto"
TaC(7) = "baptiste"
For i = 0 To UBound(TaC)
TaC(i) pour i = 0 ou 8 ou 9 ou 10 va te donner un message puisque ces données (vides) ne se trouvent effectivement pas dans BdD...

1ère question, tu voudrais voir s'afficher dans le MsgBox, la liste des éléments ne correspondants pas entre tes 2 tableaux, mais pas les éléments un par un.
Pour cela, tu peux passer par une variable de type String intermédiaire comme ceci :
Code :
1
2
3
4
5
6
7
8
9
Dim Liste As String
Liste = ""
For i = 0 To UBound(TaC)
    InString = Filter(BdD, TaC(i), True)
    If (UBound(InString) <> 0) Then
        Liste = TaC(i) & " ; " & Liste
    End If 
Next i
MsgBox ("Ceci n'existe pas dans la base de données : " & Liste)
2ème question, bien sur que tes variables tableaux peuvent rester dynamiques, voir du côté des instructions reDim et Preserve lors de leur remplissage...
Un petit tuto???
__________________
Cordialement,
Franck P.


Ps : n'oubliez pas de placer vos posts comme "résolus" () si tel est le cas...
pijaku est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/09/2011, 09h25   #4
Invité de passage
 
Homme Baptiste LATRUBESSE
Ingénieur développement matériel électronique
Inscription : septembre 2011
Messages : 2
Détails du profil
Informations personnelles :
Nom : Homme Baptiste LATRUBESSE
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement matériel électronique
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : septembre 2011
Messages : 2
Points : 2
Points : 2
Par défaut Remerciement

Bonjour,

Je tiens à vous remercier tous les deux, Sclarkone et Pijaku Pour l'aide que vous m'avez apporté et surtout pour la vitesse de la réponse. Beau Boulot.
Merci aussi à Pierre Fauconnier d'avoir corrigé mon oubli de balise.

Encore une fois merci à vous tous. je n'espère pas à bientôt, ça impliquerait que j'ai encore un souci . Ce fut un plaisir.

Truc M-C
TrucMachinChose est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h38.


 
 
 
 
Partenaires

Hébergement Web