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 :

continuer une boucle même si une requête ne fonctionne pas


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut continuer une boucle même si une requête ne fonctionne pas
    Bonjour à tous,
    Débutant en vba, je n'ai pas su trouver une réponse à ma question, que ce soit sur l'aide en ligne, soit sur ce forum.
    J'explique mon problème, je fais un traitement de données pour mon entreprise de recherche, dans laquelle je suis en stage. J'importe des fichiers .text par une requête sous excel. Mais il se peut que les fichiers puissent ne pas exister certaines fois. J'aimerai que cela ne me pose pas de problème et que l'on passe au fichier suivant.
    Je vous envoie une partie de mon programme, là où est mon problème, désolé, je n'ai pas le droit de tout envoyer.
    Mon problème apparaît quand il n'y a pas le fichier, par exemple pour i=4,
    est excel indique un beug à ce niveau : .Refresh BackgroundQuery:=False.
    J'ai pensé à mettre une condition, du type : si le fichier n'existe pas passer à i+1, mais je ne vois pas comment faire.
    Merci d'avance.


    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
    Do While Quitter = False
      
    If i <> 0 And i <> 6 And i <> 14 And i <> 26 And i <> 38 And i <> 50 And i <> 55 And i <> 63 And i <> 70 And i <> 78 Then
     
     ' création d'une boucle pour obtenir plusieurs fichiers de données dans différentes colonnes à partir d'une acquisition
     
     
        Nom_fichier = Feuil8.Range("C8").Offset(0, i).Value
        
    'permet de connaître le nom du fichier à acquérir
    
        With ActiveSheet.QueryTables.Add(Connection:= _
            "TEXT;F:\degrémont\last one\Données Macro\" & Nom_fichier & ".txt" _
            , Destination:=Range("CD9"))
            .Name = Nom_fichier
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = False
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 1252
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = True
            .TextFileSemicolonDelimiter = True
            .TextFileCommaDelimiter = False
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(5, 1, 1)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End With
      'acquisition d'un fichier text sous excell
        
        
       
        If i <> 1 And i <> 7 And i <> 15 And i <> 27 And i <> 39 And i <> 51 And i <> 56 And i <> 64 And i <> 71 And i <> 79 Then
             
       
          
          
            Else
                    
            End If
            
    
            
        Else
        
                If i = 0 Or i = 6 Or i = 14 Or i = 26 Or i = 38 Or i = 50 Or i = 55 Or i = 63 Or i = 70 Then
            
                Else
            
            Quitter = True
                
                End If
        
        
        End If
         
           i = i + 1
        
        Loop
    
    
    End Sub

  2. #2
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Bonjour,

    Tu peux peut-être te servir de la gestion des erreurs avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    on error resume next

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2008
    Messages : 73
    Points : 49
    Points
    49
    Par défaut
    Voici un exemple qui devrait répondre à ton probléme :
    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
        Call DataTemp
        If Err <> 0 Then
                ActiveWindow.SelectedSheets.Delete
                On Error GoTo 0
        Else
            Call Traitement
            Call ending
            MsgBox "Traitement du fichier terminé, la Base de Données à bien été mise à jour !"
            Workbooks(nom2).Close
        End If
    donc, si j'ai une erreur je continue, si le flag Err (interne à vb) est différent de 0 (il y a eu une erreur) alors je supprime une feuille et je supprime l'erreur.

    Sinon je continue mon traitement.

    En espérant que cela ai pu t'aider.

    Deniooo.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 44
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    et avec un test pour savoir si le fichier existe?

    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
    Dim sCheminDonnees as String, sNomFichier as String
     
    ' hors de la boucle :
    sCheminDonnees  = "F:\degrémont\last one\Données Macro\"
     
    ' dans la boucle :
    sNomFichier= Feuil8.Range("C8").Offset(0, i).Value
     
    If Dir(sCheminDonnees & Nom_fichier & ".txt") <> "" Then
      ' le fichier existe, on fait le traitement
      With ActiveSheet.QueryTables.Add(Connection:= _
            "TEXT;" & sCheminDonnees  & Nom_fichier & ".txt", Destination:=Range("CD9"))
        ' tout le truc
      End With
    End If

  5. #5
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Salut

    Pour l'instant, je ne sais pas trop si ça fera effectivement ou non une différence ou non, mais voyons d'abord ceci.

    J'ai remarqué que tu ne mets pas tes conditions de test de structures conditionnelles (If... Then... Else... End If) entre parenthèses. C'est important surtout s'il y a plusieurs conditions à tester. Par exemple, dans la ligne de code suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If i <> 0 And i <> 6 And i <> 14 And i <> 26 And i <> 38 And i <> 50 _
        And i <> 55 And i <> 63 And i <> 70 And i <> 78 Then
    tu auras sans doute de meilleurs résultats en écrivant ce genre de ligne ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If (i <> 0) And (i <> 6) And (i <> 14) And (i <> 26) And (i <> 38) _
        And (i <> 50) And (i <> 55) And (i <> 63) And (i <> 70) And (i <> 78) Then
    Si ça ne résout pas ton problème, fais le quand même, c'est une bonne habitude à prendre.

Discussions similaires

  1. [PDO] Une boucle while dans une boucle while
    Par subran dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 28/02/2015, 19h32
  2. Réponses: 6
    Dernier message: 18/02/2014, 20h39
  3. continuer la boucle meme apès une erreur
    Par friedamichelle dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2009, 11h28
  4. création d'une boucle for pour interrogation requête sql
    Par philder62 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/12/2007, 15h14
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

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