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 :

Erreur d'exécution 9 suite à migration Excel 2003->2010 [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 2
    Par défaut Erreur d'exécution 9 suite à migration Excel 2003->2010
    Bonjour,

    Cela fait quelques heures que je parcours l'internet à la recherche d'une solution pour mon problème et je crois qu'il est temps d'essayer de trouver un peu d'assistance directe.

    Je touche pas beaucoup en VBA, mais je suis chargé de l'utilisation de cette macro quasiment tous les jours, qui nous sert à recopier des données depuis des formulaires qu'on nous envoie en moyenne 1-2 fois par jour sur un grand tableau dans un classeur que j'ai renommé "NomDuFichierImportant".
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    Private Sub RandomName_Click()
     
    Application.ScreenUpdating = False
     
    Dim Fichier As String, Chemin As String
    Dim Wb As Workbook
     
     
     
    Chemin = "A:NomDuChemin"
     
     
     
    Fichier = Dir(Chemin & "*.xls")
    Do While Fichier <> ""
    Set Wb = Workbooks.Open(Chemin & Fichier)
    Set Wb = Nothing
    Fichier = Dir
    Loop
     
     
    Dim NOMFICHIER As String
    Dim DATEDUJOUR As Date
     
     
    NOMFICHIER = ActiveWorkbook.Name
     
     
     
    Do While NOMFICHIER <> "NomDuFichierImportant.xls"
     
     
    Worksheets("Technique").Visible = True
    Worksheets("Technique").Select
    ActiveSheet.Range("B50").Select
    ActiveSheet.Range(Selection.Offset(0, 0), Selection.Offset(0, 20)).Select
    Selection.Copy
     
     
     
    Workbooks("NomDuFichierImportant").Activate
     
     
     
    Sheets("FeuilleImportante").Select
    DATEDUJOUR = Range("H2").Value
    ActiveSheet.Range("B5").Select
    Selection.End(xlDown).Select
    ActiveCell.Offset(1, 0).Select
    ActiveCell.Value = ActiveCell.Offset(-1, 0).Value + 1
    ActiveCell.Offset(0, 3).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
     
     
    Workbooks(NOMFICHIER).Activate
    Application.DisplayAlerts = False
    ActiveWindow.Close
    Application.DisplayAlerts = True
     
    ActiveWindow.ActivateNext
     
    NOMFICHIER = ActiveWorkbook.Name
    Loop
     
    ActiveWorkbook.Save
     
    Application.DisplayAlerts = False
     
     
    ActiveWindow.Close
     
     
     
    Workbooks("NomDuFichierImportant").Activate
     
     
    ActiveWindow.Close
    Application.DisplayAlerts = True
     
     
    Application.ScreenUpdating = True
     
     
    End Sub
     
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     
    End Sub
    L'erreur porte sur : Worksheets("Technique").Visible = True. J'ai essayé plusieurs nomenclatures (Sheets, Sheet, Worksheet), cela ne change rien malheureusement. Le nom de la feuille est également bien orthographié.

    Lorsque j'ouvre les formulaires individuellement, j'ai un pop-up de demande d'activation des macros (le formulaire contient lui aussi une macro), ce qui est logique puisque le setting est à "désactiver toutes les macros avec notification". Je ne peux pas le changer, pour des raisons de sécurité. Est-ce que c'est ça qui bloque la macro du coup et qui l'empêche de travailler sur les autres classeurs? J'ai été obligé de faire une migration sur Excel 2010, le classeur devenait énorme dans sa version 97-2003 et mettait plusieurs minutes à s'ouvrir. Et compte tenu de note utilisation de celui-ci assez intensive, cela n'aurait fait qu'empirer avec les multiples engistrements journalier.

    Est-ce une erreur dans le code, ou une modification entre VBA pour Excel 2003 et 2010 qui rend le code faux?

    Merci beaucoup à ceux qui prendront le temps de me répondre, je commence à m'arracher les cheveux avec ce problème.

    Ah oui, dernier détail (qui n'en est pas un), les données sont bel et bien copiées au bon endroit, c'est juste qu'il y a cette erreur que je ne m'explique pas et que j'aimerai bien faire disparaître.

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Par défaut
    Bonjour à toi,

    Avant tout, je te conseille très fortement de travailler avec des variables objets pour tes fichiers et feuilles !! Ce sera beaucoup moins confus.
    De manière générale, évite le plus possible l'utilisation de .select et de Selection / ActiveSheet / ActiveWorkbook / ActiveCell...

    Dans ton code, je remarque pourtant que tu utilises sans trop de raison une variable appelée Wb pour ouvrir ton workbook. Faire ceci est très bien, sauf que tu vides cette variable juste après !! Pourquoi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Set Wb = Workbooks.Open(Chemin & Fichier)
    Set Wb = Nothing
     
    Dim NOMFICHIER As String
     
    NOMFICHIER = ActiveWorkbook.Name
    '...
    Workbooks(NOMFICHIER).Activate
    Pourquoi ne pas faire simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set Wb = Workbooks.Open(Chemin & Fichier) 
    '...
    Wb.Activate 'évite d'ailleurs l'utilisation du .activate à moins que tu veuilles juste le montrer à l'utilisateur en fin de code
    Je te ferai un petit point avec des modifications que j'apporterais par la suite, mais je te conseille d'abord de toujours spécifier de quel workbook tu parles lors de l'utilisation de workbooks multiples.
    Ainsi, à la place de ton Worksheets("Technique").Visible = True, mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Wb.Worksheets("Technique").Visible = True
    Avec Wb le workbook correspondant.

    Au passage, tes boucles ne me semblent pas vraiment adaptées, je vais essayer de te faire un point plus bas

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Par défaut
    J'arrive à ça en simplifiant pas mal :

    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
    Private Sub RandomName_Click()
     
    Application.ScreenUpdating = False
     
    Dim DATEDUJOUR As Date
     
    Dim Fichier As String, Chemin As String
    Dim Wb As Workbook
     
    Dim WbImportant As Workbook
    Set WbImportant = Workbooks("NomDuFichierImportant") 'ThisWorkbook si ce workbook est celui dont tu lances la macro :)
     
    Dim ShImportante As Worksheet
    Set ShImportante = WbImportant.Sheets("FeuilleImportante")
     
    'Ok, donc ton chemin est déterminé ici avec sa vraie valeur, pas celle que tu nous montres
    Chemin = "C:\...\Dossier\"
     
     
    'Ici, je ne sais pas si ça marchera, pour éviter tout ce bazar avec les strings des noms et tout, boucle directement !!
    Fichier = Dir(Chemin & "*.xls")
    Do While Fichier <> ""
        'Tu ouvres ton workbook et mémorises le wb et sa feuille à exploiter
        Set Wb = Workbooks.Open(Chemin & Fichier)
        Set Ws = Wb.Worksheets("Technique")
        'tu rends la feuille visible (ce qui est inutile, vba lit sans soucis une feuille masquée)
        Ws.Visible = True
        Ws.Range("B50:V50").Copy 'oublie les .select et selection.Copy
     
        DATEDUJOUR = ShImportante.Range("H2").Value 'si tu veux obtenir la date du système, écris juste Date
        With ShImportante.Range("B5").End(xlDown).Offset(1, 0)
            .Value = .Offset(-1, 0).Value + 1
            .Offset(0, 3).PasteSpecial Paste:=xlPasteValues
        End With
     
        Wb.Close SaveChanges:=False
        Set Wb = Nothing
        Fichier = Dir
    Loop
     
    WbImportant.Save
     
    Application.ScreenUpdating = True
     
    End Sub
    Dis-moi si ça marche, je n'ai pas essayé

    De toute façon, tu peux t'affranchir dans presque tous les cas du "ActiveXXX" et du ".Select → Selection.XXX"
    Ta macro en sera grandement accélérée et deviendra plus lisible.

    En réalité, quand tu écris Range("A1") vba comprend
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ActiveWorkbook.ActiveSheet.Range("A1")
    Heureusement que tu n'as pas besoin de lui spécifier tout ça à chaque fois !! Du coup, à part un cas du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks(XXX).ActiveSheet.Name
    donc un "activesheet" après un workbook défini, par exemple, alors il n'y a aucun intérêt à spécifier ActiveSheet... ou ActiveWorkbook, etc.

    De même, au lieu de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Range("A1").Select
    Selection.Offset(1,0).Select
    Selection.End(xlDown).Select
    Selection.Offset(0,3).Select '... 
    Selection.Value = "test"
    Pourquoi pas simplement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1").Offet(1,0).End(xlDown).Offset(0,3).Value = "test"
    Cela permet d'avoir un traitement rapide, sans que la sélection soit folle et parte de tous les côtés. Et c'est beaucoup plus clair à lire !!

    Enfin bon, dis-moi si ça t'apporte quelque chose ou si je me suis mal exprimé... Bien sûr, si le code fourni ne fonctionne pas, dis-le moi

  4. #4
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 2
    Par défaut
    Wow... Merci infiniment, ça marche au poil et c'est TELLEMENT plus efficace que ce qu'on avait avant...

    J'ai essayé d'appliquer une solution via ton premier post dans un premier temps, et je ne suis arrivé à rien par moi-même malheureusement, pas mal d'erreurs et d'incompréhension.

    Je t'avoue que je ne saisis pas encore toutes les modifs que tu as faites, mais je prends en note tous les conseils sur la non-nécessité de procéder comme on le faisait, c'est à dire d'afficher les onglets cachés pour faire les copier/coller, et la fermeture du fichier Excel après utilisation de la macro ce qui n'apporte visiblement rien. Il y a un petit bout de code sur la création d'un backup dans un autre fichier que j'avais scrapé dans mon message et qui utilise la variable DATEDUJOUR, mais d'après ton conseil il n'est pas nécessaire de procéder ainsi, je vais aussi modifier ça.

    Merci infiniment, je me repenche sur le code la semaine prochaine pour mieux le comprendre (en fait on a deux macros qui font à peu de choses près la même chose, je vais m'appuyer sur ce que tu m'as proposé pour réparer l'autre également), j'ai pas mal d'autres choses à expédier ce soir.

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Par défaut
    Super, très content que ça marche bien

    Si tu as des questions sur ce que j'ai écrit et que tu ne comprendrais pas, n'hésite pas à me les poser ici ou en message privé !

    Quentin

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

Discussions similaires

  1. Migration Excel 2003 vers 2010
    Par Shereen dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/07/2013, 21h05
  2. [AC-2003] Erreur d'exécution '2001' suite à un DLookup
    Par phoon dans le forum VBA Access
    Réponses: 2
    Dernier message: 06/11/2009, 14h58
  3. [XL-2007] Migration Excel 2003 -> 2007
    Par Draggor dans le forum Excel
    Réponses: 2
    Dernier message: 22/10/2009, 18h05
  4. Erreur d'exécution 91 VBA Access-> Excel
    Par guestCam dans le forum VBA Access
    Réponses: 3
    Dernier message: 14/08/2008, 11h43
  5. Réponses: 2
    Dernier message: 06/08/2008, 08h43

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