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 :

aide macro traitant deux classeurs vba


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Par défaut aide macro traitant deux classeurs vba
    Bonjour à tous
    voilà, dans le cadre de mon stage , je fais de la programmation sous excel : VBA
    mon gramme doit traiter un premier fichier excel (abscences)dans lequel je crée ma macro d'ailleurs, ce fichier contient des informations sur les salariés : leurs nom, immatriculation, date de début et de fin d'abscence ... sachant que le nom d'un salarié peut figurer sur plusieurs lignes du fichier s'il fait plusieurs absences .

    de ce fichier , pour chaque salarié j'extrais les informations concernat son absence afin de remplir un deuxième fichier excel appelé: FIE (je vais devoir créer un fichier de ce type pour chaque salarié), ce dernier fichier contient un calendrier et devant chaque date correspondant à une abscence du salarié , je dois cocher .

    pour le moment , je peux parcourir le premier fichier et extraire les dates d'absences d'un salarié à part .

    quand j'ouvre le deuxième fichier, le programme ne peut plus tenir compte que de la première absence et coche la date lui correspondant dans le deuxième fichier, la boucle s'arrete là et les autres dates d'abscences sont ignorées : en fait une fois le deuxième fichier ouvert, le programme ne peut plus revenir au premier fichier pour en extraire des information : donc la boucle s'arrete !


    voilà mon programme :




    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
    Sub test()
     
     
    Dim imm As Long
    Dim i, j, k As Long
    Dim valeur As Integer
    Dim DateDeb As String
    Dim nom As String
    Dim prenom As String
    Dim DateFin As String
     
     
    ' Chercher les info sur l'abscence d'un salarié donné grace à son immatriculation : identifiant du salarié
    imm = "58122"
    i = 2
     
    While i < 15
     
    'Workbooks.Open "D:\Documents and Settings\wboudgui\Desktop\test15juillet\abscences1.xls"
    'Workbooks("abscences1.xls").Activate
     
       ' si la cellule ( i,3) correspond à l'immatriculation qu'on cherche , on extraie les autres infos sur le salarié
     
     
        If Cells(i, 3).Value = imm Then
     
            Cells.Select
            MsgBox "Immatriculation:" & imm
            nom = Cells(i, 4).Value
            MsgBox "Nom:" & nom
     
            prenom = Cells(i, 5).Value
            DateFin = Cells(i, 11).Value
            Duree = Cells(i, 12).Value
     
     
            DateDeb = Cells(i, 10).Value
            MsgBox "DateDeb:" & DateDeb
     
    'si j'arrete la boucle ici, tout va bien : mon programme affiche autant de datedeb que d'abscences faites par le salarié; mais une fois j'ouvre le deuxième fichier appelé fie pour le remplir en cochant les abscence: le programme coche la première abscence mais ne rentre plus dans la boucle dans le premier fichier pour extraire les autres abscences
     
     
            Workbooks.Open "D:\Documents and Settings\wboudgui\Desktop\test15juillet\fievide.xls"
            Workbooks("fievide.xls").Activate
     
     
            For j = 12 To 41
            'de 12 à 41 on a 31 jour corrspondant à un mois de travail ou je vais cocher les abscences
     
     
    If Cells(j, 3) = DateDeb Then
      Cells(j, 7).Value = "R"
     'R pour dire abscent ici
     
     
     'je remplie les autres champs du formulaires du salarié: nom, prénoms...
      Cells(6, 2).Value = imm
      Cells(6, 4).Value = nom
      Cells(6, 7).Value = prenom
    End If
    Next
     
    '  Workbooks(" fievide.xls ").Save
     ' Workbooks(" fievide.xls ").Close
     
     
      End If
     
       i = i + 1
     
       Wend
     
    End Sub



    merciiiii beaucoup à tous ceux qui veulent bien m'aider

  2. #2
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Bonjour,
    Tout d'abord il ne faut, pas t'étonner de ne pas avoir de réponse tout de suite après 19h, et un smiley n'est pas vraiment un message clef

    Pour ton souci
    si tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Cells(j, 7).Value = "R"
    Implicitement tu écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    activeworkbook.activesheet.Cells(j, 7).Value = "R"
    Tu travailles donc sur la feuille active du classeur actif.
    Hors quand tu ouvre un fichier c'est lui qui devient actif. Du coup tu travaillera sur ce classeur et non le premier (je ne sais pas si c'est ce que tu souhaites)

    A mon avis il va te falloir préciser le classeur et la feuille qui t'intéresse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    workbooks("NomDUClasseur").worksheets("NomDelOnglet").cells(j, 7).Value = "R"
    Il y a bien sur moyen de racourcire la syntaxe avec des with ou des pointeur
    pour le with je te laisse regarder l'aide et les tutos/faq popur les pointeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dim Ws1 as worksheet 'tu met le nom de variable que tu veux et en déclarer plusieur différent
    set Ws1=workbooks("NomDUClasseur").worksheets("NomDelOnglet")
    'et dans la suite du code tu peux utiliser
    Ws1.cells(j, 7).Value = "R"
    J'ai pas regarder le code en détaille j'espère que ca te permettra de résoudre ton problème

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonjour tous,
    Il n'est pas nécessaire d'ouvrir/fermer le classeur à chaque fois que tu veux écrire dedans, l'ouvrir en début de macro et le fermer en fin est suffisant.
    Comme dit par Krovak tu peu employer des instances de ton classeur et de ta feuille.
    Autre remarque, vu que tu n'indente pas convenablement tes lignes de codes tu te mélange les pinceaux dans l'ordre du déroulement.
    Un exemple à adapter..
    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
    Sub test()
    Dim imm As Long
    Dim Lig As Long, LigCopie As Long, k As Long
    Dim valeur As Integer
    Dim DateDeb As String
    Dim DateFin As String
    Dim WkBook As Workbook
    Dim WkDest As Worksheet
     
        Set WkBook = Workbooks("D:\Documents and Settings\wboudgui\Desktop\test15juillet\fievide.xls")
        WkBook.Open
        Set WkDest = WkBook.Sheets("fievide.xls")
    ' Chercher les info sur l'abscence d'un salarié donné grace à son immatriculation : identifiant du salarié
        imm = "58122"
       ' si la cellule ( i,3) correspond à l'immatriculation qu'on cherche , on extraie les autres infos sur le salarié
        For Lig = 2 To 15
            If Cells(Lig, 3).Value = imm Then
                'DateFin = Cells(Lig, 11)
                'Duree = Cells(Lig, 12)
                For LigCopie = 12 To 41
                'de 12 à 41 on a 31 jour corrspondant à un mois de travail ou je vais cocher les abscences
                    With WkDest
                        If .Cells(LigCopie, 3) = Cells(Lig, 10) Then
                            .Cells(LigCopie, 7) = "R"
                            'R pour dire abscent ici
                            'je remplie les autres champs du formulaires du salarié: nom, prénoms...
                            .Cells(6, 2) = imm
                            .Cells(6, 4) = Cells(Lig, 4)
                            .Cells(6, 7) = Cells(Lig, 5)
                            Exit For
                        End If
                    End With
                Next LigCopie
            End If
        Next Lig
        WkBook.Save
        WkBook.Close
        'Libère la mémoire.
        Set WkBook = Nothing
        Set WkDest = Nothing
    End Sub
    A+

Discussions similaires

  1. [XL-2003] Aide macro vba pour calcul du prix d'une option
    Par addictionme dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 17/05/2009, 15h45
  2. [VBA-E] travailler sur deux classeurs
    Par argv666 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 06/09/2006, 10h40
  3. [VBA-E]:copier entre deux tableaux sur deux classeurs
    Par VBBBA dans le forum Macros et VBA Excel
    Réponses: 39
    Dernier message: 28/06/2006, 15h39
  4. [VBA-E] Aide verrouiller/déverrouiller cellule & classeur
    Par Alex_Kidd dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/05/2006, 20h41
  5. [VBA-E]travail sur deux classeurs excel
    Par richou dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/04/2006, 10h59

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