Problème sous excel vba

Résolu/Fermé
geo0258 Messages postés 20 Date d'inscription mercredi 25 janvier 2012 Statut Membre Dernière intervention 9 janvier 2019 - 25 janv. 2012 à 18:09
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 - 26 janv. 2012 à 10:23
Bonjour j'ai un problème sous excel en matière de vba

Je vous explique, je doit faire migrer une base de donnée d'un ancien logiciel à un nouveau.
Depuis les 2 logiciels je peux faire des exports excel.
Je me retrouve donc avec :
- feuille 1 : base de donnée nouveau logiciel
- feuille 2 : base de donnée ancien logiciel

Il s'agit de bases de donnés concernant des clients avec différents champs (nom, prénom, adresse, etc ...). Le but étant grâce à une clé commune aux 2 bases de transférer les données de l'ancienne base sur la nouvelle.
J'ai donc coordonné manuellement sur les deux feuilles les noms des intitulés de champs.
Ex : si dans l'ancienne base l'intitulé s'appelle "nom client" et que dans la nouvelle il s'appelle "nom", j'ai écrit dans les 2 bases le même intitulé

J'ai ensuite créé un bouton dans lequel j'ai tapé un code. Le bouton marche et arrive à trouver les colonnes qui ont les mêmes intitulés, il arrive également à copier les infos de la colonnes en face des lignes qui correspondent aux bons ID client. Cependant il ne me copie qu'une colonne et ne continue pas de remplir les autres colonnes. Je ne comprend pas pourquoi.

Voici mon code ci-dessous sachant que j'ai d'abord fais le test sur une feuille numéro 3 pour ne pas écraser les données qui existent déjà dans la feuille 1 (c'est-à-dire la nouvelle base) :



Private Sub CommandButton3_Click()
Dim l As Integer
Dim ll As Integer
Dim c As Integer
Dim cc As Integer
l = 2
ll = 2
c = 3
cc = 2
Do
cc = 2
Do
If Worksheets(1).Cells(1, c).Value = Worksheets(2).Cells(1, cc).Value Then
Do
ll = 2
Do
If Worksheets(1).Cells(l, 2).Value = Worksheets(2).Cells(ll, 1).Value Then
Worksheets(3).Cells(l, c).Value = Worksheets(2).Cells(ll, cc).Value
End If
ll = ll + 1
Loop Until Worksheets(2).Cells(ll, 1).Value = ""
l = l + 1
Loop Until Worksheets(1).Cells(l, 2).Value = ""
End If
cc = cc + 1
Loop Until Worksheets(2).Cells(1, cc).Value = ""
c = c + 1
Loop Until Worksheets(1).Cells(1, c).Value = ""
End Sub


J'espère que vous allez y comprendre quelque chose ^^
A voir également:

3 réponses

pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 644
25 janv. 2012 à 18:33
Bonjour,

Je pense qu'il manque l'initialisation de l dans le début de la boucle. Quand il passe à la deuxième colonne il faut remettre l=2.

Le début de la macro est donc :
...
Do
cc = 2
l = 2
...

A tester
0
geo0258 Messages postés 20 Date d'inscription mercredi 25 janvier 2012 Statut Membre Dernière intervention 9 janvier 2019
25 janv. 2012 à 19:30
Yes ça marche merci beaucoup pilas c'est génial !

Par contre ça met bien 15 à 20 minutes à générer tout le barda mais ça marche :)

Encore merci !
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 644
Modifié par pilas31 le 26/01/2012 à 10:24
Bonjour,

Juste une petite remarque sur les performances.

Les boucles imbriquées sont sur les colonnes puis sur les lignes.

Classiquement dans un tableau Excel, il y a fort à parier que le nombre de lignes soit bien supérieur au nombre de colonnes.

Donc pour chaque colonne on parcours la totalité des lignes pour tester l'égalité de la clé puis affecter la valeur à a la cellule.

Je pense que si on fait le contraire c'est à dire parcours de toutes les lignes une seule fois, et si la clé est trouvée boucler sur l'affectation de toutes les colonnes, on va gagner un facteur pratiquement égal au nombre de colonnes.

En gros si il y a mettons 10 colonnes, ce sera à peu prés dix fois plus rapide.

Voilà,

Bonne continuation,

Cordialement,
0