Recherche conditionnelle et VBA

Bonjour à toutes et tous,

J'espère qu'une âme charitable pourra m'aider

Je suis en train de construire une base de données en VBA et je suis novice dans ce langage.

Je dois ramener dans une feuille excel différentes données de tarifs fournisseur (prix, EAN, unité,...)

Lorsque le fournisseur propose deux prix, je dois prendre le prix le plus élevé.

J'ai simplifié au maximum et vous ai joint un fichier.

Est-ce que vous pouvez m'aider

Merci à vous

Lewis

Bonjour et bienvenue sur le forum

Tu devrais donner un exemple du résultat attendu pou bien voir dans quelle colonne de ta base tu veux avoir les colonnes de la feuille "Fournisseur"

Bye !

Bonjour gmb

Tout d'abord merci de ton aide.

Tu trouveras ci-joint un exemple. En fait, je cherche, dans un premier temps à mettre à jour à l'aide de macro, le prix, EAN et unités

Lorsque le fournisseur propose deux prix alors on doit prendre le plus élevé.

Encore une fois merci de ton aide

Lewis

Bonsoir,

Mettre sous forme de tableau et utiliser MAX.SI.ENS.

Cordialement.

Edit fichier mis à jour

Bonsoir à tous,

Merci Zebulon2 pour ta réponse.

La base de données fournisseur sera liée à beaucoup de fournisseurs avec des mises à jour très fréquentes.

Ces listings fournisseur seront de présentations et tailles diverses. Cette base serait à lier à des prix de vente.

Je pensais utiliser du VBA avec un bouton pour effectuer une mise à jour générale.

Est-ce qu'avec du VBA on pourrait faire les mises à jour prix (en prenant le prix le plus élevé entre par exemple les Prix nets unitaire HT avec plus value et les Prix nets avec étiquette & plus value si déconditionnement), unité, EAN.

Merci encore

Lewis

re,

Pourquoi du VBA si des formules font le taf ?

Cordialement.

bonjour, un début en VBA

Bonjour BsAlv

Merci pour ton post

J'avais pensé à la formule magique suivante mais cela ne marche pas et je ne vois pas comment corriger

Nicoll est le nom du fournisseur et Donnees est la base sur laquelle je dois rapatrier le prix le plus élevé.

p est le prix le plus fort du fournisseur et q est le prix le moins élevé pour le même article (la différence entre p et q représente différents frais de déconditionnement.

La partie en rouge représente la partie qui coince et en vert quelques commentaires.

J'espère que quelqu'un pourra m'aider car je galère pas mal. J'ai pas mal de choses à apprendre

Merci beaucoup

Lewis

Sub EssaiNicollif()

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 pour trouver la référence fournisseur qui me sert de clef entre le tableau de la base

de données et le tableau fournisseur

Sheets("Donnees").Range("AE" & n) = Sheets("Nicoll").Range("U" & m) pour rapatrier le prix de la colonne U (prix fort)

Also Sheets("Donnees").Range("AE" & n) = Sheets("Nicoll").Range("R" & m) pour rapatrier le prix de la colonne R (moins fort)

End If

Next

Next

End Sub

Bonjour,

Est-ce qu'une âme charitable pourrait m'aider svp

Je patauge pas mal

Merci beaucoup

Bonjour,

Je cherche à faire une recherche conditionnelle imbriquée

Je dois rapatrier, dans le fichier Donnees, un prix qui est présent dans le fichier F 1mail21.

La clef de recherche dans Donnees est présente dans la colonne G

La clef de recherche dans F 1mail21 est présente dans la colonne A

Le prix a rapatrié est présent soit dans la colonne M soit dans la colonne O du fichier F 1mail21

Si le prix dans la colonne M est supérieur à celui présent dans la colonne O alors prendre le prix de la colonne M sinon c'est celui de la colonne O à prendre.

Voir l'essai de la formule VBA ci-dessous.

Merci de votre aide

Sub essaif()
Application.ScreenUpdating = False
Application.EnableEvents = False
Dim Ligne1 As Long, Ligne2 As Long, Ligne3 As Long, ligne4 As Long
Ligne2 = Sheets("Donnees").Range("G50").End(xlUp).Row
Ligne1 = Sheets("F 1mail21").Range("A50").End(xlUp).Row
Ligne3 = Sheets("F 1mail21").Range("M50").End(xlUp).Row
ligne4 = Sheets("F 1mail21").Range("O50").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("G" & n) = Sheets("F 1mail21").Range("A" & m) Then
If p > 0 Then
Sheets("Donnees").Range("I" & n) = Sheets("F 1mail21").Range("M" & m)
Else
If Sheets("F 1mail21").Range("O50").End(xlUp).Row > Sheets("F 1mail21").Range("M50").End(xlUp).Row Then
Sheets("Donnees").Range("I" & n) = Sheets("F 1mail21").Range("O" & m)
End If
End If
End If
Application.ScreenUpdating = True
Application.EnableEvents = True
Next
Next
Next
Next
End Sub

Bonjour,

Pas besoin de VBA pour ça, une formule suffit. (pour des raisons évidentes de limitations du tableau de la feuille "F 1mail21", ce dernier est converti en tableau structuré, ainsi il s'adaptera automatiquement aux nouvelles saisies)

Maintenant si vous tenez absolument à le faire en VBA:

Sub essaif()
    Dim f1 As Worksheet, f2 As Worksheet
    Dim DerLig_f1 As Long, DerLig_f2 As Long, i As Long, Pos As Long
    Dim Prix_1 As Currency, Prix_2 As Currency, Retnu As Currency
    Dim Code As String
    Application.ScreenUpdating = False
    Set f1 = Sheets("Donnees")
    Set f2 = Sheets("F 1mail21")
    DerLig_f1 = f1.Range("A" & Rows.Count).End(xlUp).Row
    DerLig_f2 = f2.Range("A" & Rows.Count).End(xlUp).Row
    For i = 2 To DerLig_f1
        Code = f1.Cells(i, "G")
        On Error Resume Next
        Pos = Application.Match(Code, f2.Range("A1:A" & DerLig_f2), 0)
        If Err.Number = 0 Then
            Prix_2 = f2.Cells(Pos, "M")
            Prix_3 = f2.Cells(Pos, "O")
            Retenu = Application.WorksheetFunction.Max(Prix_2, Prix_3)
            f1.Cells(i, "H") = Retenu
        End If
        On Error GoTo 0
    Next i
    Set f1 = Nothing
    Set f2 = Nothing
End Sub

Cdlt

Bonjour Arturo83

Merci de ton aide

En fait je suis train de construire une base de données avec une mise à jour des prix mais aussi conditionnement etc ...

Je pensais qu'en faisant des macros et en rattachant ces macro à un bouton, cela serait plus facile à mettre à jour.

Mais je me rend compte que la mise à jour totale risque d'être lourde.

Si tu as des astuces, je suis preneur.

Encore une fois un grand merci à toi

Que manque-t-il pour vous satisfaire?

Mes 2 propositions, par formules ou par VBA ne conviennent-elles pas?

Déposez un fichier avec les résultats attendu.

Bonjour,

Merci pour ton aide. Je suis en train de regarder mais cela n'a pas l'air de marcher.

Le problème est que je ne peux pas t'envoyer les fichiers car les données sont privées.

Je suis en train de voir pourquoi mais je pense que je reviendrais vers toi si tu veux bien.

L'autre problème sera la vitesse d'exécution. Les données et les fichiers seront importants

Petite question au passage peut-on attribuer un bouton et le lier à une formule et non une macro ?

SI les macro sont trop lourdes et compliquées, peut être mettre en places des boutons qui actionneront une ou plusieurs formules

(excuses mes questions mais comme je suis débutant, je me raccroche à l'avis d'expert)

Merci

"Je suis en train de regarder mais cela n'a pas l'air de marcher." Qu'est-ce qui ne marche pas?
"Le problème est que je ne peux pas t'envoyer les fichiers car les données sont privées." Le fichier que vous avez fourni est-il similaire au fichier réel (nombre de colonnes identique, le nombre de lignes est sans importance)? si OUI, la macro s'adaptera sur le vrai fichier.
"L'autre problème sera la vitesse d'exécution. Les données et les fichiers seront importants", ça, on le verra aux essais
"Petite question au passage peut-on attribuer un bouton et le lier à une formule et non une macro ?" NON
"SI les macro sont trop lourdes et compliquées, peut être mettre en places des boutons qui actionneront une ou plusieurs formules." OUI, mais qu'est-ce que vous voulez dire par " macro trop lourde ou trop compliquée"?, si la macro est bien faite, son exécution est transparente.

bonjour arturo83, le fil,

si c'est un problème de vitesse, cette macro fait tout en mémoire et sera donc plus vite quand vos données sont "importants".

Si la macro à Arturo ne fonctionne pas, la mienne aura les mêmes difficultés...

Sub Teste()     'bsalv
     Dim LO, code_FF, aA, aB, aOut, i, t, r As Variant
     t = Timer
     Set LO = Sheets("F 1mail21").ListObjects("Tableau1")     'votre tableau structuré
     aA = LO.DataBodyRange.Value2     'données de ce tableau
     code_FF = LO.DataBodyRange.Columns(1).Value     'matrice avec seulement la première colonne

     With Sheets("donnees")     '2ième feuille
          r = .Range("G" & Rows.Count).End(xlUp).Row     'numéro de la dernière G-cellule
          If r >= 2 Then     'il y a des noms
               aB = .Range("G2").Resize(r - 1).Value     'matrice avec les codes_FF de la colonne G
               ReDim aOut(1 To r - 1, 1 To 1)     'préparer une matrice pour les resultats
               For i = 1 To UBound(aB)     'boucle les codes_FF de la colonne G
                    If Len(aB(i, 1)) > 0 Then     'non vide
                         r = Application.Match(aB(i, 1), code_FF, 0)     'chercher ce code dans la colonne A du tableau
                         If IsNumeric(r) Then     'trouvé
                              aOut(i, 1) = Application.Max(aA(i, 11), aA(i, 13), aA(i, 15))     'trouvé !! = max des valeurs des colonnes 11, 13 et 15
                         Else     'ne pas trouvé
                              aOut(i, 1) = "???"
                         End If
                    End If
               Next
               .Range("H2").Resize(UBound(aOut)).Value = aOut   'copier cette matrice vers le tableau structuré.
          Else
               .Range("H2").Resize(10).ClearContents     'RAZ cette plage
          End If
     End With

     MsgBox "prêt en " & Format(Timer - t, "0.00\s") & vbLf & "F 1mail21 : " & Format(UBound(aA), "#,###0") & " lignes" & vbLf & "Donnees : " & Format(UBound(aOut), "#,###0") & " lignes"
End Sub
Rechercher des sujets similaires à "recherche conditionnelle vba"