XL 2013 importer et lister à partir d'une base de donnée

an@s

XLDnaute Occasionnel
Bonjour à tous,

je reviens vers vous après une longue absence,
dans le fichier nommé AP j'aimerais lié au bouton importer un code permettant de :

importer les noms de la colonne D du fichier Apports dans la colonne C du fichier AP
importer les quantités de la colonne F du fichier Apports dans la colonne D du fichier AP
importer les données de la colonne J du fichier Apports dans la colonne E du fichier AP
importer les données de la colonne P du fichier Apports dans la colonne F du fichier AP

Sauf qu'il faut lister les noms de la colonne C du fichier AP en mettant les 10 premiers fournisseurs qui ont les quantités de la colonne D les plus élevées,
le reste des quantités il faut les rassembler dans la ligne 52 (autres) en mettant dans E52 un prix moyen.

Merci d'avance
 

Pièces jointes

  • AP.xlsx
    20.9 KB · Affichages: 39
  • Apports.xlsx
    19.7 KB · Affichages: 5

job75

XLDnaute Barbatruc
Oui j'avais bien compris dès hier soir et j'avais abandonné car c'est compliqué.

Mais j'y suis arrivé, voyez ce fichier (4) et la macro révisée :
VB:
Sub Importer()
Dim chemin$, fichier, F As Worksheet, a, b, n%, dest As Range, i&, j&, deb As Range, fin As Range, h%, P As Range, Q As Range
chemin = ThisWorkbook.Path & "\" 'à adapter
fichier = "Apports.xlsx"
If Dir(chemin & fichier) = "" Then MsgBox "Fichier '" & fichier & "' introuvable !", 48: Exit Sub
Set F = ActiveSheet
a = Array("DECHET", "ENTIER")
b = Array("DECHET Total", "ENTIER Total")
Application.ScreenUpdating = False
F.[C42:C51,D42:F52,L42:L51,M42:O52,U42:U51,V42:V52].ClearContents 'RAZ
On Error Resume Next 'si le fichier n'est pas ouvert
Workbooks(fichier).Close False 'si le fichier est ouvert on le ferme
On Error GoTo 0
With Workbooks.Open(chemin & fichier).Sheets(1) 'ouverture du fichier source
    .Cells.UnMerge 'défusionne les cellules pour permettre les tris
    '---1er et 2ème tableaux---
    For n = 0 To UBound(a)
        Set dest = IIf(n, F.[C42], F.[L42]) '1ère cellule de destination
        i = Application.Match(a(n), .Columns(3), 0)
        j = Application.Match(b(n), .Columns(3), 0) - 1
        If n = 0 Then Set deb = .Rows(i): Set fin = .Rows(j)
        If i < deb.Row Then Set deb = .Rows(i)
        If j > fin.Row Then Set fin = .Rows(j)
        .Rows(j + 1).Delete 'pour pouvoir trier toutes les lignes ensemble
        With .Rows(i & ":" & j)
            .Sort .Columns(6), xlDescending, Header:=xlNo 'tri décroissant sur la colonne F
            h = IIf(.Rows.Count > 10, 10, .Rows.Count)
            dest.Resize(h) = .Columns(4).Resize(h).Value 'D
            dest(1, 2).Resize(h) = .Columns(6).Resize(h).Value 'F
            dest(1, 3).Resize(h) = .Columns(10).Resize(h).Value 'J
            dest(1, 4).Resize(h) = .Columns(16).Resize(h).Value 'P
            If .Rows.Count > 10 Then 'Autres
                Set P = .Columns(6).Offset(10).Resize(.Rows.Count - 10)
                dest(11, 2) = Application.Sum(P) 'somme sur F
                If dest(11, 2) Then
                    Set Q = .Columns(10).Offset(10).Resize(.Rows.Count - 10)
                    dest(11, 3) = Application.SumProduct(P, Q) / dest(11, 2) 'moyenne pondérée
                    Set Q = .Columns(16).Offset(10).Resize(.Rows.Count - 10)
                    dest(11, 4) = Application.SumProduct(P, Q) / dest(11, 2) 'moyenne pondérée
                End If
            End If
        End With
    Next n
    '---3ème tableau---
    Set dest = F.[U42] '1ère cellule de destination
    With .Range(deb, fin)
        .Sort .Columns(4), Header:=xlNo 'tri alphabétique de l'ensemble des 2 tableaux
        For i = 2 To .Rows.Count
            If UCase(.Cells(i - 1, 4)) = UCase(.Cells(i, 4)) Then
                .Cells(i, 6) = .Cells(i, 6) + .Cells(i - 1, 6) 'consolidation
                .Rows(i - 1).ClearContents 'effacement
            End If
        Next i
        .Sort .Columns(6), xlDescending, Header:=xlNo 'tri décroissant sur la colonne F
        h = IIf(.Rows.Count > 10, 10, .Rows.Count)
        dest.Resize(h) = .Columns(4).Resize(h).Value 'D
        dest(1, 2).Resize(h) = .Columns(6).Resize(h).Value 'F
        If .Rows.Count > 10 Then 'Autres
            Set P = .Columns(6).Offset(10).Resize(.Rows.Count - 10)
            dest(11, 2) = Application.Sum(P) 'somme sur F
        End If
    End With
     '---fermeture du fichier source---
    .Parent.Close False
End With
End Sub
 

Pièces jointes

  • AP(4).xlsm
    34.2 KB · Affichages: 3
  • Apports.xlsx
    18.1 KB · Affichages: 2
Dernière édition:

an@s

XLDnaute Occasionnel
Bonjour Mr Job,

Je vous remercie à nouveau pour ce joli code qui va me permettre de gagner assez de temps.
aufait, je ne sais si c'est possible de l'appliquer pour faire la même chose pour le cumul des mois.

dans le fichier Apports YTD il y'a trois mois et non pas un seul comme dans le premier exemple.
dans le fichier AP5 la feuille concernée est Achat YTD,

c'est ce qui faut faire c'est :
- dans le premier tableau de la feuille Achat YTD classer les fournisseurs par les quantités en cumul dans les trois mois dont l'article est ENTIER (pareille pour le 2ème tableau Article DECHET)

- puis dans les cellules de la colonne E de la feuille Achat YTD mettre la moyenne du coût d'achat dans les trois mois (7,8,9) dont l'article est Entier (pareille pour le 2ème tableau Article DECHET)

- pour le 3ème tableau c'est classer les fournisseurs par quantités les plus élévés pour les trois mois et les deux articles.

NB: le fichier Apports YTD peut contenir les 12 mois.

j'espère de tout mon cœur que ce soit possible et facile de faire un 2ème code pour le cumul en modifiant le 1er, si non de modifier le 1er de façon remplir les deux feuilles Achat Mois et Achat YTD à la fois, c'est à dire si on a un fichier Apports YTD avec plusieurs Mois, dans la feuille Achat Mois on met les valeurs du dernier mois et dans la feuille Achat YTD on met le cumul.

dans l'attente de votre retour je vous remercie encore une autre fois pour votre travail efficace.
 

Pièces jointes

  • Apports YTD.xlsx
    25.6 KB · Affichages: 4
  • AP 5.xlsm
    40.7 KB · Affichages: 2

job75

XLDnaute Barbatruc
Bonsoir an@s,

Pour ce 2ème problème c'est un peu plus compliqué mais les codes sont voisins de ceux du 1er :
VB:
Sub Importer_Periode()
Dim chemin$, fichier, F As Worksheet, a, n%, i&, deb&, fin&, dest As Range, j&, h%, P As Range, Q As Range
chemin = ThisWorkbook.Path & "\" 'à adapter
fichier = "Apports YTD.xlsx"
If Dir(chemin & fichier) = "" Then MsgBox "Fichier '" & fichier & "' introuvable !", 48: Exit Sub
Set F = ActiveSheet
a = Array("DECHET", "ENTIER")
Application.ScreenUpdating = False
F.[C42:C51,D42:E52,K42:K51,L42:M52,S42:S51,T42:T52].ClearContents 'RAZ
On Error Resume Next 'si le fichier n'est pas ouvert
Workbooks(fichier).Close False 'si le fichier est ouvert on le ferme
On Error GoTo 0
With Workbooks.Open(chemin & fichier).Sheets(1) 'ouverture du fichier source
    '---préparation---
    .Cells.UnMerge 'défusionne les cellules pour permettre les tris
    For n = 0 To UBound(a)
        i = Application.Match(a(n), .Columns(3), 0)
        If n = 0 Then deb = i Else If i < deb Then deb = i 'détermine la ligne du début
    Next n
    With .Columns("A:C")
        .Replace "*Total", "#N/A", xlWhole
        .SpecialCells(xlCellTypeConstants, 16).EntireRow.Delete 'supprime les lignes des Total
    End With
    fin = .Cells(.Rows.Count, 4).End(xlUp).Row 'détermine la ligne de fin
    For i = deb + 1 To fin
        If .Cells(i, 3) = "" Then .Cells(i, 3) = .Cells(i - 1, 3) 'remplit les cellules vides en colonne C
    Next i
    .Rows(deb & ":" & fin).Sort .Columns(3), Header:=xlNo 'tri pour regrouper les DECHET et les ENTIER
    '---1er et 2ème tableaux---
    For n = 0 To UBound(a)
        Set dest = IIf(n, F.[C42], F.[K42]) '1ère cellule de destination
        i = Application.Match(a(n), .Columns(3), 0) 'EQUIV
        j = i + Application.CountIf(.Columns(3), a(n)) - 1 'NB.SI
        With .Rows(i & ":" & j)
            .Sort .Columns(4), Header:=xlNo 'tri alphabétique
            For i = 2 To .Rows.Count
                If UCase(.Cells(i - 1, 4)) = UCase(.Cells(i, 4)) Then
                    .Cells(i, 6) = .Cells(i, 6) + .Cells(i - 1, 6) 'consolidation
                    .Rows(i - 1).ClearContents 'effacement
                End If
            Next i
            .Sort .Columns(6), xlDescending, Header:=xlNo 'tri décroissant sur la colonne F
            h = IIf(.Rows.Count > 10, 10, .Rows.Count)
            dest.Resize(h) = .Columns(4).Resize(h).Value 'D
            dest(1, 2).Resize(h) = .Columns(6).Resize(h).Value 'F
            dest(1, 3).Resize(h) = .Columns(16).Resize(h).Value 'P
            If .Rows.Count > 10 Then 'Autres
                Set P = .Columns(6).Offset(10).Resize(.Rows.Count - 10)
                dest(11, 2) = Application.Sum(P) 'somme sur F
                If dest(11, 2) Then
                    Set Q = .Columns(16).Offset(10).Resize(.Rows.Count - 10)
                    dest(11, 3) = Application.SumProduct(P, Q) / dest(11, 2) 'moyenne pondérée
                End If
            End If
        End With
    Next n
    '---3ème tableau---
    Set dest = F.[S42] '1ère cellule de destination
    With .Rows(deb & ":" & fin)
        .Sort .Columns(4), Header:=xlNo 'tri alphabétique de l'ensemble des tableaux
        For i = 2 To .Rows.Count
            If UCase(.Cells(i - 1, 4)) = UCase(.Cells(i, 4)) Then
                .Cells(i, 6) = .Cells(i, 6) + .Cells(i - 1, 6) 'consolidation
                .Rows(i - 1).ClearContents 'effacement
            End If
        Next i
        .Sort .Columns(6), xlDescending, Header:=xlNo 'tri décroissant sur la colonne F
        h = IIf(.Rows.Count > 10, 10, .Rows.Count)
        dest.Resize(h) = .Columns(4).Resize(h).Value 'D
        dest(1, 2).Resize(h) = .Columns(6).Resize(h).Value 'F
        If .Rows.Count > 10 Then 'Autres
            Set P = .Columns(6).Offset(10).Resize(.Rows.Count - 10)
            dest(11, 2) = Application.Sum(P) 'somme sur F
        End If
    End With
     '---fermeture du fichier source---
    .Parent.Close False
End With
End Sub
Fichier (5).

A+
 

Pièces jointes

  • AP(5).xlsm
    48.4 KB · Affichages: 8
  • Apports YTD.xlsx
    25.9 KB · Affichages: 3

an@s

XLDnaute Occasionnel
Bonsoir Mr Job,

je vous remercie pour la promptitude et l'efficacité de votre réponse,
c'est bien ce que je voulais, j'ai juste une petite question par rapport au coût d'achat comment vous avez fait pour le calculer ? je ne tombe pas sur les mêmes chiffres

Merci beaucoup
 

job75

XLDnaute Barbatruc
Bonjour an@s, le forum,

Juste une précision.

Pour un fournisseur donné le cout d'achat retenu par la macro est celui du dernier mois.

Ce n'est pas illogique puisque c'est la dernière valeur connue.

Et sur le fichier Apports YTD.xlsx ça n'a pas d'importance puisqu'elle ne varie pas d'un mois sur l'autre.

Si elle variait on pourrait calculer la moyenne pondérée mais ce n'est pas simple.

A+
 
Dernière édition:

an@s

XLDnaute Occasionnel
Bonjour Mr Job,

pour le coût d'achat de la ligne Autre il est juste par contre je n'ai pas compris que vous avez fait pour le calcul de E42 de la feuille Achat YTD (SAMIKO),

aufait le code affiche 2400 parce que dans les trois mois nous avons le même coût d'achat qui est 2400,
par contre si je change les valeurs de chaque mois pour SAMIKO, (1600 dans juillet, 1900 dans Août, 2100 dans Septembre) E42 de la feuille Achat YTD affiche 2100 c'est à dire la valeur du dernier mois chose qui est fausse,

parque dans E42 il faut aussi faire SOMMEPROD des trois mois
 

an@s

XLDnaute Occasionnel
ah voilà, on a écrit en même temps,
aufait je me suis cassé la t^te pour comprendre le code prend juste le dernier mois depuis plus qu'une en changeant les valeurs des trois mois

et comme le coût d'achat peut varier d'un mois un autre selon le fournisseur, il est indispensable de faire la moyenne aussi
 

job75

XLDnaute Barbatruc
Non ce n'est pas du tout indispensable d'utiliser la moyenne pondérée, il est logique d'utiliser la dernière valeur connue, c'est courant quand on fait un bilan en fin de période.

J'ai essayé de calculer la moyenne pondérée mais je n'y arrive pas.
 

an@s

XLDnaute Occasionnel
re,

aufait je dis indispensable dans la mesure ou on doit analyser le coût d'achat de certains fournisseurs qui varient d'un mois à un autre, et il varient non pas selon le prix d'achat mais ils existent d'autres impact comme la main d'oeuvre ...ect
en revanche pour l'analyse du bilan en fin de période on se base sur le dernier, vous avez raison

si vous n y'arrivez pas je vais le faire manuellement même si ça me prend beaucoup de temps

je vous remercie déjà pour ces deux jolis codes, et pour le travail excellent que vous me faites à chaque fois.

Amicalement,
An@s
 

job75

XLDnaute Barbatruc
Bon je suis arrivé à calculer la moyenne pondérée du coût d'achat, testez ce fichier (6) :
VB:
Sub Importer_Periode()
Dim chemin$, fichier, F As Worksheet, a, n%, i&, deb&, fin&, dest As Range, j&, h%, P As Range, s#, Q As Range
chemin = ThisWorkbook.Path & "\" 'à adapter
fichier = "Apports YTD.xlsx"
If Dir(chemin & fichier) = "" Then MsgBox "Fichier '" & fichier & "' introuvable !", 48: Exit Sub
Set F = ActiveSheet
a = Array("DECHET", "ENTIER")
Application.ScreenUpdating = False
F.[C42:C51,D42:E52,K42:K51,L42:M52,S42:S51,T42:T52].ClearContents 'RAZ
On Error Resume Next 'si le fichier n'est pas ouvert
Workbooks(fichier).Close False 'si le fichier est ouvert on le ferme
On Error GoTo 0
With Workbooks.Open(chemin & fichier).Sheets(1) 'ouverture du fichier source
    '---préparation---
    .Cells.UnMerge 'défusionne les cellules pour permettre les tris
    For n = 0 To UBound(a)
        i = Application.Match(a(n), .Columns(3), 0)
        If n = 0 Then deb = i Else If i < deb Then deb = i 'détermine la ligne du début
    Next n
    With .Columns("A:C")
        .Replace "*Total", "#N/A", xlWhole
        .SpecialCells(xlCellTypeConstants, 16).EntireRow.Delete 'supprime les lignes des Total
    End With
    fin = .Cells(.Rows.Count, 4).End(xlUp).Row 'détermine la ligne de fin
    For i = deb + 1 To fin
        If .Cells(i, 3) = "" Then .Cells(i, 3) = .Cells(i - 1, 3) 'remplit les cellules vides en colonne C
    Next i
    .Rows(deb & ":" & fin).Sort .Columns(3), Header:=xlNo 'tri pour regrouper les DECHET et les ENTIER
    '---1er et 2ème tableaux---
    For n = 0 To UBound(a)
        Set dest = IIf(n, F.[C42], F.[K42]) '1ère cellule de destination
        i = Application.Match(a(n), .Columns(3), 0) 'EQUIV
        j = i + Application.CountIf(.Columns(3), a(n)) - 1 'NB.SI
        With .Rows(i & ":" & j)
            .Sort .Columns(4), Header:=xlNo 'tri alphabétique
            For i = 2 To .Rows.Count
                If UCase(.Cells(i - 1, 4)) = UCase(.Cells(i, 4)) Then
                    h = Application.CountIf(.Columns(4), .Cells(i, 4)) '3 sur l'exemple
                    j = i + h - 2 'dernière ligne du même fournisseur
                    Set P = .Cells(i - 1, 6).Resize(h)
                    s = Application.Sum(P) 'somme sur F
                    If s Then
                        Set Q = .Cells(i - 1, 16).Resize(h)
                        .Cells(j, 16) = Application.SumProduct(P, Q) / s 'moyenne pondérée sur P
                    End If
                    .Cells(j, 6) = s 'consolidation
                    .Rows(i - 1).Resize(h - 1).ClearContents 'effacement
                    i = j
                End If
            Next i
            .Sort .Columns(6), xlDescending, Header:=xlNo 'tri décroissant sur la colonne F
            h = IIf(.Rows.Count > 10, 10, .Rows.Count)
            dest.Resize(h) = .Columns(4).Resize(h).Value 'D
            dest(1, 2).Resize(h) = .Columns(6).Resize(h).Value 'F
            dest(1, 3).Resize(h) = .Columns(16).Resize(h).Value 'P
            If .Rows.Count > 10 Then 'Autres
                Set P = .Columns(6).Offset(10).Resize(.Rows.Count - 10)
                dest(11, 2) = Application.Sum(P) 'somme sur F
                If dest(11, 2) Then
                    Set Q = .Columns(16).Offset(10).Resize(.Rows.Count - 10)
                    dest(11, 3) = Application.SumProduct(P, Q) / dest(11, 2) 'moyenne pondérée sur P
                End If
            End If
        End With
    Next n
    '---3ème tableau---
    Set dest = F.[S42] '1ère cellule de destination
    With .Rows(deb & ":" & fin)
        .Sort .Columns(4), Header:=xlNo 'tri alphabétique de l'ensemble des tableaux
        For i = 2 To .Rows.Count
            If UCase(.Cells(i - 1, 4)) = UCase(.Cells(i, 4)) Then
                .Cells(i, 6) = .Cells(i, 6) + .Cells(i - 1, 6) 'consolidation
                .Rows(i - 1).ClearContents 'effacement
            End If
        Next i
        .Sort .Columns(6), xlDescending, Header:=xlNo 'tri décroissant sur la colonne F
        h = IIf(.Rows.Count > 10, 10, .Rows.Count)
        dest.Resize(h) = .Columns(4).Resize(h).Value 'D
        dest(1, 2).Resize(h) = .Columns(6).Resize(h).Value 'F
        If .Rows.Count > 10 Then 'Autres
            Set P = .Columns(6).Offset(10).Resize(.Rows.Count - 10)
            dest(11, 2) = Application.Sum(P) 'somme sur F
        End If
    End With
     '---fermeture du fichier source---
    .Parent.Close False
End With
End Sub
 

Pièces jointes

  • AP(6).xlsm
    49 KB · Affichages: 5
  • Apports YTD.xlsx
    25.9 KB · Affichages: 3

an@s

XLDnaute Occasionnel
Bonjour Mr Job,

je reviens vers vous pour une rectification si c'est possible,
dans le fichier apport j'ai du rajouté la colonne F (origine appr), et dans le fichier AP j'ai rajouté la feuille RECAP.

maintenant ce que je souhaite faire c'est d'avoir un code qui permet d'importer en premier lieu les colonnes A, C, D, F, I, J, L, P, T, à partir de la ligne 9 du fichier Apport et les coller dans les colonnes A, B, C, D, E, F, G, H, I de la feuille RECAP du fichier AP à partir de la ligne 9.

NB: - les colonnes J vers M en jaune de la feuille RECAP je les ai crées manuellement
- ne pas importer la ligne total fournisseur comme la ligne 18, 49 du fichier Apport par exemple
- les cellules vides de la colonne D du fichier apports comme D17, D47, D48 après importation il faut leur donner le nom du fournisseur du dessus, (D17 prendra le nom de D16, D56 prendra le nom de D55 ect)

après cette importation juste en cliquant sur la feuille Achats Mois les deux tableaux se mettent à jour automatiquement avec les mêmes principes de notre code, en mettant les donnes des colonnes C, E, G, M, de la feuille RECAP dans C,D,E,F, et L,M,N,O de la feuille Achats Mois (en se basant juste sur le dernier mois du tableau de la feuille RECAP qui est 11 c'est à dire les données concernées c'est à partir de 112)
et en cliquant sur la feuille Achats YTD les tableaux se mettent à jour aussi de la même manière, mais cette fois pour tous les mois

je vous remercie
 

Pièces jointes

  • AP.xlsm
    62.3 KB · Affichages: 2
  • Apports.xlsx
    28.4 KB · Affichages: 3

Discussions similaires

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16