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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    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 : 186
Taille : 27,4 Ko
    TO BE
    Nom : Congelos_TOBE_DvpCom.png
Affichages : 166
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 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    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 éclairé Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    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 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    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
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 959
    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

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    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.

+ Répondre à la discussion
Cette discussion est résolue.

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