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 SubCdlt
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
"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