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 :

[VBA] Boucler sur la méthode Workbooks.Open plante Excel


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 10
    Points : 10
    Points
    10
    Par défaut [VBA] Boucler sur la méthode Workbooks.Open plante Excel
    Bonjour,
    Je récupère en VBA via la méthode Workbooks.Open(monUrl) le contenu d'une page Html.
    Pour en récupérer plusieurs, je fais une boucle pour récupérer itérativement l'ensemble des données dont j'ai besoin.
    Mon problème est qu'à partir d'un certain point (j'ai l'impression aléatoirement) la méthode Open plante et j'ai :
    * Soit Excel qui plante complètement (page blanche, puis Excel se ferme entièrement)
    * Soit le message d'erreur "La méthode Workbooks.Open a echoué" ou Impossible d'ouvrir www.google.fr

    J'ai trouvé un post expliquant qu'Excel posait problème à ce niveau là : http://support2.microsoft.com/kb/210684/fr#survey
    Mais malgré le fait de fermer le classeur puis de le rouvrir, pas moyen de récupérer l'ensemble des informations des pages !

    Vous avez une idée pour contourner ça ?

    Ci-dessous le code VBA que j'utilise (fichier TestCopieIndex_Baremes_memeOnglet.xlsm) :

    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
    Sub CopySheetTest()
        Dim iTemp As Integer
        Dim oBook As Workbook
        Dim oBookTemp As Workbook
        Dim iCounter As Integer
        Dim nbLinges As Long
        Dim ligne As Long
     
        ' Create a new blank workbook:
        iTemp = Application.SheetsInNewWorkbook
        Application.SheetsInNewWorkbook = 1
        Set oBook = Application.Workbooks.Add
     
        ' Save the workbook:
        oBook.SaveAs "C:\Users\MERTZJL\testRecup_memeOnglet2.xlsx"
     
        ' Copy the sheet in a loop. Eventually, you get error 1004: Copy Method of Worksheet class failed.
        For iCounter = 1 To 100
            Set oBookTemp = Application.Workbooks.Open("http://www.google.fr")
     
            'On supprime également la petite image et on met en forme
            For Each monImage In oBookTemp.Worksheets(1).Shapes
                monImage.Delete
            Next monImage
            For Each monLien In oBookTemp.Worksheets(1).Hyperlinks
                monLien.Delete
            Next monLien
     
     
            oBookTemp.Worksheets(1).Copy After:=oBook.Worksheets(1)
            oBookTemp.Close SaveChanges:=False
     
            'Copie de la zone délimitée par ce nombre de lignes
            nbLignes = oBook.Worksheets(2).Range("A100000").End(xlUp).Row
            oBook.Worksheets(2).Range("A1:A" & nbLignes).EntireRow.Copy
            'On le colle dans l'onglet correspondant dans le fichier principal
            ligne = oBook.Worksheets(1).Range("A1000000").End(xlUp).Row + 4
            oBook.Worksheets(1).Range("A" & ligne).PasteSpecial xlPasteAll
            oBook.Worksheets(1).Range("A" & ligne & ":A" & ligne + 1).EntireRow.Delete
     
            Application.DisplayAlerts = False
            oBook.Worksheets(2).Delete
            Application.DisplayAlerts = True
     
            'Uncomment this code for the workaround:
            'Save, close, and reopen after every 100 iterations:
            If iCounter Mod 20 = 0 Then
                oBook.Close SaveChanges:=True
                Set oBook = Nothing
                Set oBook = Application.Workbooks.Open("C:\Users\MERTZJL\testRecup_memeOnglet2.xlsx")
            End If
        Next
    End Sub
    J'ai essayé de faire la même chose sans concaténer mes informations dans le même onglet et étrangement ça passe (fichier TestCopieIndex_Baremes.xlsm) :

    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
    Sub CopySheetTest()
        Dim iTemp As Integer
        Dim oBook As Workbook
        Dim oBookTemp As Workbook
        Dim iCounter As Integer
        Dim nbLinges As Long
        Dim ligne As Long
     
        ' Create a new blank workbook:
        iTemp = Application.SheetsInNewWorkbook
        Application.SheetsInNewWorkbook = 1
        Set oBook = Application.Workbooks.Add
        Application.SheetsInNewWorkbook = iTemp
     
        ' Save the workbook:
        oBook.SaveAs "C:\Users\MERTZJL\testRecup_memeOnglet.xlsx"
     
        ' Copy the sheet in a loop. Eventually, you get error 1004: Copy Method of Worksheet class failed.
        For iCounter = 1 To 100
            Set oBookTemp = Application.Workbooks.Open("http://www.google.fr")
            'On supprime également la petite image et on met en forme
            For Each monImage In oBookTemp.Worksheets(1).Shapes
                monImage.Delete
            Next monImage
            For Each monLien In oBookTemp.Worksheets(1).Hyperlinks
                monLien.Delete
            Next monLien
     
            Application.SheetsInNewWorkbook = iTemp
     
            oBookTemp.Worksheets(1).Copy After:=oBook.Worksheets(1)
            oBookTemp.Close SaveChanges:=False
     
            'Uncomment this code for the workaround:
            'Save, close, and reopen after every 100 iterations:
            If iCounter Mod 20 = 0 Then
                oBook.Close SaveChanges:=True
                Set oBook = Nothing
                Set oBook = Application.Workbooks.Open("C:\Users\MERTZJL\testRecup_memeOnglet.xlsx")
            End If
        Next
    End Sub
    Merci.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 10
    Points : 10
    Points
    10
    Par défaut Le faire en 2 fois ...
    Du coup je l'ai fait en 2 fois, et ça passe.
    Soit copier coller toutes les pages dans un premier temps dans un onglet différent à chaque fois, puis regrouper tous les onglets ainsi formés dans un onglet unique dans un second temps.
    Bizarre quand même de ne pas pouvoir faire ça en une fois ^^

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

Discussions similaires

  1. [Débutant] Boucler sur les cellules d'un fichier Excel (VB NET)
    Par intimed dans le forum VB.NET
    Réponses: 1
    Dernier message: 23/03/2012, 11h55
  2. [VBA-E] Workbooks.open sur .csv regroupe tout sur 1 colonne
    Par Yeti75_fr dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/03/2007, 11h36
  3. [VBA] information sur une méthode
    Par stolx_10 dans le forum Access
    Réponses: 27
    Dernier message: 19/09/2006, 17h27
  4. [VBA-E] sous procédure avec workbook open
    Par raver2046 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 30/03/2006, 00h20
  5. [Excel VBA] Boucler sur un userform
    Par tpv72 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/09/2005, 01h57

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