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 :

possibilité à l'utilisateur d'aller chercher n'importe quel onglet de n'importe quel fichier [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 40
    Points : 10
    Points
    10
    Par défaut possibilité à l'utilisateur d'aller chercher n'importe quel onglet de n'importe quel fichier
    Bonjour je débute en VBA. Donc j'ai encore du mal avec ce code. j'ai une chose à faire. Je vous explique :
    J'ai un dossier avec plusieurs classeurs à l'intérieur qui contiennent plusieurs onglets eux aussi. Ces classeurs sont les rapports hebdomadaires avec à l'intérieur (dans chaque onglet) le rapport journalier (donc 6 onglets car il y a le récapitulatif de la semaine). Tous ces onglets sont structurés de la même façon (par exemple le nombre d'arrêts dans la semaine est toujours dans la même cellule).

    Je dois créer un classeur qui donnera le rapport mensuel du 20 au 20 mais qui donne la possibilité à l'utilisateur (un bouton) d'aller chercher n'importe quel onglet de n'importe quel classeur et qui copie les cellules de E9 à E35 (du fichier source, car tous sont structurés de la même manière) sur ce nouveau classeur...

    Je ne sais pas si j'ai été clair.

    En espérant que vous pourrez m'aidez car je rame terrible en VBA.

    Merci par avance
    Baricot

  2. #2
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Bonjour,

    Chaque chose en son temps.
    Dans un premier temps, je listerai les fichiers excel et les afficherai dans une liste, il faut créer un userform avec une listbox

    Dans un module standard :
    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
    Option Explicit
    Sub test_copieI()
    Dim Nomc As String, repertoire As String
    Dim tabrep() As String
    Dim i As Integer, K As Integer
    Dim result As String
    i = 0
    ' Nomc = "C:\XXX\YYYl\" ' Mettre ici le chemin
    Nomc = ThisWorkbook.Path
    If Right(Nomc, 1) <> "\" Then Nomc = Nomc & "\"
    repertoire = Dir(Nomc & "*xls*", vbDirectory)
    ReDim Preserve tabrep(i)
    tabrep(i) = repertoire
     
    Do While Len(repertoire) > 0
     i = i + 1
        repertoire = Dir()
        ReDim Preserve tabrep(i)
        tabrep(i) = repertoire
    Loop
     
     UserForm1.ListBox1.List = tabrep()
     UserForm1.Show
     
    End Sub
    Le code du bouton dans la feuille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton1_Click()
    test_copieI
    End Sub
    Tu dis quand c'est ok

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 40
    Points : 10
    Points
    10
    Par défaut
    oui comme tu dis on va y allé petit a petit car à part le C++ que je maitrise, je ne connai pas les autres langagues.

    Je viens de recopié ton premier code et il me dit que la variable UserForm1 est une variable non défini??

  4. #4
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Comme je l'ai dis plus haut :

    il faut créer un userform avec une listbox

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 40
    Points : 10
    Points
    10
    Par défaut
    j'ai donc créer mon userform avec ma listbox mais rien n'apparait à l'intérieur??

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 40
    Points : 10
    Points
    10
    Par défaut
    ca y est des classeurs ce sont mis à l'intérieur mais ce ne sont pas les bons (seulement les classeurs de mon bureau il me semble)

    et lorsque je lance l'application du module j'ai une erreur 70??

  7. #7
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Bon tout d'abord dans quel repertoire sont les classeurs tu remplace par
    ce repertoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nomc = ThisWorkbook.Path ' Nomc = "C:\XXX\YYYl\" ' Mettre ici le chemin
    Dans le code que j'ai mis, je prend le repertoire du classeur qui contient les macros (ce classeur => thisworkbook).

    Pour l'erreur 70, je n'ai pas d'erreur, utilises le debuggeur pas à pas et dis mois sur quelle ligne tu as l'erreur (mettre un point d'arret en debut de macro et faire F8).

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 40
    Points : 10
    Points
    10
    Par défaut
    pr l'erreur elle se trouve ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UserForm1.ListBox1.List = tabrep()
    J'ai insérer le dossier ou se trouve tout mes classeurs comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Nomc = "E:\DATAS\3 - production\rapport exploitation\rapports journaliers de production\2009" ' Mettre ici le chemin
    Nomc = ThisWorkbook.Path
    mais rien ne change??

  9. #9
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Re,

    Supprimes la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nomc = ThisWorkbook.Path

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 40
    Points : 10
    Points
    10
    Par défaut
    J'avance !!!

    lorsque je lance ma macro le userform avec ma listbox s'insére bien dans mon classeur mais lorsque je clique sur la semaine que je veux tout bug et VBA me souligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     UserForm1.ListBox1.List = tabrep()
    apres ca on fait quoi??

    petite permission il ajoute "permission refusée"

  11. #11
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    La propriété de rowsource de la listbox doit être à blanc, est-ce bien le cas.
    Tu ne peux pas ajouter des items, avec la méthode list

    Au cas ou, je te remets le code avec mise à blanc de rowsource, n'oublies pas de remettre le nom du chemin :

    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
    Sub test_copieI()
    Dim nomc As String, repertoire As String
    Dim tabrep() As String
    Dim i As Integer, K As Integer
     
    i = 0
    ' Nomc = "C:\XXX\YYYl\" ' Mettre ici le chemin [nomc = ThisWorkbook.Path]
     
    If Right(nomc, 1) <> "\" Then nomc = nomc & "\"
    repertoire = Dir(nomc & "*xls*", vbDirectory)
     ReDim Preserve tabrep(i)
     tabrep(i) = repertoire
     
    Do While Len(repertoire) > 0
     i = i + 1
        repertoire = Dir()
        ReDim Preserve tabrep(i)
        tabrep(i) = repertoire
    Loop
    UserForm1.ListBox1.RowSource = Empty
    UserForm1.ListBox1.List = tabrep()
    UserForm1.Show
     
    End Sub

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 40
    Points : 10
    Points
    10
    Par défaut
    en effet je n'ai rien dans ma rowsource... ce qui signifie??

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 40
    Points : 10
    Points
    10
    Par défaut
    j'ai remis ton code mais rien n'y fait je lance ma macro la list box s'affiche bien sur mon classeur avec les différents classeurs et lorsque je veux cliquer sur un VBA m'annonce une erreur 70 ac écrit "permission refusée"...

  14. #14
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut tu visualises la liste dans ta listbox ?
    Edit : j'avais pas vu ton dernier message, donc tu obtiens bien une listbox avec dedans la liste des classeurs ?
    c'etait le but de cette première mise en place.

    Edit : donc tu alimentes bien le tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    '------------------------------------------'
    ' TEST DE TABREP
    'Dim Mess As String
    'For i = 0 To UBound(tabrep)
        'Mess = Mess & tabrep(i) & vbCrLf
    'Next i
    'MsgBox Mess
    ' Exit Sub
    '-------------------------------------------'

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 40
    Points : 10
    Points
    10
    Par défaut
    j'ai supprimé
    UserForm1.ListBox1.RowSource = Empty
    UserForm1.ListBox1.List = tabrep()
    UserForm1.Show

    et mis ce que tu viens de me mettre et j'ai un msb box qui s'affiche avec tous les classeurs qui se trouvent dans le nom du répertoire que j'ai tapé;

    donc?

    On est OK sur la premiere mise en place ensuite comment continuer?

    merci

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 40
    Points : 10
    Points
    10
    Par défaut
    il faut à présent que je puisse avoir accés aux onglets des classeurs et que je puisse copier la plage de cellule de E5 jusqu'a E35 et que je la copie sur mon nouveau classeur dans les cases F5 à F 39(pour un jour), G5à G39 pour un autre jour... ce qui fait le rapport mensuel

  17. #17
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Maintenant quand tu clique sur un classeur dans la liste, il faut l'ouvrir donc dans l'évenement clique du listbox.
    Ensuite, il faut lister les onglets, puis faire ton traitement.
    Je te propose le code ci-dessous tout fait (pas forcément optimisé mais bon)

    Dans ton userform, quand tu clique sur la liste tu ouvres le classeur correspondant, la même liste va servir ensuite à afficher la liste des onglets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub ListBox1_Click()
    UserForm1.Hide
    If Me.Caption <> "Choix de l'onglet" Then
        Traiter_classeur (ListBox1.Value)
    Else
        Traiter_onglet (ListBox1.Value)
    End If
     
    End Sub
    Le Code complet dans un module standard,fais du déboggage pas à pas
    pour comprendre ci qui se passe.

    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
    Option Explicit
    Sub test_copieI()
    Dim nomc As String, repertoire As String
    Dim tabrep() As String
    Dim i As Integer, K As Integer
     
    i = 0
    Nomc = "C:\XXX\YYYl\" '  a adapter
     
    If Right(nomc, 1) <> "\" Then nomc = nomc & "\"
     repertoire = Dir(nomc & "*xls*", vbDirectory)
     ReDim Preserve tabrep(i)
     tabrep(i) = repertoire
     
    Do While Len(repertoire) > 0
        i = i + 1
        repertoire = Dir()
        ReDim Preserve tabrep(i)
        tabrep(i) = repertoire
    Loop
    '------------------------------------------'
    ' TEST DE TABREP
    'Dim Mess As String
    'For i = 0 To UBound(tabrep)
        'Mess = Mess & tabrep(i) & vbCrLf
    'Next i
    'MsgBox Mess
    ' Exit Sub
    '-------------------------------------------'
     
    UserForm1.ListBox1.RowSource = Empty
    UserForm1.ListBox1.List = tabrep()
    UserForm1.Show
     
    End Sub
     
    Sub Traiter_classeur(ByVal NomCla As String)
    Dim wb As Workbook, i As Integer, tabonglet() As String, nomc As String
    On Error Resume Next
    Nomc = "C:\XXX\YYYl\" '  a adapter
    If Right(nomc, 1) <> "\" Then nomc = nomc & "\"
    NomCla = nomc & NomCla
    Set wb = Workbooks.Open(Filename:=NomCla, ReadOnly:=False)
     
    On Error GoTo 0
     
    If wb Is Nothing Then
        MsgBox "Problème ouverture " & NomCla, vbExclamation + vbOKOnly, "Ouverture du classeur"
        Exit Sub
    End If
    i = 0
    Dim Fl As Worksheet
    For Each Fl In wb.Worksheets
        ReDim Preserve tabonglet(i)
        tabonglet(i) = Fl.Name
        i = i + 1
    Next
     
    Unload UserForm1
    With UserForm1
        .ListBox1.RowSource = Empty
        .ListBox1.List = tabonglet()
        .Caption = "Choix de l'onglet"
        .Show
    End With
    End Sub
     
    Sub Traiter_onglet(ByVal Nomonglet As String)
     
    Dim Fl As Worksheet
    Set Fl = ActiveWorkbook.Worksheets(Nomonglet)
    ' a adapter
    Fl.Range("E9:E35").Value = ThisWorkbook.Worksheets(1).Range("E9:E35").Value 'ici ce que tu veux faire, peut être ) adapter copie dans le classeur que tu viens d'ouvrir de la plage de la feuille 1 de ton classeur actuel
    Unload UserForm1
    End Sub

    NB: j'ai mis le commentaire "' a adapter"

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 40
    Points : 10
    Points
    10
    Par défaut
    c'est vraiment sympa de te pencher sur mon problème. Merci d'etre la sinon c'est pas un jour qu'il me faudrait

    Je viens de copier ton code et ce qui se passe c'est que la listbox s'ouvre bien avec tous les classeurs et lorsque je clique sur un, la macro s'arrete et j'ai le classeur sur lequel j'ai cliqué qui s'ouvre sur une autre page.

    Comment cela se fait??

    Une idée?

  19. #19
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    j'ai le classeur sur lequel j'ai cliqué qui s'ouvre sur une autre page.
    C'est bien ça que tu veux non, ouvrir un classeur pour recopié des données ?

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 40
    Points : 10
    Points
    10
    Par défaut
    Oui en effet, mais les données ne se sont pas censé se recopié toutes seules??

    Par ailleurs, j'ai fais le deboggage étapes par étapes et c'est cela que je veux mais lorsque je lance la macro directement je n'ai que la listbox qui se met en place et lorsque je clique sur la semaine que je veux, je devrai pouvoir choisir l'onglet. mais ce n'est pas le cas et donc la macro s'arrete sans que j'ai pu choisir l'onglet et sans que les données soient recopiées...

    Je ne sais pas si c'est plus clair??

    En gros c'est comme si les fonction Traiter_classeur et Traiter_onglet ne se faisait pas

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/04/2013, 12h00
  2. Réponses: 10
    Dernier message: 06/08/2010, 23h01
  3. Réponses: 2
    Dernier message: 30/05/2006, 23h03
  4. [DOM] Comment aller chercher un Node ?
    Par pmartin8 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 23/12/2005, 14h20
  5. Réponses: 1
    Dernier message: 26/09/2005, 09h28

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