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 des données Excel, le retour!


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 des données Excel, le retour!
    Bonjour,
    J'ai essayé d'utiliser et d'adapter le code que m'a fourni Tee_grandbois, sans succès.
    J'ai in fichier excel que je souhaite intégrer à une table.
    Ce fichier est de format standard, même nom, même nombre de colonne, même nombre de ligne. Seul le contenu des cellule change.
    J'ai fait in AS-IS, TO-BE.
    Il s'agit encore ici d'agréger les data pour les avoir en colonne.
    J'ai bien essayé d'adapter le code de Tee-grandbois mais rien n'y fait! Débutant je suis.
    Si quelqu'un à une idée.
    D'avance in grand merci
    Totor

    MerciTee_Grandbois_Demande d'approvisionnement mastic v1.2.xlsm

  2. #2
    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 totor,
    montres que tu as fait un effort pour adapter mon code en postant ce que tu as déjà réalisé sinon si je le fais encore, tu ne progresseras jamais.
    Une première piste : regarde où se trouvent toutes les données se trouvant dans des cellules fixes c'est le plus facile :
    date = J20 ===> à mettre dans une variable
    infos clients : lignes 22 et 23====> à mettre dans des variables

    Ensuite, tu peux t'attaquer au cellules variables : visiblement cela commence en ligne 27 ===> si c'est bien le cas, c'est presque gagné ... Ce qui est dommage, c'est cette fusion de cellules qui complique un peu le travail (grrrr.... )
    Mais on n'en est pas encore là, montre ce que tu as déjà fait, et pour le reste je t'aiderai ...
    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 ?

  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
    Bonjour Tee_grandbois,
    Bon j'ai éssayé et dans une première version et tout a planté

    Ci-dessous mon code mais c'est une adaptation maison !
    Alors bien entendu la table ne se remplie pas!
    Et là, pour une raison que j'ignore la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oRst.Fields("QuantitéCommandee") = Val(tabloRefPR(K * 2 - 1))    'ex.: "20" (col. 0+n du tableau tabloValRef)
    passe en jaune "subscript out of range"
    Je vais éssayé de me former "petit à petit", je vais y aller pas à pas avec in autre projet.

    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
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    Function ImportFeuillesXLS(pNomClasXLS As String)
    '-------------------------------
    ' paramètres
    ' pNomClasXLS :nom du classeur
    '-------------------------------
     
    Dim xlApp As New Excel.Application
    Dim xlWbk As Excel.Workbook
    Dim xlWsh As Excel.Worksheet
    Dim lgDerlig As Long                ' dernière ligne utile de la feuille
    Dim lgDerCol As Integer             ' denière colonne utile de la feuille
    Dim F As Integer, C As Integer
    Dim J As Integer, K As Integer, L As Integer
     
    'Données fixes
    Dim strClient As String            ' Nom du Client
    Dim strBatiment As String          ' Nom du Batiment
    Dim strPoste As String             ' Nom du Poste
    Dim strLettreCongelo As String     ' Nom du LettreCongelo
    Dim strNomDemandeur As String      ' Nom du NomDemandeur
    Dim strHeureLivSouhaite As String  ' HeureLivSouhaite
    Dim strTelDemandeur As String      ' TelDemandeur
    'Données variables
    Dim boRupture As Boolean            ' Indicateur de la rupture: première cellule vide en colonne 1
    Dim stListeReferencePR  As String            ' Nom du congélo
    Dim tabloRefPR() As String
    Dim stListeQuantitéCommandee As String         ' Liste valeurs références et tableau associé
    Dim tabloQuantitéCommandee() As String
     
    Dim oRst As Recordset               ' Table à remplir
     
    Set xlWbk = xlApp.Workbooks.Open(pNomClasXLS)
    '-----------------------------------------------------
    ' Excel visible pour les tests
    'xlApp.Visible = True
     
    ' Ouverture table
    Set oRst = CurrentDb.OpenRecordset("tbl_Taxi", dbOpenDynaset)
     
    For F = 1 To xlWbk.Sheets.Count
        ' chargement de la 1ère feuille
        Set xlWsh = xlWbk.Worksheets(F)
     
        ' on ne traite pas la feuille nommée "Total"
        'If xlWsh.Name = "Total" Then Exit For
     
        ' 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) = "" Then
                boRupture = True
            Else                            'Else xlWsh.Cells(L, 1) = ""
                If boRupture = True Then
                    strClient = xlWsh.Cells(L, 1)
                    boRupture = False
     
                    ' on ne traite pas les cellules de totalisation, on "force" la lecture de la dernière ligne
    '                If strProduit = "Total" Then
    '                    L = lgDerlig
    '                    Exit For
    '                End If
     
                Else                        'Else boRupture = True
                'copie des intitulés des colonnes conditionnement
                    If xlWsh.Cells(L, 1) = "Heure de livraison souhaité" Then
                        stListeReferencePR = ""
     
                        For C = 2 To lgDerCol
                            If xlWsh.Cells(L, C) <> "" And xlWsh.Cells(L, C) <> "Produit périmé" And xlWsh.Cells(L, C) <> "Observation" Then
                                stListeReferencePR = stListeReferencePR & xlWsh.Cells(L, C) & "|"
                            End If
                        Next C
                        ' tableau des références produit
                        tabloRefPR = Split(CStr(Left(stListeReferencePR, Len(stListeReferencePR) - 1)), "|")
     
                        ReDim Preserve tabloRefPR(UBound(tabloRefPR))
                    Else                    'Else xlWsh.Cells(L, 1) = "CONDITIONNEMENT"
                        ' tableau des valeurs: 2 fois le nombre de Référence + la colonne 1
                        If xlWsh.Cells(L, 1) <> "" Then
                            For C = 0 To (UBound(tabloRefPR) + 1) * 2
                                stListeQuantitéCommandee = stListeQuantitéCommandee & xlWsh.Cells(L, C + 1) & "|"
                            ' colonne suivante
                            Next C
     
                            ' remplissage du tableau et redimensionnement
                            tabloQuantitéCommandee = Split(CStr(Left(stListeQuantitéCommandee, Len(stListeQuantitéCommandee) - 1)), "|")
                            ReDim Preserve tabloQuantitéCommandee(UBound(tabloQuantitéCommandee))
     
        ' Chargement des données dans la table
                            ' traitement pour une ligne de la feuille
                            For K = 1 To UBound(tabloRefPR) + 1
                                oRst.AddNew
     
                                oRst.Fields("Client") = strClient                      'ex.: "R - poste 271 étage 2 - G39"
                                oRst.Fields("Batiment") = strBatiment                       'ex.: "R - poste 271 étage 2 - G39"
                                oRst.Fields("Poste") = strPoste
                                oRst.Fields("LettreCongélo") = strLettreCongelo
                                oRst.Fields("NomDemandeur") = strNomDemandeur
                                oRst.Fields("HeureLivSouhaite") = strHeureLivSouhaite
                                oRst.Fields("TelephoneDemandeur") = strTelDemandeur
     
     
     
                                oRst.Fields("Conditionnement") = tabloQuantitéCommandee(0)         'ex.: "1782 C48"
                                oRst.Fields("ReferencePR") = tabloRefPR(K - 1)                    'ex.: "CART 170CC" (col. 0 du tableau tabloRef)
                                oRst.Fields("QuantitéCommandee") = Val(tabloRefPR(K * 2 - 1))    'ex.: "20" (col. 0+n du tableau tabloValRef)
     
                                oRst.Update
                            Next K
     
                        ' vidage des valeurs stockées
                            stListeValRef = ""
                        End If              'If xlwsh.Cells(L, 1) <> ""
     
                    End If                  'If xlWsh.Cells(L, 1) = "CONDITIONNEMENT"
                End If                      'If boRupture = True
     
            End If                          'If xlWsh.Cells(L, 1) = ""
        ' ligne suivante
        Next L
     
    ' feuille suivante, initialisation des variables
        strClient = ""
        stListeReferencePR = ""
        stListeQuantitéCommandee = ""
    Next F
     
    ' fermeture des objets
    Set oRst = Nothing
    xlWbk.Close
    xlApp.Quit
     
    End Function
    Merci
    Totor

  4. #4
    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,
    oublie l'ancien code pour le moment (même si certaines lignes vont être récupérées: déclaration et affectation de variables ouverture de fichier ...) et occupe toi de cela:
    Une première piste : regarde où se trouvent toutes les données se trouvant dans des cellules fixes c'est le plus facile :
    date = J20 ===> à mettre dans une variable
    infos clients : lignes 22 et 23====> à mettre dans des variables
    commence par la déclaration des variables, puis l'ouverture du fichier Excel et l'affectation des variables (dont Excel, Workbook, Worksheet) et celles qui vont alimenter la table (pas besoin de boucle pour cela) sur ce modèle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dtRequest = xlWsh.Range("J20")                  'date demande
    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 ?

  5. #5
    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 Tee_grandbois,
    J'ai essayé ça (F5 + F8 pour du pas à pas, que je viens de découvrir ! Pratique !!!)
    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
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    Function ImportFeuillesXLS(pNomClasXLS As String)
    '-------------------------------
    ' paramètres
    ' pNomClasXLS :nom du classeur
    '-------------------------------
     
    Dim xlApp As New Excel.Application
    Dim xlWbk As Excel.Workbook
    Dim xlWsh As Excel.Worksheet
    Dim lgDerlig As Long                ' dernière ligne utile de la feuille
    Dim lgDerCol As Integer             ' denière colonne utile de la feuille
    Dim F As Integer, C As Integer
    Dim J As Integer, K As Integer, L As Integer
     
    'Données fixes
    Dim dtRequest As String            ' Requested Date
    Dim strClient As String            ' Nom du Client
    Dim strBatiment As String          ' Nom du Batiment
    Dim strPoste As String             ' Nom du Poste
    Dim strLettreCongelo As String     ' Nom du LettreCongelo
    Dim strNomDemandeur As String      ' Nom du NomDemandeur
    Dim strHeureLivSouhaite As String  ' HeureLivSouhaite
    Dim strTelDemandeur As String      ' TelDemandeur
    'Données variables
    Dim boRupture As Boolean            ' Indicateur de la rupture: première cellule vide en colonne 1
    Dim stListeReferencePR  As String            ' Nom du congélo
    Dim tabloRefPR() As String
    Dim stListeQuantitéCommandee As String         ' Liste valeurs références et tableau associé
    Dim tabloQuantitéCommandee() As String
     
    Dim oRst As Recordset               ' Table à remplir
     
    Set xlWbk = xlApp.Workbooks.Open(pNomClasXLS)
    '-----------------------------------------------------
    ' Excel visible pour les tests
    xlApp.Visible = True
     
    ' Ouverture table
    Set oRst = CurrentDb.OpenRecordset("tbl_Taxi", dbOpenDynaset)
     
    dtRequest = xlWsh.Range("J20")
    strClient = xlWsh.Range("B22")
    strBatiment = xlWsh.Range("D22")
    strPoste = xlWsh.Range("F22")
    strLettreCongelo = xlWsh.Range("I22")
    strNomDemandeur = xlWsh.Range("K22")
    strHeureLivSouhaite = xlWsh.Range("D23")
    strTelDemandeur = xlWsh.Range("J23")
     
    'Recherche des infos du tableau
    For F = 1 To xlWbk.Sheets.Count
        ' chargement de la 1ère feuille
        Set xlWsh = xlWbk.Worksheets(F)
     
        ' on ne traite pas la feuille nommée "Total"
        'If xlWsh.Name = "Total" Then Exit For
     
        ' 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, 2) = "" Then
                boRupture = True
            Else                            'Else xlWsh.Cells(L, 1) = ""
                If boRupture = True Then
                    strClient = xlWsh.Cells(L, 2)
                    boRupture = False
     
    '                ' on ne traite pas les cellules de totalisation, on "force" la lecture de la dernière ligne
    ''                If strProduit = "Total" Then
    ''                    L = lgDerlig
    ''                    Exit For
                    ''End If
    '***********
    '            Else                        'Else boRupture = True
    '            'copie des intitulés des colonnes conditionnement
    '                If xlWsh.Cells(L, 2) = "Heure de livraison souhaité" Then
    '                    stListeReferencePR = ""
    '
    '                    'For C = 2 To lgDerCol
    '                    For C = 4 To lgDerCol
    '                        If xlWsh.Cells(L, C) Then
    '                            stListeReferencePR = stListeReferencePR & xlWsh.Cells(L, C) & "|"
    '                        End If
    '                    Next C
    '                    ' tableau des références produit
    '                    tabloRefPR = Split(CStr(Left(stListeReferencePR, Len(stListeReferencePR) - 1)), "|")
     
                        'ReDim Preserve tabloRefPR(UBound(tabloRefPR))
                    Else                    'Else xlWsh.Cells(L, 1) = "CONDITIONNEMENT"
                        ' tableau des valeurs: 2 fois le nombre de Référence + la colonne 1
                        If xlWsh.Cells(L, 1) <> "" Then
                            For C = 0 To (UBound(tabloRefPR) + 1) * 2
                                stListeQuantitéCommandee = stListeQuantitéCommandee & xlWsh.Cells(L, C + 1) & "|"
                            ' colonne suivante
                            Next C
     
                            ' remplissage du tableau et redimensionnement
                            tabloQuantitéCommandee = Split(CStr(Left(stListeQuantitéCommandee, Len(stListeQuantitéCommandee) - 1)), "|")
                            ReDim Preserve tabloQuantitéCommandee(UBound(tabloQuantitéCommandee))
     
        ' Chargement des données dans la table
                            ' traitement pour une ligne de la feuille
                            For K = 1 To UBound(tabloRefPR) + 1
                                oRst.AddNew
     
                                oRst.Fields("Client") = strClient                      'ex.: "R - poste 271 étage 2 - G39"
                                oRst.Fields("Batiment") = strBatiment                       'ex.: "R - poste 271 étage 2 - G39"
                                oRst.Fields("Poste") = strPoste
                                oRst.Fields("LettreCongélo") = strLettreCongelo
                                oRst.Fields("NomDemandeur") = strNomDemandeur
                                oRst.Fields("HeureLivSouhaite") = strHeureLivSouhaite
                                oRst.Fields("TelephoneDemandeur") = strTelDemandeur
     
     
     
                                oRst.Fields("Conditionnement") = tabloQuantitéCommandee(0)         'ex.: "1782 C48"
                                oRst.Fields("ReferencePR") = tabloRefPR(K - 1)                    'ex.: "CART 170CC" (col. 0 du tableau tabloRef)
                                oRst.Fields("QuantitéCommandee") = Val(tabloRefPR(K * 2 - 1))    'ex.: "20" (col. 0+n du tableau tabloValRef)
     
                                oRst.Update
                            Next K
     
                        ' vidage des valeurs stockées
                            stListeValRef = ""
                        End If              'If xlwsh.Cells(L, 1) <> ""
     
                    'End If                  'If xlWsh.Cells(L, 1) = "CONDITIONNEMENT"
                End If                      'If boRupture = True
     
            End If                          'If xlWsh.Cells(L, 1) = ""
        ' ligne suivante
        Next L
     
    ' feuille suivante, initialisation des variables
        strClient = ""
        stListeReferencePR = ""
        stListeQuantitéCommandee = ""
    Next F
     
    ' fermeture des objets
    Set oRst = Nothing
    xlWbk.Close
    xlApp.Quit
     
    End Function
    Le fichier excel s'ouvre bien mais j'ai in message d'erreur "Object variable or with block variable not set" sur la ligne dtRequest = xlWsh.Range("J20")
    Pouratnat je l'ai bien déclaré: "Dim dtRequest As String"
    Enfin, je crois

  6. #6
    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
    Pouratnat je l'ai bien déclaré: "Dim dtRequest As String"
    oui mais c'est en ligne 53 que tu affectes xlWsh
    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 ?

  7. #7
    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
    ça y est pour la partie Data fixes !!!:
    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
    Set xlWbk = xlApp.Workbooks.Open(pNomClasXLS)
    '-----------------------------------------------------
    ' Excel visible pour les tests
    xlApp.Visible = True
     
    ' Ouverture table
    Set oRst = CurrentDb.OpenRecordset("tbl_Taxi", dbOpenDynaset)
     
        For F = 1 To xlWbk.Sheets.Count
        Set xlWsh = xlWbk.Worksheets(F)
     
    dtRequest = xlWsh.Range("J20")
    strClient = xlWsh.Range("B22")
    strBatiment = xlWsh.Range("D22")
    strPoste = xlWsh.Range("F22")
    strLettreCongelo = xlWsh.Range("I22")
    strNomDemandeur = xlWsh.Range("K22")
    strHeureLivSouhaite = xlWsh.Range("D23")
    strTelDemandeur = xlWsh.Range("J23")
    A chaque passage de la souris je récupère bien les bonnes datas.
    Alors maintenant comment faire pour le tableau et surtout la mise en colonne dans la table ?

    Merci
    Totor

  8. #8
    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
    ok, super.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        For F = 1 To xlWbk.Sheets.Count
        Set xlWsh = xlWbk.Worksheets(F)
    pour cette partie: pas besoin de boucle donc remplace le code précédent par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set xlWsh = xlWbk.Worksheets(1)
    pour la suite, tu auras besoin de ces tableaux (dont 2 sont déjà créés, puisque j'ai copié ton code):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ' variables liste des valeurs pour les tableaux
    Dim stListeRefPR As String                  ' liste des références produits
    Dim stListeCondi As String                  ' liste des conditionnements
    Dim stListeQuantitéCommandee As String      ' Liste des quantités
    ' variables tableau
    Dim tabloRefPR() As String                  ' tableau des références produits
    Dim tabloCondi() As String                  ' tableau des conditionnements
    Dim tabloQuantitéCommandee() As Integer     ' tableau des quantités
    commence par remplir les référence produits (stListeRefPR ) de la ligne 27 à partir de la colonne 2 jusqu'a la dernière colonne en t'inspirant de ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                        For C = 2 To lgDerCol
                            If xlWsh.Cells(L, C) <> "" And xlWsh.Cells(L, C) <> "Produit périmé" And xlWsh.Cells(L, C) <> "Observation" Then
                                stListeRef = stListeRef & xlWsh.Cells(L, C) & "|"
                            End If
                        Next C
                        tabloRef = Split(CStr(Left(stListeRef, Len(stListeRef) - 1)), "|")
    et enlève le code inutile. Attention, il y a une astuce (pas du tout compliqué) pour alimenter L. Le code une fois terminé tient en 7 lignes ...
    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 ?

  9. #9
    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,
    n'ayant pas de nouvelles je te livre le code terminé. C'est vrai qu'au départ cela semblait plus simple mais il y avait une petite difficulté avec les conditionnements et les quantités car il faut passer par un tableau à 2 dimensions et le piège c'est que cette plage de cellules contient des cellules fusionnées une ligne sur 2 étant vide, il ne faut pas les charger.
    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
    105
    106
    107
    108
    109
    Function ImportFeuillesXLS_Appro(pNomClasXLS As String)
    '--------------------------------------------
    ' paramètres
    ' pNomClasXLS: nom du classeur
    '--------------------------------------------
    Dim xlApp As New Excel.Application
    Dim xlWbk As Excel.Workbook
    Dim xlWsh As Excel.Worksheet
    Dim lgDerlig As Long                        ' dernière ligne utile de la feuille
    Dim lgDerCol As Integer                     ' denière colonne utile de la feuille
    Dim C As Integer                            ' indice pour colonne
    Dim K As Integer                            ' indice de travail
    Dim L As Integer                            ' indice pour ligne
    ' variables données -------------------------
    Dim dtRequest As String                     ' date demande
    Dim strClient As String                     ' client
    Dim strBatiment As String                   ' bâtiment
    Dim strPoste As String                      ' poste
    Dim strLettreCongelo As String              ' lettre congélateur
    Dim strNomDemandeur As String               ' nom demandeur
    Dim strHeureLivSouhaite As String           ' date/heure livraison souhaitée
    Dim strTelDemandeur As String               ' tél. demandeur
    Dim strListeRefPR As String                 ' liste des références produit
    ' variables tableaux ------------------------
    Dim tabloRefPR() As String                  ' tableau des références produit
    Dim tabloCondQte() As String                ' tableau des conditionnements et des quantités
     
    Dim oRst As Recordset                       ' recordset de la table à remplir
    '--------------------------------------------
    ' ouverture fichier excel
        Set xlWbk = xlApp.Workbooks.Open(pNomClasXLS)
        xlApp.Visible = True
    '--------------------------------------------
    ' chargement de la feuille
        Set xlWsh = xlWbk.Worksheets(1)
     
    ' dernière ligne utile de la feuille
        lgDerlig = xlWsh.UsedRange.Rows.Count
    ' Dernière colonne utile de la feuille
        lgDerCol = xlWsh.UsedRange.Columns.Count
    '--------------------------------------------
    ' récupération des données fixes lignes 20 à 23
        dtRequest = xlWsh.Range("J20")                      ' date demande
        strClient = Trim(xlWsh.Range("B22"))                ' client
        strBatiment = Trim(xlWsh.Range("D22"))              ' batiment
        strPoste = Trim(xlWsh.Range("F22"))                 ' poste
        strLettreCongelo = Trim(xlWsh.Range("I22"))         ' lettre congelateur
        strNomDemandeur = Trim(xlWsh.Range("K22"))          ' nom demandeur
        strHeureLivSouhaite = Trim(xlWsh.Range("D23"))      '  date/heure livraison souhaitée
        strTelDemandeur = Trim(xlWsh.Range("J23"))          ' tél. demandeur
    '--------------------------------------------
    ' récupération des références produits ligne 27
        L = 27
        For C = 2 To lgDerCol
            If xlWsh.Cells(L, C) <> "" Then strListeRefPR = strListeRefPR & xlWsh.Cells(L, C) & "|"
        Next C
     
        tabloRefPR = Split(CStr(Left(strListeRefPR, Len(strListeRefPR) - 1)), "|")
    '--------------------------------------------
    ' Alimentation de tabloCondQte, tableau à 2 dimensions
    ' la première contient les conditionnements, la seconde les quantités.
    ' Formule pour le redimensionnement de la première dimension du tableau:
    ' ((nombre total de lignes - ligne de début des données) - 1) * 0.5
    ' exemple pour le fichier actuel: ((34 - 27) - 1 ) * 0.5
    ' on enlève 1 car on est en base 0 et comme une ligne sur deux est vide à cause
    ' des cellules fusionnées on multiplie par 0.5 ce qui équivaut à diviser par 2
     
        L = ((lgDerlig - L) - 1) * 0.5
        ReDim tabloCondQte(L, UBound(tabloRefPR) + 1)
        K = 28
        For L = 0 To UBound(tabloCondQte, 1)
            If xlWsh.Cells(L + K, 1) <> "" Then
                For C = 0 To UBound(tabloCondQte, 2)
                    tabloCondQte(L, C) = xlWsh.Cells(L + K, C + 1)
                Next C
                K = K + 1                       ' pour se positionner sur la bonne ligne (évite le problème de fusion de cellules)
             End If
        Next L
    '--------------------------------------------
    ' Chargement des données dans la table
    ' ouverture table à alimenter
        Set oRst = CurrentDb.OpenRecordset("tbl_Taxi", dbOpenDynaset)
        For L = 0 To UBound(tabloCondQte, 1)
            K = 0
            For C = 0 To UBound(tabloRefPR)
                oRst.AddNew
                oRst.Fields("Conditionnement") = Trim(tabloCondQte(L, 0))
                oRst.Fields("Reference_Produit") = Trim(tabloRefPR(K))
                oRst.Fields("Quantite") = Val(tabloCondQte(L, C + 1))
                oRst.Fields("Date_Request") = CDate(dtRequest)
                oRst.Fields("Client") = strClient
                oRst.Fields("Batiment") = strBatiment
                oRst.Fields("Poste") = strPoste
                oRst.Fields("Lettre_Congelateur") = strLettreCongelo
                oRst.Fields("Nom_Demandeur") = strNomDemandeur
                oRst.Fields("Date_Heure_Liv_Souhaite") = strHeureLivSouhaite
                oRst.Fields("Numero_Tel_Demandeur") = strTelDemandeur
                oRst.Update
    ' référence produit suivant
                K = K + 1
            Next C
        Next L
    '--------------------------------------------
    ' fermeture des objets
        Set oRst = Nothing
        xlWbk.Close False
        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 ?

  10. #10
    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 Tee_grandbois,
    En fait j'ai essayé sur ton précent post et je bloquais sur la ligne For C = 2 To lgDerCol
    J'ai fait in paquet de test mais rien n'y a fait.
    Je regarde ça et surtout les commentaires!

    Merci encore
    Totor

  11. #11
    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,
    je bloquais sur la ligne For C = 2 To lgDerCol
    traduction: faire une boucle sur toutes les colonnes à partir de la deuxième jusqu'à la dernière (2 correspondant à la colonne B et lgDerCol (11, c'est à dire K) à la dernière de la plage de cellules utilisée ou UsedRange).
    C'est dommage, elle n'était pas à modifier celle-ci.

    Si tu veux des explications sur certaines parties du code, n'hésite pas ...
    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 ?

  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
    Encore Merci Tee_grandbois pour ton support !!
    Alors là j'en ai une bien bonne! Le fichier contient une macro. Alors en effet, avant que tu rales (à juste titre!) parce que le fichier transmis n'était pas le bon, j'ai cru comprendre que sur le forum on ne pouvait pas poster de fichier excel avec macro. J'ai donc bataillé pour retirer la macro et te transmettre le fichier - pour rien en définitive.

    Je viens d'éssayer et finalement on peut poster in fichier avec macro! le fichier passe!
    Demande d'approvisionnement mastic v1.2.xlsm
    Désolé encore.
    La macro vide les champs ! ça c'est horrible, quand j'importe et bien j'importe du vide!

    Que faudrait-il changer dans le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ' ouverture fichier excel
        Set xlWbk = xlApp.Workbooks.Open(pNomClasXLS)
        xlApp.Visible = True
    '--------------------------------------------
    ' chargement de la feuille
        Set xlWsh = xlWbk.Worksheets(1)
    Pour pouvoir maintenir les datas?
    Sur F5/F8, en pas à pas, à l'ouverture du fichier excel il est éffectivement vide!
    Si cela existe, bien sûr

    Merci Totor
    Fichiers attachés Fichiers attachés

  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
    La macro vide les champs ! ça c'est horrible, quand j'importe et bien j'importe du vide!

    Que faudrait-il changer dans le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ' ouverture fichier excel
        Set xlWbk = xlApp.Workbooks.Open(pNomClasXLS)
        xlApp.Visible = True
    '--------------------------------------------
    ' chargement de la feuille
        Set xlWsh = xlWbk.Worksheets(1)
    Pour pouvoir maintenir les datas?
    essaie comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        xlApp.EnableEvents = False
        Set xlWbk = xlApp.Workbooks.Open(pNomClasXLS)
        xlApp.Visible = True
        xlApp.EnableEvents = False
    j'ai testé sans souci en ayant activé les macros par défaut ...
    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
    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
    Mille MERCI Tee_grandbois!!
    J'avais récuperé ce code mais ça ne marchait pas; Bizarre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set xlWbk = xlApp.Workbooks.Open(pNomClasXLS)
    Application.EnableEvents = False
    xlApp.Visible = True
    Application.EnableEvents = True
    Quoi qu'il en soit ton code fonctionne à merveille

    Encore merci
    Totor

  15. #15
    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 totor92290,
    Citation Envoyé par totor92290 Voir le message
    Mille MERCI Tee_grandbois!!
    J'avais récuperé ce code mais ça ne marchait pas; Bizarre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set xlWbk = xlApp.Workbooks.Open(pNomClasXLS)
    Application.EnableEvents = False
    xlApp.Visible = True
    Application.EnableEvents = True
    Quoi qu'il en soit ton code fonctionne à merveille

    Encore merci
    Totor
    il faut être précis... ici: Application.EnableEvents = False Application représente l'application Access, pour Excel, c'est xlApp.
    En plus, il fallait mettre la ligne avant l'ouverture du classeur pour que cela fonctionne.

    On considère donc que c'est ?
    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 ?

  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
    Merci pour le cours Tee_grandbois,

    A bientôt

    Totor

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

Discussions similaires

  1. [AC-2013] Macro access manipulant des données excel
    Par Barth2501 dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/09/2018, 18h46
  2. Importer des données excel vers outlook
    Par faayy dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 17/10/2005, 09h30
  3. Insérer des données Excel dans une base Access ?
    Par MaTHieU_ dans le forum Access
    Réponses: 3
    Dernier message: 22/06/2005, 15h11
  4. [xml]manipuler des données xml sous Oracle9i
    Par crazy dans le forum SQL
    Réponses: 7
    Dernier message: 28/02/2004, 11h40
  5. Récupérer des données Excel vers Interbase ...
    Par Djedjeridoo dans le forum InterBase
    Réponses: 2
    Dernier message: 20/07/2003, 18h16

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