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

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

Macros et VBA Excel Discussion :

aller chercher des données dans un autre classeur en spécifiant le chemin d'accès complet [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Contremaitre mécanicien
    Inscrit en
    Avril 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Contremaitre mécanicien
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2015
    Messages : 5
    Points : 12
    Points
    12
    Par défaut aller chercher des données dans un autre classeur en spécifiant le chemin d'accès complet
    Bon voila, au travail le système informatique produit des rapports dans le format excel. Seulement les fichiers généré sont tout en fouillis.
    j'ai donc fait une petite macro qui récupère les données pertinente ( les colonnes D, E, F, des lignes ou on trouve 1 a la colonne C, le reste est du fouillis)
    Donc on voit dans mon code que ça demande le fichier source (celui qui est en fouillis) avec GetOpenFilename et met son nom et chemin dans la variable "Classeur" et ça ne fonctionne pas. Si je remplace la variable Classeur par le nom du classeur et par le nom de la feuille de calcul du fichier en fouillis, ça fonctionne, mais j'aimerais que l'utilisateur puisse spécifier le fichier avec GetOpenFilename.
    j'ai mit la variable Classeur dans Worksheets("Classeur") car la feuille de calcul du fichier en fouillis a toujours le même nom que le classeur. Bien-sur dans la variable il y a le chemin d’accès, donc voila pourquoi ça ne fonctionne pas mais je ne comprend pas pourquoi ça ne fonctionne pas avec Workbooks("Classeur")
    Quelqu’un a une piste?

    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
     
    Sub Macro1()
    '
    ' Macro1 Macro
     
    Classeur = Application.GetOpenFilename("Classeurs Excel,*.xls")
     
    DernLigne = Workbooks("Classeur").Worksheets("Classeur").Range("C65536").End(xlUp).Row 'détecte la dernière ligne ou il y a quelque chose d’écrit à la colonne C
     
    For i = 17 To DernLigne 'les premières données commencent a la ligne 17
     
    If Workbooks("Classeur").Worksheets("Classeur").Range("C" & i).Value = 1 Then 'si la colonne C et le chiffre ou est le for =1
    Workbooks("Classeur").Worksheets("Classeur").Range("D" & i, "F" & i).Copy Destination:=ActiveWorkbook.Worksheets("feuil1").Range("A65000").End(xlUp).Offset(1)
    End If
     
    Next
     
    End Sub

  2. #2
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonsoir Tasien, bonsoir le forum,

    Tu définies une variable Classeur puis dans la code tu la mets entre guillemets : "Classeur". Elle se transforme alors en texte. Enlève les guillemets chaque fois qu'il y a la variable Classeur. Mais, malgré cela, ton code implique que le classeur source soit déjà ouvert car GetOpenFilename ne va pas l'ouvrir. Je ne suis pas sûr que ça fonctionne...

    Je verrais plutôt les choses comme ça :

    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
    Sub Macro1()
    Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
    Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
    Dim CH As String 'déclare la variable CH (CHemin d'accès)
    Dim F As FileDialog 'déclare la variable F (Fichier)
    Dim CS As Workbook 'déclare la variable CS (Classeur Source)
    Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
    Dim DL As Integer 'déclare la variable DL(dernière ligne)
    Dim TC As Variant 'déclare la variable TC (Tableau de Cellules)
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim J As Integer 'déclare la variable J (incrément)
    Dim K As Integer 'déclare la variable K (incrément)
    Dim TL() As Variant 'déclare la variable TL (Tableau de lignes)
     
    Set CD = ThisWorkbook 'définit le classeur destination CD
    Set OD = CD.Sheets("Feuil1") 'définit l'onglet destination OD
    CH = CD.Path 'définit le chemin d'accès (à adapter à ton cas, ici j'ai pris le dossier où se trouve le classeur destination)
    Set F = Application.FileDialog(msoFileDialogOpen) 'définit le fichier F
    With F 'prend en compte le fichier F
        .InitialFileName = CH 'chemin par défaut
        .Filters.Add "Classeurs Excel", "*.xls" 'type de fichiers par défaut
        .AllowMultiSelect = False 'ne permet la sélection que d'un seul fichier
        If .Show = -1 Then 'si bouton "Ouvrir"
            .Execute 'ouvre le fichier sélectionné
        Else 'sinon
            Exit Sub 'sort de la procédure
        End If 'fin de la condition
    End With 'fin de la prise en compte du fichier F
    Set CS = ActiveWorkbook 'définit le classeur source CS
    Set OS = CS.Sheets(Split(CS.Name, ".")(0)) 'définit l'onglet source OS (enlève l'entension du fichier)
    DL = OS.Cells(Application.Rows.Count, 3).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 3 (=C) de l'onglet OS
    TC = Range("C17:F" & DL) 'définit le tableau de cellules TC
    K = 1 'initialise la variable K
    For I = 1 To UBound(TC(I, 1)) 'boucle 1 : sur toutes les lignes I du tableau de cellues TC
        If TC(I, 1) = 1 Then 'condition : si la valeur ligne I colonne 1 (=> Colonne C) de TC est égale à 1
            ReDim Preserve TL(1 To 3, 1 To K) 'redimentsionne le tableau TL (3 lignes, K colonnes)
            For J = 1 To 3 'boucle 2 : sur les 3 lignes J de TL
                TL(J, K) = TC(I, J + 1) 'récupère dans la ligne J de TL la colonne J+1 de TC (Tranposition)
            Next J 'prochaine ligne de la boucle 3
            K = K + 1 'incrémente K (ajoute une colonne à TL)
        End If 'fin de la condition
    Next I 'prochaine ligne de la boucle 1
    'si K est supérieur à 1, renvoie dans la cellule A2 (redimensionnées) de l'onglet OD, le tableau TL transposé
    If K > 1 Then OD.Range("A2").Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL)
    CS.Close SaveChanges:=False 'ferme le classeur source CS sans l'enregister
    End Sub
    À plus,

    Thauthème

    Je suis Charlie

  3. #3
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, déjà utilise la touche F1
    Cette méthode affiche la boîte de dialogue standard Ouvrir et lit un nom de fichier tapé par l'utilisateur sans réellement ouvrir les fichiers.
    ensuite adapte à ton contexte
    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
     
    Option Explicit
     
    Declare Function GetOpenFileName Lib "comdlg32.dll" _
            Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
     
    Private Type OPENFILENAME
        lStructSize As Long
        hwndOwner As Long
        hInstance As Long
        lpstrFilter As String
        lpstrCustomFilter As String
        nMaxCustFilter As Long
        nFilterIndex As Long
        lpstrFile As String
        nMaxFile As Long
        lpstrFileTitle As String
        nMaxFileTitle As Long
        lpstrInitialDir As String
        lpstrTitle As String
        flags As Long
        nFileOffset As Integer
        nFileExtension As Integer
        lpstrDefExt As String
        lCustData As Long
        lpfnHook As Long
        lpTemplateName As String
    End Type
     
    Private Function SelectionFichier(Path As String, Optional Filtre As String = "*.*") As String
    Dim OpenFile As OPENFILENAME, lReturn As Long, sFilter As String
        OpenFile.lStructSize = Len(OpenFile)
        sFilter = "Fichiers Excel (" & Filtre & ")" & Chr(0) & Filtre & Chr(0)
        With OpenFile
            .lpstrFilter = sFilter
            .nFilterIndex = 1
            .lpstrFile = String(257, 0)
            .nMaxFile = Len(OpenFile.lpstrFile) - 1
            .lpstrFileTitle = OpenFile.lpstrFile
            .nMaxFileTitle = OpenFile.nMaxFile
            .lpstrInitialDir = Path
            .lpstrTitle = "Fichiers à ouvrir"
            .flags = 0
        End With
        lReturn = GetOpenFileName(OpenFile)
        If lReturn = 0 Then
        Else
            SelectionFichier = Trim$(Left$(OpenFile.lpstrFile, InStr(1, OpenFile.lpstrFile, Chr$(0)) - 1))
        End If
    End Function
     
    Sub Tst()
    Dim Fichier As Variant
    Dim sChemin As String, Filtre As String
        sChemin = ThisWorkbook.Path & "\"
        Filtre = "Liste*.xls*"
        Fichier = SelectionFichier(sChemin, Filtre)
        DoEvents
        If Len(Fichier) > 0 Then Workbooks.Open Fichier
    End Sub
    Poursuit en lisant également ceci : Lire et écrire dans les classeurs Excel fermés

  4. #4
    Membre à l'essai
    Homme Profil pro
    Contremaitre mécanicien
    Inscrit en
    Avril 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Contremaitre mécanicien
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2015
    Messages : 5
    Points : 12
    Points
    12
    Par défaut Merci!
    Citation Envoyé par Thautheme Voir le message
    [COLOR=#000080]Bonsoir Tasien, bonsoir le forum,

    Tu définies une variable Classeur puis dans la code tu la mets entre guillemets : "Classeur". Elle se transforme alors en texte. Enlève les guillemets chaque fois qu'il y a la variable Classeur. Mais, malgré cela, ton code implique que le classeur source soit déjà ouvert car GetOpenFilename ne va pas l'ouvrir. Je ne suis pas sûr que ça fonctionne...
    Oui effectivement j'ai oublier d'enlever les guillemets quand j'ai recopier mon code ici, car j'y avais mit le nom du classeur directement pour tester et oublier de remettre les guillemets quand j'ai remit la variable.
    J'ai essayer ton code, mais il plante sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    For I = 1 To UBound(TC(I, 1)) 'boucle 1 : sur toutes les lignes I du tableau de cellues TC
    J'ai essayer de trouver le problème mais je crois que ton code dépasse mes connaissances en VBA qui sont plutôt basique, j'ai pas réussis à trouver le problème.
    par contre tout le début ou tu définit les variables pour le fichier d'entrée et de sortie, c'est exactement ce qui me manquait, ça fonctionne très bien.
    Je l'ai adapter à mon code et tout fonctionne bien!
    Merci !

  5. #5
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour Tasien, bonjour le forum,

    Peut-être en remplaçant la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TC = Range("C17:F" & DL) 'définit le tableau de cellules TC
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TC = OS.Range("C17:F" & DL) 'définit le tableau de cellules TC
    Mais si ton code fonctionne laisse-le comme ça... Sinon, la déclaration des variables permet une meilleure lisibilité et facilite l'écriture du code...
    À plus,

    Thauthème

    Je suis Charlie

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

Discussions similaires

  1. [XL-2010] Macro pour aller chercher des données dans un autre fichier
    Par GoToon dans le forum Macros et VBA Excel
    Réponses: 40
    Dernier message: 24/01/2015, 03h52
  2. Aller chercher des données dans la BDD
    Par zooffy dans le forum Silverlight
    Réponses: 9
    Dernier message: 14/06/2011, 09h35
  3. [XL-2003] Formule Somme.si allant chercher des données dans un autre classeur
    Par spoutnikk dans le forum Excel
    Réponses: 4
    Dernier message: 24/04/2010, 18h56
  4. Aller chercher des données dans un stringgrid
    Par cre3000 dans le forum Langage
    Réponses: 2
    Dernier message: 29/02/2008, 13h27

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