Microsoft 365 Recherche conditionnelle VBA

Jordan1

XLDnaute Nouveau
Bonjour,

Petit nouveau sur le forum et débutant en VBA, je dois réaliser une base de données tarifaire.
Celle-ci sera liée à des centaines de tarifs fournisseurs qui peuvent évoluer à tous moment.
Je coince sur la recherche conditionnelle multiple.
J'ai créé les lignes de codes suivantes mais l'ordinateur m'indique qu'il y a des problèmes de syntaxe et de compilation
au niveau de la ligne suivante Elself p < q And Sheets("Donnees").Range("P" & n) = Sheets("Nicoll").Range("C" & m) Then
Il y a sans doute d'autres erreurs car je suis totalement novice.
Vous trouverez ci-joint un tableau naturellement tous les prix sont faux et mis au hasard.

Merci de votre aide

VB:
Sub Essa()
Dim Ligne1 As Long, ligne2 As Long, Ligne3 As Long, ligne4 As Long
ligne2 = Sheets("Donnees").Columns(16).Find("*", , , , xlByColumns, xlPrevious).Row
Ligne1 = Sheets("Nicoll").Columns(3).Find("*", , , , xlByColumns, xlPrevious).Row
Ligne3 = Sheets("Nicoll").Columns(21).Find("*", , , , xlByColumns, xlPrevious).Row
ligne4 = Sheets("Nicoll").Columns(10).Find("*", , , , xlByColumns, xlPrevious).Row
For n = 1 To ligne2
For m = 1 To Ligne1
For p = 1 To Ligne3
For q = 1 To ligne4
If p > q And Sheets("Donnees").Range("P" & n) = Sheets("Nicoll").Range("C" & m) Then
Sheets("Donnees").Range("AE" & n) = Sheets("Nicoll").Range("U" & m)
Elself p < q And Sheets("Donnees").Range("P" & n) = Sheets("Nicoll").Range("C" & m) Then
Sheets("Donnees").Range("AE" & n) = Sheets("Nicoll").Range("R" & m)
End If
Next
Next
Next
Next
End Sub
 

Pièces jointes

  • Fichier test essai3.xlsm
    12.7 KB · Affichages: 4

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Jordan, et bienvenu sur XLD,
Votre macro fait essentiellement appel aux feuilles Données et Nicholl qui sont absentes de votre fichier test, donc difficile d' analyser.
Ensuite pour votre erreur, peut être est ce plus rapide de faire :
VB:
If Sheets("Donnees").Range("P" & n) = Sheets("Nicoll").Range("C" & m) Then
    If p >= q Then
        Sheets("Donnees").Range("AE" & n) = Sheets("Nicoll").Range("U" & m)
    Else
        Sheets("Donnees").Range("AE" & n) = Sheets("Nicoll").Range("R" & m)
    End If
End If
Cela évite les AND et évite une lecture de données.
 

Jordan1

XLDnaute Nouveau
Bonjour,

Tout d'abord un grand merci pour vos réponses.
xUpsilon ne vas pas tout suite chez l'ophtalmo, c'est moi qui me suis trompé. Désolé
Merci sylvanu pour ta réponse, j'ai renommé les feuilles excel du fichier.
Je viens de modifier ma formule suivant les recommandations de sylvanu mais l'ordinateur mouline pendant des heures. Si d'autres âmes charitables peuvent aussi m'aider, je les remercie.

Merci à vous
 

Pièces jointes

  • Fichier test essai4.xlsm
    12.8 KB · Affichages: 5

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
J'ai tenté de comprendre votre code, je l'ai ré écrit comme ça pour voir :
VB:
Sub Essa()
Dim Ligne1 As Long, Ligne2 As Long, Ligne3 As Long, ligne4 As Long
Ligne2 = Sheets("Donnees").Range("P65500").End(xlUp).Row
Ligne1 = Sheets("Nicoll").Range("C65500").End(xlUp).Row
Ligne3 = Sheets("Nicoll").Range("U65500").End(xlUp).Row
ligne4 = Sheets("Nicoll").Range("J65500").End(xlUp).Row
For n = 1 To Ligne2
    For m = 1 To Ligne1
        For p = 1 To Ligne3
            For q = 1 To ligne4
                If Sheets("Donnees").Range("P" & n) = Sheets("Nicoll").Range("C" & m) Then
                    If p > q Then
                        Sheets("Donnees").Range("AE" & n) = Sheets("Nicoll").Range("U" & m)
                    Else
                        Sheets("Donnees").Range("AE" & n) = Sheets("Nicoll").Range("R" & m)
                    End If
                End If
            Next
        Next
    Next
Next
End Sub

Mais dans votre fichier original, combien de ligne avez vous dans Données et Nicholl ?

Car vous avez un nombre de boucles égal à NbL = Ligne1 * Ligne2 * Ligne3 * ligne4.
Dans votre petit fichier cela fait déjà 1152 boucles.
Si le nombre de ligne est grand il faut passer par des arrays, cela accélérera grandement la macro.
 

Pièces jointes

  • Fichier test essai4.xlsm
    19.6 KB · Affichages: 4

Jordan1

XLDnaute Nouveau
Merci sylvanu pour ton post.
Oui le fichier est important et il va grandir de manière considérable. ( à terme il y aurait environ 500 fournisseurs et un fichier Données de plus de 60 000 lignes)
Je ne connais pas les arrays. Pourrais-tu me montrer svp

Merci à toi
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Si Ligne1 à Ligne4 valent 60000 alors vous aurez 12960000000000000000 boucles et autant de IF, donc laissez tomber ce n'est pas réaliste, avec ou sans arrays.
Et si vous nous expliquiez quel est le but exact de la manip, que cherchez vous exactement à faire ?

[Edit] Il y a des trucs que je ne comprends pas dans votre macro :
Sheets("Donnees").Range("P" & n) Il n'y a rien dans la colonne P. Donc Ligne2 vaudra 0.
Votre fichier est il incomplet ou est ce une erreur ?
Sheets("Nicoll").Range("J65500") Que devrait il y avoir dans la colonne J ? Actuellement J est vide.
 
Dernière édition:

xUpsilon

XLDnaute Accro
Bonjour,

VB:
Sub Essa()
Dim Ligne1 As Long, Ligne2 As Long, Ligne3 As Long, ligne4 As Long
Ligne2 = Sheets("Donnees").Range("P65500").End(xlUp).Row
Ligne1 = Sheets("Nicoll").Range("C65500").End(xlUp).Row
Ligne3 = Sheets("Nicoll").Range("U65500").End(xlUp).Row
ligne4 = Sheets("Nicoll").Range("J65500").End(xlUp).Row
For n = 1 To Ligne2
    For m = 1 To Ligne1
        If Sheets("Donnees").Range("P" & n) = Sheets("Nicoll").Range("C" & m) Then
            For p = 1 To Ligne3
                For q = 1 To ligne4
                    If p > q Then
                        Sheets("Donnees").Range("AE" & n) = Sheets("Nicoll").Range("U" & m)
                    Else
                        Sheets("Donnees").Range("AE" & n) = Sheets("Nicoll").Range("R" & m)
                    End If
                Next
            Next
        End if
    Next
Next
End Sub

On devrait déjà gagner un peu en changeant le If qui ne s'intéresse qu'à m et n de position. On évite ainsi de rentrer dans les deux dernières boucles si la condition n'est pas respectée.

Ensuite, de ce que je comprends, on va juste chercher si Ligne 3 est supérieure ou non à Ligne 4, puisque de toute façon on remplit Range("AE" & n) à chaque fois, donc dans les deux dernières boucles on ne fait qu'interchanger x fois les 2 mêmes valeurs jusqu'à arriver aux valeurs max de p et de q, qui correspondent donc à Ligne 3 et Ligne 4, et ce qui nous donne donc notre résultat final.

Donc je dirais qu'il suffit d'avoir ça :
VB:
Sub Essa()
Dim Ligne1 As Long, Ligne2 As Long, Ligne3 As Long, ligne4 As Long
Ligne2 = Sheets("Donnees").Range("P65500").End(xlUp).Row
Ligne1 = Sheets("Nicoll").Range("C65500").End(xlUp).Row
Ligne3 = Sheets("Nicoll").Range("U65500").End(xlUp).Row
ligne4 = Sheets("Nicoll").Range("J65500").End(xlUp).Row
For n = 1 To Ligne2
    For m = 1 To Ligne1
        If Sheets("Donnees").Range("P" & n) = Sheets("Nicoll").Range("C" & m) Then
              If Ligne3 > ligne4 Then
                    Sheets("Donnees").Range("AE" & n) = Sheets("Nicoll").Range("U" & m)
              Else
                    Sheets("Donnees").Range("AE" & n) = Sheets("Nicoll").Range("R" & m)
              End If
        End if
    Next
Next
End Sub

Bonne journée,
 
Dernière édition:

Jordan1

XLDnaute Nouveau
Bonjour,

Je suis en train de mettre en place une base de données qui reprendra entre autres les prix , conditionnement, ... des fournisseurs. La partie achat de cette base constituera la 1ere partie de la base et sera liée à la partie vente. L'idée est de mettre à jour la partie achat en 1 clic, en fonction des nombreuses évolutions tarifaires.
La mise à jour de la partie achat entrainera ensuite la partie vente.

A l'heure actuelle, des recherches v gèrent partiellement cette base (le reste est rempli à la main) , je pense donc qu'on peut aller plus loin dans l'automatisation, c'est ce qui m'a poussé vers le VBA. Néanmoins la gestion du temps pour la mise à jour me pose des soucis.

Je suis ouvert à toutes suggestions

Merci à vous
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
Même avec une version optimisée comme le propose xUpsilon, avec 60klignes le temps sera très long, puisque cela fera 3.6 milliard de boucles.
Pouvez vous fournir un fichier "vraiment" représentatif de quelques dizaines de lignes avec vos Recherchev.
Je pense que le plus rapide en VBA sera de mettre les formules dans la feuille, de calculer puis de coller les valeurs.
Un ex en PJ où on installe 60k de formules RechercheV avant de coller leurs valeurs.
Je pense que c'est le plus rapide, et déjà, sur mon vieux PC cela prends 11s.
 

Pièces jointes

  • Essai.xlsm
    16.3 KB · Affichages: 4

Jordan1

XLDnaute Nouveau
Bonjour,
Voici un exemple simplifié de la base de données. Celle-ci a été simplifiée à 1 fournisseur mais en réalité elle comprend environ 200 fournisseurs.
Elle comprend un fichier de données qui servira à calculer les PV (Donnees) , la base articles ainsi que le document du fournisseur (N). Les données de tout le document ont été naturellement modifiées.
L'idée est de:
- vérifier que les donnees et base articles reflètent le prix, conditionnement, ean, ... présents dans le documents fournisseur
- les mettre à jour

J'aurais voulu les mettre à jour en 1 clic avec une macro par fournisseur (et un bouton par fournisseur) ainsi qu'une macro qui actionnerait les différentes macro fournisseur (avec un gros bouton ).
J'aurais voulu quelques choses de très simple, de très sûr, qui pourrait être utilisé par n'importe qui et à n'importe quel moment.

Merci à vous
 

Pièces jointes

  • Exempledonnees.xlsm
    16.7 KB · Affichages: 5

Jordan1

XLDnaute Nouveau
N est la feuille du fournisseur. L’exemple est simplifié car dans la réalité il y a plusieurs centaines de feuilles fournisseurs de différentes formes.
La base articles est à vérifier, elle est tirée du logiciel. La feuille Donnees est la feuille à remplir. La clef de recherche peut être la ref four ou l’ean.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Désolé, je dois être un peu bouché. :)
Vous avez trois feuilles :
N est la feuille du fournisseur, est ce la référence ?
La base articles est à vérifier
La feuille Donnees est la feuille à remplir.

Mais quelle est la feuille qui sert de référence ?
La feuille dont on est sur des informations.

Autre souci, la clé !
EAN est dans base article uniquement
Code article n'est pas présent dans N
Ref article n'est pas présent dans Base article
Donc on n'a aucune clé qui serait commune aux trois feuilles.
 

Jordan1

XLDnaute Nouveau
Bonjour,

- La base article est tirée du logiciel, elle doit;
1) être vérifiée (je ne suis pas sûr qu'elle soit exact)
2) sert à incrémenter la feuille donnée

- La feuille donnée sert à calculer entre autres les prix de vente. Je n'ai pas mis la partie vente pour des raisons de confidentialité mais disons que le prix de vente est liée au prix d'achat.
Je ne peux pas travailler les prix directement sur la base articles.

- la feuille N est un tarif fournisseur il sert de source à la feuille donnée. Il y en a des centaines qui servent de sources à la feuille donnée.

Je dois pouvoir mettre à jour la base articles ainsi que la feuille donnée.
La feuille donnée servira à fixer les prix de vente, la marge, etc...

La clef commune serait la référence article du fournisseur pour 70% des cas. Dans 20% des cas, c'est le code EAN mais celui-ci peut ne pas être fiable. Dans 10% des cas cela pourrait être la référence article du fournisseur mais d'un autre article.

S'il a besoin d'utiliser d'autres choses que du VBA, n'hésitez pas à m'orienter.
L'idée vous l'avez compris est de fiabiliser la base de données, de la mettre à jour rapidement et facilement (surtout au nveau des prix).

Encore une fois merci
 

Membres actuellement en ligne

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 183
dernier inscrit
karelhu35