IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Manipulation de donnée - Inventaire


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2021
    Messages : 3
    Par défaut Manipulation de donnée - Inventaire
    Bonjour à tous,

    J'essai désespérément d'automatiser la récupération de donnée de plusieurs classeurs pour les rassembler en un point.
    Je vous explique, j'ai la possibilité de faire une extraction des stocks de mon entrepôt chaque mois. J'obtiens ainsi un fichier à deux colonnes A (Référence du produit) et B (Quantité en stock).

    Mon souhait est de pouvoir avoir un fichier indépendant sur lequel je puisse rajouter le stock mois par mois facilement sachant que certaines références peuvent être à 0 et donc ne pas apparaitre sur l'inventaire d'un mois et réapparaitre sur le mois suivant.

    Mon classeur final doit se présenter sous la forme : A (Référence) B(Stock Janvier) C (Stock Février) D (Stock Mars) ...
    J'aurai souhaité avoir une macro qui récupère les valeurs du stock et la copie en face de la bonne référence automatiquement.

    J'ai essayé avec l'aide de conditions et boucles mais j'ai l'impression de ne pas arriver à clôturer cette fonction car elle tourne en boucle et me fait planter excel.

    Avez vous des pistes pour m'aiguiller ? Peut être que je me casse la tête pour rien

    Merci de votre aide
    Images attachées Images attachées  

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2021
    Messages
    334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2021
    Messages : 334
    Par défaut
    Salut, c'est possible d'avoir un fichier en exemple ?

    J'ai déjà un code qui fait a peu prés la même chose (que je viens de modifier) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Sub test()
    Dim cheminFichier As String
    Dim wb As Workbook
    Dim TabData(1 To 3) As Variant
    Dim xlapp As Excel.Application
    Dim derniereLigne As Integer
    Dim dateData As Date
     
    dateData = Date
     
    Set xlapp = CreateObject("Excel.Application")
    xlapp.Visible = False
     
    Set wb = xlapp.Workbooks.Open(Application.GetOpenFilename("Tous les fichiers (*.*),*.*"))
     
    derniereLigne = wb.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).row
     
    For i = 2 To derniereLigne
        Erase TabData
        TabData(1) = dateData
        TabData(2) = wb.ActiveSheet.Cells(i, 1)
        TabData(3) = wb.ActiveSheet.Cells(i, 2)
        ajoutLigne TabData(), "BDD_stock", Feuil2
    Next i
     
    wb.Close False
    xlapp.Quit
     
    End Sub
     
     
    Function ajoutLigne(CellV(), NomTab As String, feuille As Worksheet)
    Dim row As ListRow
    Dim table As ListObject
    Set table = feuille.ListObjects(NomTab)
    Set row = table.ListRows.Add()
    For i = 1 To UBound(CellV)
    If IsEmpty(CellV(i)) Then
        GoTo saut
    Else
        row.Range.Cells(i).Value = CellV(i)
    End If
    saut:
    Next i
    End Function
    Il faut créer un tableau structuré ici nommé "BDD_stock" avec 3 colonnes : date, ref, stock

    Il y a une incrémentation via tableau mais c'est seulement car j'ai utilisé une fonction d'incrémentation de tableau structuré que j'ai créée il y a un moment déjà (je m'en sers beaucoup d'ailleurs)

    En gros ici je viens demander a l'utilisateur de sélectionner un fichier à importer (je n'ai pas précisé de tri par extension car je ne connais pas celle que tu utilise), en suite ça vient chercher le nombre de lignes max dans le tableau et ça boucle sur chaque lignes pour les incrémenter dans ton tableau "BDD_stock".

    Le problème c'est que je viens inscrire la date au moment de l'importation car je ne sais pas comment récupérer celle du mois de ton fichier, il serait bien de le rajouter dans l'importation (colonne supp). Pour le faire de manière rétroactive il faudrait demander a l'utilisateur de l'entrer (via datePicker du pack de fonctions xlp par exemple https://www.excel-pratique.com/fr/fo...es/date-picker)

  3. #3
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2021
    Messages : 3
    Par défaut Fichier
    Tiens j'ai mis les deux fichiers que j'extrais chaque mois
    Fichiers attachés Fichiers attachés

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2021
    Messages
    334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2021
    Messages : 334
    Par défaut
    Voila j'ai fait une macro qui importe dans un tableau en 4 colonnes (qu'il va falloir créer dans une feuille et le nommer "BDD_stock")

    Comme ceci :

    Nom : tableau.GIF
Affichages : 82
Taille : 8,8 Ko

    Ça va importer tes fichier, par contre je vois que tu as un grand nombre de lignes par fichier (plus de 4000) donc ça fait a peu prés 20 ans car 1 048 000/4200/12 = 20.

    Les extractions son un peu longues également (2 minutes par fichier avec mon i5-4300u). Il existe surement des méthodes plus rapides et moins gourmandes en ressources matérielles (power querry) mais je ne les connais pas, il faudra voir avec les autres (ca m’intéresse aussi d'ailleurs)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Sub test()
    Dim cheminFichier As Variant
    Dim wb As Workbook
    Dim TabData(1 To 4) As Variant
    Dim xlapp As Excel.Application
    Dim derniereLigne As Integer
    Dim mois As Integer
    Dim annee As Integer
     
    cheminFichier = Application.GetOpenFilename(" Fichiers CSV (*.csv), *.csv")
    If cheminFichier = False Then GoTo fin
    mois = Mid(cheminFichier, Len(cheminFichier) - 7, 2)
    annee = Mid(cheminFichier, Len(cheminFichier) - 5, 2)
     
    Set xlapp = CreateObject("Excel.Application")
    xlapp.Visible = False
     
    Set wb = xlapp.Workbooks.Open(cheminFichier, , True, 4, , , , , , , , , , True)
     
    derniereLigne = wb.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).row
     
    Application.Calculation = XlCalculation.xlCalculationManual
     
    For i = 2 To derniereLigne
        Erase TabData
        TabData(1) = mois
        TabData(2) = annee
        TabData(3) = wb.ActiveSheet.Cells(i, 1)
        TabData(4) = wb.ActiveSheet.Cells(i, 2)
        ajoutLigne TabData(), "BDD_stock", Feuil2
    Next i
     
    Application.Calculation = XlCalculation.xlCalculationAutomatic
     
    wb.Close False
    xlapp.Quit
    fin:
     
    End Sub
     
     
    Function ajoutLigne(CellV(), NomTab As String, feuille As Worksheet)
    Dim row As ListRow
    Dim table As ListObject
    Set table = feuille.ListObjects(NomTab)
    Set row = table.ListRows.Add()
    For i = 1 To UBound(CellV)
        row.Range.Cells(i).Value = CellV(i)
    Next i
    End Function
    Et en suite tu fais un second tableau qui ventile le premier sur tes mois de l'année, il faut faire un tableau par an je pense comme ceci :

    Nom : import.GIF
Affichages : 84
Taille : 143,8 Ko

    Chaque mois quand tu vas importer il va se remplir.

  5. #5
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2021
    Messages : 3
    Par défaut
    Citation Envoyé par ChristianBosch Voir le message
    Salut, c'est possible d'avoir un fichier en exemple ?

    J'ai déjà un code qui fait a peu prés la même chose (que je viens de modifier) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Sub test()
    Dim cheminFichier As String
    Dim wb As Workbook
    Dim TabData(1 To 3) As Variant
    Dim xlapp As Excel.Application
    Dim derniereLigne As Integer
    Dim dateData As Date
     
    dateData = Date
     
    Set xlapp = CreateObject("Excel.Application")
    xlapp.Visible = False
     
    Set wb = xlapp.Workbooks.Open(Application.GetOpenFilename("Tous les fichiers (*.*),*.*"))
     
    derniereLigne = wb.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).row
     
    For i = 2 To derniereLigne
        Erase TabData
        TabData(1) = dateData
        TabData(2) = wb.ActiveSheet.Cells(i, 1)
        TabData(3) = wb.ActiveSheet.Cells(i, 2)
        ajoutLigne TabData(), "BDD_stock", Feuil2
    Next i
     
    wb.Close False
    xlapp.Quit
     
    End Sub
     
     
    Function ajoutLigne(CellV(), NomTab As String, feuille As Worksheet)
    Dim row As ListRow
    Dim table As ListObject
    Set table = feuille.ListObjects(NomTab)
    Set row = table.ListRows.Add()
    For i = 1 To UBound(CellV)
    If IsEmpty(CellV(i)) Then
        GoTo saut
    Else
        row.Range.Cells(i).Value = CellV(i)
    End If
    saut:
    Next i
    End Function
    Il faut créer un tableau structuré ici nommé "BDD_stock" avec 3 colonnes : date, ref, stock

    Il y a une incrémentation via tableau mais c'est seulement car j'ai utilisé une fonction d'incrémentation de tableau structuré que j'ai créée il y a un moment déjà (je m'en sers beaucoup d'ailleurs)

    En gros ici je viens demander a l'utilisateur de sélectionner un fichier à importer (je n'ai pas précisé de tri par extension car je ne connais pas celle que tu utilise), en suite ça vient chercher le nombre de lignes max dans le tableau et ça boucle sur chaque lignes pour les incrémenter dans ton tableau "BDD_stock".

    Le problème c'est que je viens inscrire la date au moment de l'importation car je ne sais pas comment récupérer celle du mois de ton fichier, il serait bien de le rajouter dans l'importation (colonne supp). Pour le faire de manière rétroactive il faudrait demander a l'utilisateur de l'entrer (via datePicker du pack de fonctions xlp par exemple https://www.excel-pratique.com/fr/fo...es/date-picker)

    Waw je comprend pas la moitié de la macro, je crois que je suis loin des compétences requises pour faire cette action mdr

Discussions similaires

  1. [C#] [ADO.NET] Manipulation de données
    Par Tips dans le forum Accès aux données
    Réponses: 2
    Dernier message: 20/02/2006, 16h28
  2. [VBA]SQL dans Excel manipulation de données
    Par Deejoh dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 08/02/2006, 16h56
  3. manipulation de données
    Par philpaul dans le forum Access
    Réponses: 10
    Dernier message: 03/10/2005, 09h54
  4. Manipulation de données binaires
    Par Defre87 dans le forum Général Python
    Réponses: 3
    Dernier message: 28/09/2005, 16h16
  5. [xml]manipuler des données xml sous Oracle9i
    Par crazy dans le forum SQL
    Réponses: 7
    Dernier message: 28/02/2004, 11h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo