Trouver tout les prix grâce à une seule référene

floriane12

XLDnaute Nouveau
Bonjour,

Gros soucis!!!
Je n'arrive pas à trouver les prix dans mon tableau sachant qu'il y a plusieurs références les mêmes. A la base il y avait un transport dans la référence( par exemple: BE11ROT, BE11SCA) mais j'ai dû le supprimer donc il ne reste plus que le pays et code postal (Par exemple: BE11) mais du coup j'ai plusieurs références en BE11.

Donc j'ai la référence verticalement et j'ai le nombre de palettes gerbables et non gerbables horizontalement. Toutes ses données se trouve dans la feuille database.

Je voudrais faire en sorte d'avoir tout les prix correspondant au nombre de palettes et à toutes les références. Par exemple je voudrais le prix pour la référence BE11 et pour 12 palettes gerbables. Je voudrais que Excel affiche tout les prix des transporteurs.

Ma formule de base est celle-ci( avec celle-ci je ne sais pas avoir tous les prix pour toute les même références): =IF(ISERROR(INDEX(DATABASE!D7:BQ2709,MATCH('Liste déroulante'!B13,DATABASE!A7:A2709,0),MATCH(RATES!G14,Pallets,0)))=TRUE,0,INDEX(DATABASE!D7:BQ2709,MATCH('Liste déroulante'!B13,DATABASE!A7:A2709,0),MATCH(RATES!G14,Pallets,0)))

Ma formule se trouve dans la feuille RATES en G19. Je voudrais avoir les autres prix en I19 et K19.

J'espère avoir été claire.

Merci à tous

Floriane F.
 

Pièces jointes

  • cout de transport.xlsm
    4.3 MB · Affichages: 46

eriiic

XLDnaute Barbatruc
Remplace la fonction ligx par :
VB:
Private Function ligx(dep As String, pal As String, idx As Long) As Long
    Dim numlig
    numlig = Split(dictDep(dep), ",")
    If idx - 1 <= UBound(numlig) Then ligx = CLng(numlig(idx - 1))
End Function
eric

edit 15:47 : du coup j'ai pu simplifier la fonction.
On pourrait simplifier encore en l'intégrant aux 2 précédentes fonctions. Elle n'a plus beaucoup de raison d'être.
 
Dernière édition:

floriane12

XLDnaute Nouveau
Remplace la fonction ligx par :
VB:
Private Function ligx(dep As String, pal As String, idx As Long) As Long
    Dim numlig
    numlig = Split(dictDep(dep), ",")
    If idx - 1 <= UBound(numlig) Then ligx = CLng(numlig(idx - 1))
End Function
eric

edit 15:47 : du coup j'ai pu simplifier la fonction.
On pourrait simplifier encore en l'intégrant aux 2 précédentes fonctions. Elle n'a plus beaucoup de raison d'être.
Désolé mais je ne comprends pas où dois-je l'intégrer
 

eriiic

XLDnaute Barbatruc
Tu as vu que j'avais modifié à nouveau à 15:47 ? Prend la dernière version.
Peut-être une petite désynchronisation suite à tes manips.
Va sur la feuille DATABASE, reviens et teste à nouveau, en changeant un des paramètre pour forcer le recalcul.
Pour que la fonction soit rapide la base est chargée et les dictionaries sont initialisés à l'ouverture et à la désactivation de DATABASE (en cas de modif)

PS : je dois m'absenter
 

floriane12

XLDnaute Nouveau
Tu as vu que j'avais modifié à nouveau à 15:47 ? Prend la dernière version.
Peut-être une petite désynchronisation suite à tes manips.
Va sur la feuille DATABASE, reviens et teste à nouveau, en changeant un des paramètre pour forcer le recalcul.
Pour que la fonction soit rapide la base est chargée et les dictionaries sont initialisés à l'ouverture et à la désactivation de DATABASE (en cas de modif)

PS : je dois m'absenter

Merci je regarde à ça demain matin
 

eriiic

XLDnaute Barbatruc
J'ai repris les fonctions pour supprimer ligx() qui s'était trop allégé.
Voici ce que tu dois avoir dans Module1 :
VB:
Option Explicit

Dim initBaseOk As Boolean
Dim datas, dictDep, dictPallet, dictPays

Function Forwarding(pays As String, codePostal, palette As String, index As Long)
    Dim lig As Long, numlig
    If Not initBaseOk Then initbase
    numlig = Split(dictDep(dictPays(pays) & codePostal), ",")
    If index - 1 <= UBound(numlig) Then lig = CLng(numlig(index - 1))
    If lig > 0 Then Forwarding = datas(lig, 2) Else Forwarding = ""
End Function

Function cout(pays As String, codePostal, palette As String, index As Long)
    Dim lig As Long, numlig
    If Not initBaseOk Then initbase
    numlig = Split(dictDep(dictPays(pays) & codePostal), ",")
    If index - 1 <= UBound(numlig) Then lig = CLng(numlig(index - 1))
    If lig > 0 Then cout = datas(lig, dictPallet(palette)) Else cout = ""
End Function

Sub initbase()
    Dim lig As Long, col As Long
    Set dictDep = CreateObject("Scripting.Dictionary")
    Set dictPallet = CreateObject("Scripting.Dictionary")
    Set dictPays = CreateObject("Scripting.Dictionary")

    ' dict pays
    With Sheets("Liste déroulante")
        datas = .[F9:F10].Resize(, .Cells(9, Columns.Count).End(xlToLeft).Column - 5).Value
    End With
    For col = 1 To UBound(datas, 2)
        dictPays(datas(1, col)) = datas(2, col)
    Next col
    ' datas
    datas = Sheets("DATABASE").[A7].CurrentRegion.Value
    ' dict départements
    For lig = 7 To UBound(datas)
        If dictDep.exists(datas(lig, 1)) Then
            dictDep(datas(lig, 1)) = dictDep(datas(lig, 1)) & "," & lig
        Else
            dictDep(datas(lig, 1)) = lig
        End If
    Next lig
    ' dict palettes
    For col = 4 To UBound(datas, 2)
        dictPallet(datas(4, col)) = col
    Next col
    initBaseOk = True
End Sub
plus ta macro.
eric
 

eriiic

XLDnaute Barbatruc
Bonjour,

Tu as raison. J'ai oublié de remonter tout d'une ligne après avoir supprimé la ligne 1 vide qui m'embêtait dans DATABASE.
Remplacer ces lignes dans initBase(), les 7 deviennent 6 :
VB:
    ' datas
    datas = Sheets("DATABASE").[A6].CurrentRegion.Value
    ' dict départements
    For lig = 6 To UBound(datas)
eric
 

Statistiques des forums

Discussions
312 231
Messages
2 086 455
Membres
103 216
dernier inscrit
LoshR7