Fonction match multicritère

  • Initiateur de la discussion Initiateur de la discussion Sitlo
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

S

Sitlo

Guest
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

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
 
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!
 
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...
 
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!
 
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.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

B
  • Question Question
Microsoft 365 colorer une plage
Réponses
2
Affichages
943
bd.afaf
B
N
Réponses
21
Affichages
6 K
R
Réponses
7
Affichages
1 K
Rundle
R
A
Réponses
4
Affichages
1 K
Retour