Fonction match multicritère

Sitlo

XLDnaute Nouveau
Bonjour,

J'ai écris une macro afin de recopier temporairement une partie de mon tableau dans une autre feuille, le temps d'extraire des données d'un logiciel qui écrase le contenu actuel du tableau, modifiant le nombre de lignes, leur ordre, etc.

La deuxième macro (celle qui me pose problème) sert à réintégrer les données selon deux critères (N°OE et n°OPERATION).

Initialement la macro fonctionnait bien, mais depuis que des N°OE contiennent une lettre, une partie des données n'est plus recopiée, et la fonction match renvoi une erreur pour les lignes en question.

Sauriez-vous à quoi cela est dû?
 

Pièces jointes

  • Planning BE - debugage.xlsm
    265 KB · Affichages: 18

thebenoit59

XLDnaute Accro
Bonjour Sitlo.

Je te proposer une autre solution que de "Matcher".

VB:
Sub recopie()
Dim a()
Dim i&, l&
Dim sh1 As Worksheet, sh2 As Worksheet
Dim d As Object

'Enregistrement des feuilles dans des objets.
Set sh1 = ThisWorkbook.Sheets("PLANNING BE")
Set sh2 = ThisWorkbook.Sheets("TEMPORAIRE")

'Enregistrement du tableau temporaire dans un tableau virtuel.
'Sur une grande quantité d'informations le traitement sera plus rapide.
a = sh2.[C5].CurrentRegion.Value
'Création d'un dictionnaire.
Set d = CreateObject("scripting.dictionary")
'Boucle du tableau virtuel pour alimenter le dictionnaire.
For i = LBound(a) To UBound(a)
    'La clef du dictionnaire est le N°OE & N° Opération.
    'L'item sera le numéro de ligne correspondant dans le tableau virtuel.
    d(a(i, 1) & a(i, 2)) = i
Next i

'Placement dans le listobject de l'onglet PlANNING BE
With sh1.ListObjects("OE").DataBodyRange
    'Boucle de toutes les lignes du corps.
    For i = 1 To .Rows.Count
        'Si Le N°OE & N° Opération du tableau sont trouvés dans le dictionnaire.
        If d.exists(.Item(i, 3).Value & .Item(i, 5).Value) Then
            'Alors sort le numéro de la ligne correspondante dans le tableau virtuel.
            l = d(.Item(i, 3).Value & .Item(i, 5).Value)
            'Et recopie les données des colonnes 18/19/20 et 22 selon les colonnes 3 à 6 du tableau virtuel.
            .Item(i, 18).Value = a(l, 3)
            .Item(i, 19).Value = a(l, 4)
            .Item(i, 20).Value = a(l, 5)
            .Item(i, 22).Value = a(l, 6)
        End If
    Next i
End With
End Sub
 

Sitlo

XLDnaute Nouveau
Bonjour thebenoit59,

Je te remercie ta réponse est vraiment parfaite!
Je ne suis pas encore à l'aise avec les tableaux virtuel... Mais j'ai mis en place ta solution et cela marche très bien.

Effectivement j'ai un grand nombre de lignes, et ta méthodologie a accéléré ma macro de façon significative.

Je me posais la questions du coup avec ta méthodologie, cela serait donc possible de sauvegarder mon tableau au début de la macro et m'affranchir de la recopie dans un nouvel onglet non?

En tous cas merci beaucoup!
 

Sitlo

XLDnaute Nouveau
Bonjour thebenoit59,

En fait, la macro va prendre le tableau que tu as reçu, le vider, et ensuite importer les données actualisées depuis notre logiciel ERP.
La macro que tu m'as aidé à modifier n'est utilisée que pour sauvegardé temporairement les données le temps de l'actualisation (données non-présentes dans l'ERP, c'est pour ca que nous sommes obligés de les sauvegarder...).

Je ne sais pas si cela te suffit pour comprendre le fonctionnement...
 

Sitlo

XLDnaute Nouveau
En fait c'est une macro qui extrait des données du logiciel "Microsoft Dynamics Nav", du coup je n'ai pas du tout de fichier type à importer.
Les données sont extraites lignes par lignes, et colonne après colonnes.

En gros la macro d'import ne fait qu'écrire par-dessus les données existante (c'est pourquoi je vide le tableau avant pour être sûr).
De par cette écriture des données, il y a régulièrement de nouvelles lignes qui s'intercalent dans la base de données ou qui en disparaisse, c'est pour cela que j'ai besoin de la recopie pour garder mes informations additionnelles, car je ne sais jamais ou sera réécrite la ligne que j'avais commenté.

Je ne peux pas trop t'en dire plus, mais si ça ne suffit pas ce n'est pas grave, merci déjà pour ton aide!
 

thebenoit59

XLDnaute Accro
Es-tu capable, de ton côté, d'automatiser les macros les unes avec les autres ?
Si oui, je peux te proposer deux macros :
La première se lance juste avant ton importation pour sauvegarder les données en mémoire.
La seconde se lance juste après ton importation pour réimporter les données.
 

Discussions similaires

Réponses
16
Affichages
455

Statistiques des forums

Discussions
312 103
Messages
2 085 306
Membres
102 859
dernier inscrit
Diallokass