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 :

Probleme boucle for avec if [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Par défaut Probleme boucle for avec if
    Bonjour à tous,

    J'ai posté il y a quelque temps un problème pour copier le contenu des feuilles qui appartienent aux jours de la semaine.

    Mais voilà, si je n'ai qu'une feuille avec une date de la semaine il me copie les données 5 fois. Je souhaite donc que pendant la boucle il passe au jour suivant si la feuille n'existe pas. J'ai essayé de faire cette manip sans grande réussite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    For I = 1 To 5    'copie les données de la semaine
     
        Set Ws = ThisWorkbook.Worksheets(Format(Date - JourSem + I, "dd-mm-yyyy"))
            If Not existe(Ws) Then      'ligne ajoutée
                Next I                      'ligne ajoutée
                    End If                       'ligne ajoutée
        ligne = Ws.Range("A" & Range("A:A").Rows.Count).End(xlUp).Row
        Ws.Range("A1:B" & ligne).Copy
        .Range("A1").Insert Shift:=xlDown
    Next I
    Merci encore pour vos réponses.

    Bonne journée.

    Cordialement

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Adapte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Dim ws As Worksheet
        On Error Resume Next
        Set ws = Sheets("f")
        If ws Is Nothing Then MsgBox "toto"
        On Error GoTo 0

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Par défaut
    Bonjour Daniel,

    Merci encore pour ta réponse, cela ne fonctionne pas. La macro me copie 5 fois les données de la seule date de semaine.
    Je te joint les fichiers de la semaine dernière ainsi que le code.

    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
    Option Explicit
    Sub Copie()
     
    Dim Wbk As Workbook
    Dim Ws As Worksheet
    Dim Chemin As String
    Dim ligne As Long
    Dim I As Integer
    Dim N As Integer
    Dim JourSem As Integer
    Dim plage As Range
     
     
    Application.ScreenUpdating = False
    Chemin = "C:\CopieTest.xlsx"
    If Dir(Chemin) <> "" Then
        Set Wbk = Workbooks.Open(Filename:=Chemin, UpdateLinks:=False)
     
        With Wbk.Worksheets(1)                              ''supprime les données des dates de la semaine
     
        Application.ScreenUpdating = False
        'Set Wbk = ActiveWorkbook
            .Rows(1).Insert
            .[A1] = "bidon"
            .AutoFilterMode = False
            Set plage = .Range(.[A1], .Cells(.Rows.Count, 1).End(xlUp))
            plage.AutoFilter 1, Format(Date, "dd/mm/yyyy")
     
            Set plage = plage.Offset(1).Resize(plage.Rows.Count - 1)
     
            If Application.Subtotal(103, plage) > 0 Then
                Set plage = plage.SpecialCells(xlCellTypeVisible)
                plage.EntireRow.Delete
                .AutoFilterMode = False
            .Rows(1).Delete
            Else
            .AutoFilterMode = False
            .Rows(1).Delete
            End If
     
     
     JourSem = Application.Weekday(Date, 2)
     
     
     
            For I = 1 To 5
            On Error Resume Next    'copie les données de la semaine
                Set Ws = ThisWorkbook.Worksheets(Format(Date - JourSem + I, "dd-mm-yyyy"))
                If Ws Is Nothing Then MsgBox "toto"
                    On Error GoTo 0
                   ligne = Ws.Range("A" & Range("A:A").Rows.Count).End(xlUp).Row
                    Ws.Range("A1:B" & ligne).Copy
                    .Range("A1").Insert Shift:=xlDown
            Next I
     
            End With
        'Wbk.Close True
    Set Wbk = Nothing
    Else
        MsgBox "Fichier " & Chemin & " inexistant"
    End If
     
    End Sub
    Test.xlsx
    CopieTest.xlsx
    Merci Daniel.

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Hé ! J'ai marqué "Adapte"...
    Essaie :

    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
    Sub Copie()
     
    Dim Wbk As Workbook
    Dim Ws As Worksheet
    Dim Chemin As String
    Dim ligne As Long
    Dim I As Integer
    Dim N As Integer
    Dim JourSem As Integer
    Dim plage As Range
     
     
    Application.ScreenUpdating = False
    Chemin = "C:\CopieTest.xlsx"
    If Dir(Chemin) <> "" Then
        Set Wbk = Workbooks.Open(Filename:=Chemin, UpdateLinks:=False)
     
        With Wbk.Worksheets(1)                              ''supprime les données des dates de la semaine
     
        Application.ScreenUpdating = False
        'Set Wbk = ActiveWorkbook
            .Rows(1).Insert
            .[A1] = "bidon"
            .AutoFilterMode = False
            Set plage = .Range(.[A1], .Cells(.Rows.Count, 1).End(xlUp))
            plage.AutoFilter 1, Format(Date, "dd/mm/yyyy")
     
            Set plage = plage.Offset(1).Resize(plage.Rows.Count - 1)
     
            If Application.Subtotal(103, plage) > 0 Then
                Set plage = plage.SpecialCells(xlCellTypeVisible)
                plage.EntireRow.Delete
                .AutoFilterMode = False
            .Rows(1).Delete
            Else
            .AutoFilterMode = False
            .Rows(1).Delete
            End If
     
     
     JourSem = Application.Weekday(Date, 2)
     
     
            On Error Resume Next    'copie les données de la semaine
            For I = 1 To 5
            On Error Resume Next    'copie les données de la semaine
                Set Ws = ThisWorkbook.Worksheets(Format(Date - JourSem + I, "dd-mm-yyyy"))
                If Not Ws Is Nothing Then
                    On Error GoTo 0
                   ligne = Ws.Range("A" & Range("A:A").Rows.Count).End(xlUp).Row
                    Ws.Range("A1:B" & ligne).Copy
                    .Range("A1").Insert Shift:=xlDown
                End If
            Next I
     
            End With
        'Wbk.Close True
    Set Wbk = Nothing
    Else
        MsgBox "Fichier " & Chemin & " inexistant"
    End If
     
    End Sub

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Par défaut
    Sa gonfle, j'ai essayé un tas de truc jusqu’à faire planté mon pc une dizaine de fois.

    Mais ce que je ne comprend absolument pas c'est que lorsque par exemple I=2, il devrai détecté que WS n'existe pas quand i=2 et devrai donc aller à l'étape suivante, c'est à dire exécuter la boucle pour I=3. Hors, il continu le programme jusqu’à copié 4 fois de plus les données quand I=1.
    De plus, ce qui est étrange c'est que en mode pas à pas tu vois bien le I changer de valeur.

    C'est à ce tirer les cheveux.

    voilà un des tests que j'ai réalisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     On Error Resume Next    'copie les données de la semaine
            For I = 1 To 5
    1:        On Error Resume Next   'copie les données de la semaine
                Set Ws = ThisWorkbook.Worksheets(Format(Date - JourSem + I, "dd-mm-yyyy"))
                If Not Ws = I Is Nothing Then
                    On Error GoTo 1
                   ligne = Ws.Range("A" & Range("A:A").Rows.Count).End(xlUp).Row
                    Ws.Range("A1:B" & ligne).Copy
                    .Range("A1").Insert Shift:=xlDown
                End If
            Next I
    Merci bonne soirée

  6. #6
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Bonjour,

    Sans regarder en détail ton code, cette ligne me saute aux yeux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not Ws = I Is Nothing Then
    remplaces par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not Ws Is Nothing Then

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

Discussions similaires

  1. probleme boucle for
    Par michael75 dans le forum Général JavaScript
    Réponses: 28
    Dernier message: 25/01/2007, 18h51
  2. boucle for avec condition
    Par Daniel Magron dans le forum Delphi
    Réponses: 4
    Dernier message: 22/01/2007, 16h18
  3. Probleme boucle for
    Par griese dans le forum Linux
    Réponses: 4
    Dernier message: 06/12/2006, 14h39
  4. Réponses: 2
    Dernier message: 28/08/2006, 18h17
  5. [VB6] boucle for avec liste de valeur defini
    Par Morpheus2144 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 06/04/2006, 18h12

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