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

IHM Discussion :

Manipulation de données d'un fichier excel


Sujet :

IHM

  1. #1
    Membre régulier Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    Points : 102
    Points
    102
    Par défaut Manipulation de données d'un fichier excel
    Bon, là je vais éssayer d'être clair parce que le problème est "touchy"!
    Je dois importer plusieurs fichiers excel à l'interieur se trouve des feuilles. Dans ces feuilles il y a plusieurs tableaux avec un nombre de colonnes variables (, oui parce que sinon c'est trop simple !!).
    Je voudrais obtenir un fichier avec les mêmes informations, mais sous forme de colonnes.

    AS IS
    Nom : Congelos_ASIS_DvpCom.png
Affichages : 163
Taille : 27,4 Ko
    TO BE
    Nom : Congelos_TOBE_DvpCom.png
Affichages : 147
Taille : 12,4 Ko


    Fichier Excel avec l'exemple plus clair.

    Developpez_com.xlsx
    Ma question est simple en fait, Est ce faisable?
    J'ai cherché mais je n'ai rien trouvé, même sur du "transpose".
    Si quelqu'un a une idée, je suis preneur.

    D'avance un grand merci

    Totor

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 345
    Points : 23 805
    Points
    23 805
    Par défaut
    Bonjour.

    Oui c'est faisable mais pas avec les outils standards.

    Mais avec VBA, tu ouvrir un fichier Excel, puis lire cellule par cellule le contenu d'une feuille.
    Donc tu peux programmer la lecture de tes données pour ensuite les mettre en colonne.

    Est-ce que tu peux modifier le fichier Excel ? Si oui, cela serait sans doute plus facile à écrire que de passer par Access.

    Si tu as besoin de détails n'hésite pas à demander.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre régulier Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    Points : 102
    Points
    102
    Par défaut
    Merci marot_r,
    J'étais parti là dessus (lecture de chaque champ) et ensuite requete d'ajout et de Mise à Jour.
    C'est laborieux... mais je crois que je n'ai pas le choix
    Il y a une feuille par jour de la semaine, et chaque feuille contient en moyenne une quinzaine de tableaux.
    C'est la misère
    Le fichier excel est multi sites et donc.... difficile de changer des habitudes qui sont là depuis la nuit des temps.
    Tant pis, la nuit va être longue
    .

    Merci
    Totor

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 345
    Points : 23 805
    Points
    23 805
    Par défaut
    Bonjour.

    Si ta structure est bien répétitive comme dans ton exemple, tu dois pouvoir faire un programme qui va :
    1. Trouver une entête de tableau
    2. Compter le nombre de colonne
    3. Recopier les données colonne par colonne, jusqu'à ce que tu trouves une ligne blanche.
    4. Répéter jusqu'à ce qu'il n'y ai plus de tableau dans la feuille.
    5. Passer à la feuille suivante jusqu'à ce qu'il n'y ai plus de feuille.


    Ça ne va sans doute pas être super-rapide à l'exécution mais pas trop compliqué à écrire.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 759
    Points : 14 793
    Points
    14 793
    Par défaut
    bonjour, marot_r et totor92290,
    je rebondis sur dernier post pour proposer ce code qui fait ce qui vient d'être décrit par marot_r, et pour autant que chaque classeur et chaque respecte bien le schéma défini :
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    Function ImportFeuillesXLS(pNomClasXLS As String)
    '----------------------------------------------------
    ' paramètres:
    ' pNomClasXLS :nom du classeur avec chemin complet
    '----------------------------------------------------
     
    Dim xlApp As New Excel.Application
    Dim xlWbk As Excel.Workbook
    Dim xlWsh As Excel.Worksheet
    Dim lgDerlig As Long
    Dim lgDerCol As Integer
    Dim F As Integer, C As Integer
    Dim J As Integer, K As Integer, L As Integer
    Dim strProduit As String           ' Nom du produit
     
    Dim stListeRef As String           ' liste REF et tableau associé
    Dim tabloRef() As String
    Dim stListeValRef As String        ' liste valeurs REF et tableau associé
    Dim tabloValRef() As String
    Dim oRst As Recordset
     
    Set xlWbk = xlApp.Workbooks.Open(pNomClasXLS)
     
    '-----------------------------------------------------
    ' Excel visible pour les tests
    'xlApp.Visible = True
     
    ' Ouverture table
    Set oRst = CurrentDb.OpenRecordset("tbl_Produits", dbOpenDynaset)
     
    For F = 1 To xlWbk.Sheets.Count
        ' chargement de la 1ère feuille
        Set xlWsh = xlWbk.Worksheets(F)
     
        ' dernière ligne utile de la feuille
        lgDerlig = xlWsh.UsedRange.Rows.Count
        ' dernière colonne utile de la feuille
        lgDerCol = xlWsh.UsedRange.Columns.Count
     
        For L = 1 To lgDerlig
            ' rupture sur le type de produit
            If xlWsh.Cells(L, 1) <> "" And Left(xlWsh.Cells(L, 1), 9) <> "CONDITION" Then
                If xlWsh.Cells(L, 1) <> strProduit Then
                    strProduit = xlWsh.Cells(L, 1)
                End If
            Else
            'copie des colonnes
                If xlWsh.Cells(L, 1) = "CONDITIONNEMENT" Then
                    stListeRef = ""
     
                    For C = 1 To lgDerCol
                        If Left(xlWsh.Cells(L, C), 3) = "REF" Then
                            stListeRef = stListeRef & xlWsh.Cells(L, C) & "|"
                        End If
                    Next C
                    ' tableau des REFx
                    tabloRef = Split(CStr(Left(stListeRef, Len(stListeRef) - 1)), "|")
     
                    ReDim Preserve tabloRef(UBound(tabloRef))
                Else
                    ' tableau des valeurs: 2 fois le nombre de REF + la colonne 1
                    If xlWsh.Cells(L, 1) <> "" Then
                        For C = 0 To (UBound(tabloRef) + 1) * 2
                            stListeValRef = stListeValRef & xlWsh.Cells(L, C + 1) & "|"
                        ' colonne suivante
                        Next C
                        ' remplissage du tableau et redimensionnement
                        tabloValRef = Split(CStr(Left(stListeValRef, Len(stListeValRef) - 1)), "|")
                        ReDim Preserve tabloValRef(UBound(tabloValRef))
     
    ' Chargement des données dans la table
                        ' traitement pour une ligne de la feuille
                        For K = 1 To UBound(tabloRef) + 1
                            oRst.AddNew
                            oRst.Fields("Produit") = strProduit                     'ex.: Congélateur1
                            oRst.Fields("Conditionnement") = tabloValRef(0)        'ex.: CONDITIONNEMENT1
                            oRst.Fields("Ref") = tabloRef(K - 1)                     'ex.: REF1 du tableau tabloRef
                            oRst.Fields("ValRef1") = Val(tabloValRef(K * 2 - 1))    'ex.: 100 du tableau tabloValRef
                            oRst.Fields("ValRef2") = Val(tabloValRef(K * 2))    'ex.: 30 du tableau tabloValRef
                            oRst.Update
                        Next K
                    ' vidage des valeurs
                        stListeValRef = ""
                    End If      'If xlwsh.Cells(L, 1) <> ""
     
                End If          'If xlwsh.Cells(L, 1) = "CONDITIONNEMENT"
            End If              'If xlwsh.Cells(L, 1) <> "" And Left(xlwsh.Cells(L, 1), 9) <> "CONDITION"
        ' ligne suivante
        Next L
     
    ' feuille suivante, initialisation des variables
        strProduit = ""
        stListeRef = ""
        stListeValRef = ""
    Next F
     
    ' fermeture des objets
    Set oRst = Nothing
    xlWbk.Close
    xlApp.Quit
     
    End Function
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 345
    Points : 23 805
    Points
    23 805
    Par défaut
    Bonjour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabloRef = Split(CStr(Left(stListeRef, Len(stListeRef) - 1)), "|")
    Chouette truc pour s'éviter un redim.

    Perso j'utilise de plus en plus les collections à la place des tableaux et je soupçonne VBA d'implanter les tableaux comme des collections depuis que j'ai lu quelque part qu'on peut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim monTableau(10) as string
    dim itemTableau as variant
     
    for each itemTableau in monTableau
       debug.print itemTableau
    next itemTableau
    Donc pas de compteur de boucle ni de récupération des bornes.

    Et pour le parcours des feuilles d'un classeur on peut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    dim classeur as Excel.Workboook
    'ici du code pour assigner classeur
    dim feuille as Excel.Worksheet
     
    for each feuille in classeur.Worksheets
        debug.print feuille.name
    next feuille
    Ça évite d'avoir à gérer 2 variables : le compteur et la feuille.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 759
    Points : 14 793
    Points
    14 793
    Par défaut
    Merci marot_r pour ces quelques précisions et corrections.
    C'est sûr, un code est toujours perfectible et il est vrai que je ne suis pas non plus un grand expert des tableaux, je me contente en général, d'une seule dimension et c'est déjà pas mal ...

    Si cela dit à quelqu'un d'améliorer ce code ce serait sans regret de ma part ...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  8. #8
    Membre régulier Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    Points : 102
    Points
    102
    Par défaut
    Un grand GRAND merci à tous les deux!!!
    Bon pour être franc je n'ai pas tout compris!
    J'ai "bêtement" copier le code de tee_grandbois
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    Function ImportFeuillesXLS(pNomClasXLS As String)
    '----------------------------------------------------
    ' paramètres:
    ' pNomClasXLS :nom du classeur avec chemin complet
    '----------------------------------------------------
     
    Dim xlApp As New Excel.Application
    Dim xlWbk As Excel.Workbook
    Dim xlWsh As Excel.Worksheet
    Dim lgDerlig As Long
    Dim lgDerCol As Integer
    Dim F As Integer, C As Integer
    Dim J As Integer, K As Integer, L As Integer
    Dim strProduit As String           ' Nom du produit
     
    Dim stListeRef As String           ' liste REF et tableau associé
    Dim tabloRef() As String
    Dim stListeValRef As String        ' liste valeurs REF et tableau associé
    Dim tabloValRef() As String
    Dim oRst As Recordset
     
    Set xlWbk = xlApp.Workbooks.Open(pNomClasXLS)
     
    '-----------------------------------------------------
    ' Excel visible pour les tests
    'xlApp.Visible = True
     
    ' Ouverture table
    Set oRst = CurrentDb.OpenRecordset("tbl_Produits", dbOpenDynaset)
     
    For F = 1 To xlWbk.Sheets.Count
        ' chargement de la 1ère feuille
        Set xlWsh = xlWbk.Worksheets(F)
     
        ' dernière ligne utile de la feuille
        lgDerlig = xlWsh.UsedRange.Rows.Count
        ' dernière colonne utile de la feuille
        lgDerCol = xlWsh.UsedRange.Columns.Count
     
        For L = 1 To lgDerlig
            ' rupture sur le type de produit
            If xlWsh.Cells(L, 1) <> "" And Left(xlWsh.Cells(L, 1), 9) <> "CONDITION" Then
                If xlWsh.Cells(L, 1) <> strProduit Then
                    strProduit = xlWsh.Cells(L, 1)
                End If
            Else
            'copie des colonnes
                If xlWsh.Cells(L, 1) = "CONDITIONNEMENT" Then
                    stListeRef = ""
     
                    For C = 1 To lgDerCol
                        If Left(xlWsh.Cells(L, C), 3) = "REF" Then
                            stListeRef = stListeRef & xlWsh.Cells(L, C) & "|"
                        End If
                    Next C
                    ' tableau des REFx
                    tabloRef = Split(CStr(Left(stListeRef, Len(stListeRef) - 1)), "|")
     
                    ReDim Preserve tabloRef(UBound(tabloRef))
                Else
                    ' tableau des valeurs: 2 fois le nombre de REF + la colonne 1
                    If xlWsh.Cells(L, 1) <> "" Then
                        For C = 0 To (UBound(tabloRef) + 1) * 2
                            stListeValRef = stListeValRef & xlWsh.Cells(L, C + 1) & "|"
                        ' colonne suivante
                        Next C
                        ' remplissage du tableau et redimensionnement
                        tabloValRef = Split(CStr(Left(stListeValRef, Len(stListeValRef) - 1)), "|")
                        ReDim Preserve tabloValRef(UBound(tabloValRef))
     
    ' Chargement des données dans la table
                        ' traitement pour une ligne de la feuille
                        For K = 1 To UBound(tabloRef) + 1
                            oRst.AddNew
                            oRst.Fields("Produit") = strProduit                     'ex.: Congélateur1
                            oRst.Fields("Conditionnement") = tabloValRef(0)        'ex.: CONDITIONNEMENT1
                            oRst.Fields("Ref") = tabloRef(K - 1)                     'ex.: REF1 du tableau tabloRef
                            oRst.Fields("ValRef1") = Val(tabloValRef(K * 2 - 1))    'ex.: 100 du tableau tabloValRef
                            oRst.Fields("ValRef2") = Val(tabloValRef(K * 2))    'ex.: 30 du tableau tabloValRef
                            oRst.Update
                        Next K
                    ' vidage des valeurs
                        stListeValRef = ""
                    End If      'If xlwsh.Cells(L, 1) <> ""
     
                End If          'If xlwsh.Cells(L, 1) = "CONDITIONNEMENT"
            End If              'If xlwsh.Cells(L, 1) <> "" And Left(xlwsh.Cells(L, 1), 9) <> "CONDITION"
        ' ligne suivante
        Next L
     
    ' feuille suivante, initialisation des variables
        strProduit = ""
        stListeRef = ""
        stListeValRef = ""
    Next F
     
    ' fermeture des objets
    Set oRst = Nothing
    xlWbk.Close
    xlApp.Quit
     
    End Function
    Sans y comprendre grand chose, je l'avoue!
    J'ai ajouté ce code dans in module.
    Sur bouton click, je lance le module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Ajout_FichierExcel_Click()
    ImportFeuillesXLS
    End Sub
    et là patatra, message d'erreur...

    Nom : Compile error.png
Affichages : 150
Taille : 4,8 Ko

    Damned!

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 345
    Points : 23 805
    Points
    23 805
    Par défaut
    Bonjour.

    La fonction ImportFeuillesXLS(pNomClasXLS As String) attend le nom complet du classeur en paramètre or tu ne l'as pas indiqué dans ton code.

    Ca devrait ressembler à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call ImportFeuillesXLS("X:\TonChemin\TonFichier.Xlsx")
    ou si l'info est dans un champ de ton formulaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call ImportFeuillesXLS(Me.TonChampInfo)
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  10. #10
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 759
    Points : 14 793
    Points
    14 793
    Par défaut
    bonsoir marot_r et totor92290,

    @marot_r: pour ton retour ...

    @totor92290: même si j'ai oublié de mettre la procédure à suivre, il suffisait de lire les commentaires au début du code.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  11. #11
    Membre régulier Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    Points : 102
    Points
    102
    Par défaut
    Incroyable, ça fonctionne IMPEC!!!

    Un grand grand merci à tous les deux.

    Tee_granbois, désolé! en effet il y a tout ce qui faut (documenté) dans le code.pour comprendre

    Encore UN GRAND MERCI !!!!

  12. #12
    Membre régulier Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    Points : 102
    Points
    102
    Par défaut
    Bon... désolé...
    Le code fonctionne très bien avec mon exemple de Ref1;Ref2;Ref3...
    Mais j'ai utilise ces appellations pour l'exemple, mais en fait mes references sont les suivantes:
    1782 C2 1782B2 1782 A2 1773B2 MC 780 B1 1773A2 1782 C48 1782 C24 1782 C4 PR 1910,2 1782 C12

    Et là ça ne fonctionne plus!

    J'ai éssayé le passage ci-dessous, mais... ça a fait pchitt!
    même avec une seule ref ça ne fonctionne pas et l'utilisation du "or", non plus!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    If xlWsh.Cells(L, 1) = "CONDITIONNEMENT" Then
                    stListeRef = ""
     
                    For C = 1 To lgDerCol
                        'If xlWsh.Cells(L, C) = "1782 C2" Then
                        'If xlWsh.Cells(L, C) = "1782 C2" Or "1782B2" Or "1782 A2" Or "1773B2" Or "MC 780 B1" Then
                        'If Left(xlWsh.Cells(L, C), 3) = "REF" Then
                            stListeRef = stListeRef & xlWsh.Cells(L, C) & "|"
                        End If
                    Next C
                    ' tableau des REFx
                    tabloRef = Split(CStr(Left(stListeRef, Len(stListeRef) - 1)), "|")
     
                    ReDim Preserve tabloRef(UBound(tabloRef))
    Code complet:
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
     
     
    Sub ImportFeuillesXLS(pNomClasXLS As String)
    '----------------------------------------------------
    ' paramètres:
    ' pNomClasXLS :nom du classeur avec chemin complet
    '----------------------------------------------------
     
    Dim xlApp As New Excel.Application
    Dim xlWbk As Excel.Workbook
    Dim xlWsh As Excel.Worksheet
    Dim lgDerlig As Long
    Dim lgDerCol As Integer
    Dim F As Integer, C As Integer
    Dim J As Integer, K As Integer, L As Integer
    Dim strProduit As String           ' Nom du produit
    Dim stListeRef As String           ' liste REF et tableau associé
    Dim tabloRef() As String
    Dim stListeValRef As String        ' liste valeurs REF et tableau associé
    Dim tabloValRef() As String
    Dim oRst As Recordset
     
    Set xlWbk = xlApp.Workbooks.Open(pNomClasXLS)
     
    '-----------------------------------------------------
    ' Excel visible pour les tests
    xlApp.Visible = True
    ' Ouverture table
    Set oRst = CurrentDb.OpenRecordset("tbl_Produits", dbOpenDynaset)
    For F = 1 To xlWbk.Sheets.Count
        ' chargement de la 1ère feuille
        Set xlWsh = xlWbk.Worksheets(F)
        ' dernière ligne utile de la feuille
        lgDerlig = xlWsh.UsedRange.Rows.Count
        ' dernière colonne utile de la feuille
        lgDerCol = xlWsh.UsedRange.Columns.Count
        For L = 1 To lgDerlig
            ' rupture sur le type de produit
            If xlWsh.Cells(L, 1) <> "" And Left(xlWsh.Cells(L, 1), 9) <> "CONDITION" Then
                If xlWsh.Cells(L, 1) <> strProduit Then
                    strProduit = xlWsh.Cells(L, 1)
                End If
            Else
            'copie des colonnes
                If xlWsh.Cells(L, 1) = "CONDITIONNEMENT" Then
                    stListeRef = ""
     
                    For C = 1 To lgDerCol
                        'If xlWsh.Cells(L, C) = "1782 C2" Then
                        'If xlWsh.Cells(L, C) = "1782 C2" Or "1782B2" Or "1782 A2" Or "1773B2" Or "MC 780 B1" Then
                        If Left(xlWsh.Cells(L, C), 3) = "REF" Then
                            stListeRef = stListeRef & xlWsh.Cells(L, C) & "|"
                        End If
                    Next C
                    ' tableau des REFx
                    tabloRef = Split(CStr(Left(stListeRef, Len(stListeRef) - 1)), "|")
     
                    ReDim Preserve tabloRef(UBound(tabloRef))
     
     
                Else
                    ' tableau des valeurs: 2 fois le nombre de REF + la colonne 1
                    If xlWsh.Cells(L, 1) <> "" Then
                        For C = 0 To (UBound(tabloRef) + 1) * 2
                            stListeValRef = stListeValRef & xlWsh.Cells(L, C + 1) & "|"
                        ' colonne suivante
                        Next C
                        ' remplissage du tableau et redimensionnement
                        tabloValRef = Split(CStr(Left(stListeValRef, Len(stListeValRef) - 1)), "|")
                        ReDim Preserve tabloValRef(UBound(tabloValRef))
     
    ' Chargement des données dans la table
                        ' traitement pour une ligne de la feuille
                        For K = 1 To UBound(tabloRef) + 1
                            oRst.AddNew
                            oRst.Fields("Produit") = strProduit                     'ex.: Congélateur1
                            oRst.Fields("Conditionnement") = tabloValRef(0)        'ex.: CONDITIONNEMENT1
                            oRst.Fields("Ref") = tabloRef(K - 1)                     'ex.: REF1 du tableau tabloRef
                            oRst.Fields("ValRef1") = Val(tabloValRef(K * 2 - 1))    'ex.: 100 du tableau tabloValRef
                            oRst.Fields("ValRef2") = Val(tabloValRef(K * 2))    'ex.: 30 du tableau tabloValRef
                            oRst.Update
                        Next K
                    ' vidage des valeurs
                        stListeValRef = ""
                    End If      'If xlwsh.Cells(L, 1) <> ""
     
                End If          'If xlwsh.Cells(L, 1) = "CONDITIONNEMENT"
            End If              'If xlwsh.Cells(L, 1) <> "" And Left(xlwsh.Cells(L, 1), 9) <> "CONDITION"
        ' ligne suivante
        Next L
     
    ' feuille suivante, initialisation des variables
        strProduit = ""
        stListeRef = ""
        stListeValRef = ""
    Next F
     
    ' fermeture des objets
    Set oRst = Nothing
    xlWbk.Close
    xlApp.Quit
     
    End Sub
    Je ne sais pas ce qui coince!
    Si vous aviez une idée ?
    Merci
    Totor

  13. #13
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 759
    Points : 14 793
    Points
    14 793
    Par défaut
    Mais j'ai utilise ces appellations pour l'exemple, mais en fait mes references sont les suivantes:
    1782 C2 1782B2 1782 A2 1773B2 MC 780 B1 1773A2 1782 C48 1782 C24 1782 C4 PR 1910,2 1782 C12

    Et là ça ne fonctionne plus!

    J'ai éssayé le passage ci-dessous, mais... ça a fait pchitt!
    même avec une seule ref ça ne fonctionne pas et l'utilisation du "or", non plus!
    pourquoi vous ne voulez jamais donner les données réelles dès le départ ?
    Il ne faut jamais simplifier car dans la vie réelle, rien n'est simple ...
    C'est sur que si les références ne commencent pas par REF, cela ne va jamais fonctionner.
    Serait-ce possible d'avoir un nouveau tableau avec les références réelles ?
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  14. #14
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 759
    Points : 14 793
    Points
    14 793
    Par défaut
    SI cette condition est remplie à chaque fois:
    à la fin de chaque ligne des références il y a systématiquement les colonnes "Produit périmé" et "Observation"
    il y faut simplement changer ces 2 lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                    For C = 1 To lgDerCol
                        If Left(xlWsh.Cells(L, C), 3) = "REF" Then
    par celles-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                    For C = 2 To lgDerCol
                        If xlWsh.Cells(L, C) <> "Produit périmé" And xlWsh.Cells(L, C) <> "Observation" And xlWsh.Cells(L, C) <> "" Then
    même avec une seule ref ça ne fonctionne pas et l'utilisation du "or", non plus!
    le "OR" fonctionne comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If xlWsh.Cells(L, C) = "1782 C2" Or xlWsh.Cells(L, C) = "1782B2" Or xlWsh.Cells(L, C) = "1782 A2" _
    Or xlWsh.Cells(L, C) = "1773B2" Or xlWsh.Cells(L, C) = "MC 780 B1" Then
    ...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  15. #15
    Membre régulier Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    Points : 102
    Points
    102
    Par défaut
    Désolé Tee_grandbois,
    Je ne pensais pas que cela pouvais influencer et j'ai vu ensuite le left sur le "REF"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Left(xlWsh.Cells(L, C), 3
    ci-joint le fichier original.
    Developpez_com_V1.xlsx

    J'ai repris tes lignes précédentes et c'est bizarre mais rien ne se passe
    Le fichier excel s'ouvre mais la table ne se remplie pas.

    J'ai essayé différentes variants mais rien n'y fait!

    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
    For C = 1 To lgDerCol
                    'For C = 2 To lgDerCol
                        'If xlWsh.Cells(L, C) <> "Produit périmé" And xlWsh.Cells(L, C) <> "Observation" And xlWsh.Cells(L, C) <> "" Then
     
                        If xlWsh.Cells(L, C) = "1782 C2" Or xlWsh.Cells(L, C) = "1782B2" Or xlWsh.Cells(L, C) = "1782 A2" _
                        Or xlWsh.Cells(L, C) = "1773B2" Or xlWsh.Cells(L, C) = "MC 780 B1" Then
     
                        'If Left(xlWsh.Cells(L, C), 3) = "REF" Then
                            stListeRef = stListeRef & xlWsh.Cells(L, C) & "|"
                        End If
                    Next C
                    ' tableau des REFx
                    tabloRef = Split(CStr(Left(stListeRef, Len(stListeRef) - 1)), "|")
     
                    ReDim Preserve tabloRef(UBound(tabloRef))
    Merci encore pour ton temps.

    Totor

  16. #16
    Membre régulier Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    Points : 102
    Points
    102
    Par défaut
    Mon problème vient du fait des conditionnements:

    j'ai donc change, éssayé de changer le code, mais j'ai in message d'erreur:
    Le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     For L = 1 To lgDerlig
            ' rupture sur le type de produit
            If xlWsh.Cells(L, 1) <> "" And xlWsh.Cells(L, 1) <> "CART 170CC" And xlWsh.Cells(L, 1) <> "CART 70CC" _
            And xlWsh.Cells(L, 1) <> "SERINGUES NT" And xlWsh.Cells(L, 1) <> "GODETS 20 gr" Then
                If xlWsh.Cells(L, 1) <> strProduit Then
                    strProduit = xlWsh.Cells(L, 1)
                End If
            Else
            'copie des colonnes
                If xlWsh.Cells(L, 1) = "CONDITIONNEMENT" Then
                    stListeRef = ""
    Le message d'erreur "Subscript out of range" sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For C = 0 To (UBound(tabloRef) + 1) * 2
    QUEZAKO ?
    Totor

  17. #17
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 759
    Points : 14 793
    Points
    14 793
    Par défaut
    bonjour,
    j'avais signalé que:
    SI cette condition est remplie à chaque fois:
    à la fin de chaque ligne des références il y a systématiquement les colonnes "Produit périmé" et "Observation"
    cela ne va, bien évidemment, pas fonctionner tel que je l'ai codé vu que le dernier classeur posté ne suit pas le schéma du fichier précédent, puisque qu'il y a des informations non communiquées telles que:
    - la première ligne contenant le jour de la semaine traitée
    - des cellules "Supplément" ne contenant pas les colonnes "Produit périmé" et "Observation"
    - des cellules "Total"
    dont je suppose qu'elles totalisent les cellules précédentes et ne sont donc pas à traiter.

    Une bonne fois pour toutes :
    est-ce que les classeurs obéissent tous au schéma actuel et que faut-il traiter ?
    - les onglets lundi à Vendredi ?
    - les suppléments ?
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  18. #18
    Membre régulier Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    Points : 102
    Points
    102
    Par défaut
    Bonjour Tee_grandbois,
    Oui en effet le fichier de depart n'était pas celui-ci, désolé encore.

    - Les onglets du lundi au vendredi sont a traiter. (Si l'on peut récuperer le nom de la semaine se serait bien), le total n'est pas à traiter
    - dans les feuilles "supplement" est à traiter mais pas la zone "total"

    Encore merci

    Totor

  19. #19
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 759
    Points : 14 793
    Points
    14 793
    Par défaut
    (Si l'on peut récuperer le nom de la semaine se serait bien)
    pour en faire quoi ? je veux dire dans quel colonne de la "table" doit se retrouver cette information ? il n'en est pas fait mention dans les cellules "TO BE"
    dans les feuilles "supplement" est à traiter mais pas la zone "total"
    le petit souci, est qu'il n'y a qu'une seule colonne pour les valeurs "supplément", il faut donc les traiter en exception (seule la colonne Valeur référence 1 de la table finale "TO BE" sera implémentée)
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  20. #20
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 759
    Points : 14 793
    Points
    14 793
    Par défaut
    cela risque d'être compliqué si les tableaux ne sont pas fiables et ne sont pas remplis correctement (même si les cellules n'ont pas de valeur cela va poser problème lors de la lecture)
    Nom : _cell_NOK.JPG
Affichages : 117
Taille : 53,7 Ko
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 12
    Dernier message: 22/06/2006, 12h09
  2. [Excel] Comment afficher les données d'un fichier Excel (PHP)
    Par pierrot10 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 11/05/2006, 15h01
  3. Exporter données dans un fichier excel
    Par Kasanova75 dans le forum Oracle
    Réponses: 3
    Dernier message: 08/03/2006, 10h09
  4. [Excel] PHP-MYSQL exportation de données vers un fichier excel
    Par toure32 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 19/10/2005, 19h29
  5. Extraction de données sur des fichiers excel
    Par iupgeii dans le forum MFC
    Réponses: 3
    Dernier message: 23/01/2004, 13h53

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