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 :

Pb fichier Excel


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 37
    Points : 21
    Points
    21
    Par défaut Pb fichier Excel
    Bonjour

    Trois jours de galère, je relance la question...

    Une macro VBA Word qui manipule (qui veut manipuler !) Excel.

    Elle fonctionne une fois puis chaque fois suivante elle déclenche une erreur 1024. même si je change de fichier (Test1.xlsx vers Test2.xlsx).

    Il faut fermer l'application Word pour que la macro fonctionne à nouveau une seule fois !

    Si quelqu'un pense à une piste ?

    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
     
        Dim XlApp As Object
        Dim XlBook As Object
        Dim Sheet1 As Object
        Dim Sheet2 As Object
        Dim DernLig As Integer
        Dim Msg As String
     
        Set XlApp = CreateObject("Excel.Application")
        Set XlBook = XlApp.Workbooks.Open("D:\Test1.xlsx")
        Set Sheet1 = XlBook.Worksheets(1)
        Set Sheet2 = XlBook.Worksheets(2)
     
        XlApp.Visible = True
        On Error Resume Next
     
        DernLig = Sheet2.Range("G65536").End(xlUp).Row
     
        Sheet1.Select
        XlBook.Sheets(1).Range(Cells(1, 1), Cells(5, 3)). _
            Font.Italic = True
     
        If Err.Number <> 0 Then
            Msg = "Erreur : " & Str(Err.Number) & "générée par " _
                & Err.Source & Chr(13) & Err.Description
            MsgBox Msg, , "Erreur", Err.HelpFile, Err.HelpContext
            Err.Clear
        End If
     
        XlBook.Close
        XlApp.Quit
        Set XlApp = Nothing
        Set Sheet1 = Nothing
    Cordialement
    Jean-Jacques

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    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 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    Sur quelle ligne as-tu l'erreur ?
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    Bonjour

    J'ai un peu progressé car avec la gestion de l'erreur, il suffit de fermer le document Word pour recommencer. Avant, il fallait relancer la machine !

    Cela voudrait, aussi, dire que mon traitement de l'erreur n'est pas satisfaisant !

    J'ai enfin pu cerner l'erreur... et elle apparait sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Sheet2.Range(Cells(2, 1)).Value = "I"
    alors que, par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Sheet2.Range("F1:F2690").Value = "M"
    fonctionne de même que les Copier/Coller du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Sheet1.Columns(1).Copy Destination:=Sheet2.Cells(1, 11)
    Il semble donc que "Cells" n'est pas accepté avec Value ou... !

    Je souhaite remplir, par exemple, la colonne "F" de 1 à "DernLig" avec "M"
    Ici "DernLig = 2690", mais cela varie !

    J-J

  4. #4
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Points : 3 974
    Points
    3 974
    Par défaut
    Bonjour,

    Je souhaite remplir, par exemple, la colonne "F" de 1 à "DernLig" avec "M"
    Essaie avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheet2.range("F1:F" & DernLig)="M"
    Tu ne peux pas écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheet2.Range(Cells(2, 1)).Value = "I"
    Pour affecter la valeur “I” à la cellule A2, tu dois écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheet2. Cells(2, 1)).Value = "I"
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheet2.Range(“A2”).Value = "I"

    Cordialement.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    Bonjour

    Merci...
    La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Sheet2.range("F1:F" & DernLig)="M"
    Fonctionne parfaitement.

    Deux questions

    1) Comment faire la même chose que ci-dessus avec "Cells" ?
    2) Y a-t-il une faute dans la gestion de mon erreur qui expliquerait que je puisse pas relancer ? C'est comme si le fichier restait ouvert !

  6. #6
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 696
    Points
    6 696
    Par défaut
    Bonjour,

    Citation Envoyé par jj37fr Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheet2.range("F1:F" & DernLig)="M"
    1) Comment faire la même chose que ci-dessus avec "Cells" ?
    l'écriture équivalente est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(Cells(1, 6), Cells(DernLig, 6)) = "M"
    Cordialement,

    Ps : si le côté technique de la réponse = OK ou pas => pensez à cliquer sur les pouces et quand question résolue à la taguer résolue, et chaque action vous rapporte des points

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    Bonjour

    Où l'on retombe sur le problème.
    Si je rajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Sheet2.Range(Cells(1, 6), Cells(DernLig, 6)) = "M"
    en lieu et place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Sheet2.Range("F1:F" & DernLig).Value = "M"
    Cela fonctionne une fois ! J'ouvre D:\Test1.xlsx ; j'efface la feuille 2 ; je relance ; j'obtiens une erreur 1004 "La méthode 'Cells' de l'objet '_Global' a échoué"

    Étrange ! Non !

    J-J

  8. #8
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 696
    Points
    6 696
    Par défaut
    Bonjour,

    dans ton code du début, tu as ceci :
    as-tu aussi un
    et idem pour les autres instanciations de variables objet ?

    Cordialement,

    Ps : si le côté technique de la réponse = OK ou pas => pensez à cliquer sur les pouces et quand question résolue à la taguer résolue, et chaque action vous rapporte des points

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  9. #9
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 696
    Points
    6 696
    Par défaut
    Bonjour,

    J'ai (enfin) regardé ton 1er code de près, il est très brouillon, ce qui est tout à fait compréhensible selon ton niveau / VBA, mais qui forcément t'amèneras à ce genre de galère sur des projets qui ne sont plus basiques.

    par exemple, pourquoi utilises-tu cette écriture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XlBook.Sheets(1).Range(Cells(1, 1), Cells(5, 3)).Font.Italic = True
    alors que tu as instancié une variable objet qui pointe justement sur la feuille1 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Set Sheet1 = XlBook.Worksheets(1)
    C'est pas-propre et très dangereux car de plus tu utilises Sheets(1) et non plus Worksheets(1) qui, si tu as le malheur d'avoir une feuille de Graph en 1ère position pointera sur celle-ci et plantera (ouf, ça évitera des mélanges) à l'invocation de cellules qu'elle ne possède pas...

    Donc, ton soucis vient, je pense, d'une confusion du VBA, à un moment donné, entre les objets Range d'Excel et de Word et entre la propriété Cells d'Excel et la collection Cells de Word ceux-ci n'ayant rien à voir les uns avec les autres....
    (c'est pourquoi j'avais flashé sur la non destruction d'un pointeur sur mon post précédent)
    Bref, on gagne toujours à être explicite dans les codes

    Test le code ci-dessous, vois l'aide VBA sur les mots clefs et surtout les tutoriels dispos sur DVP à ces sujets !

    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
    Option Explicit
    Sub GOGO() 'dans Word
    ''demande à référencer la librairie Excel dans Outils-Références
     
    Dim XlApp As Excel.Application 'Ne pas travailler en auto-instanciation, mais ainsi
    Dim XlBook As Workbook  ''travailler en liaison anticipées / early binding
    Dim Sheet1 As Worksheet ''travailler en liaison anticipées / early binding
    '''Dim MaPlage as Excel.Range ' Si j'instanciai une variable objet pour la plage cible, elle serait typée ainsi...
    Dim Msg As String
     
    Set XlApp = New Excel.Application 'Ne pas travailler en auto-instanciation, mais ainsi
    XlApp.Visible = True
    Set XlBook = XlApp.Workbooks.Open(Chemin voulu) 'chemin + classeur à définir
    Set Sheet1 = XlBook.Worksheets(1)
     
    With Sheet1
        .Select 'inutile et ralentissant si pas voulu, la feuille n'a pas besoin d'être active pour écrire dessus...
        .Range(.Cells(1, 1), .Cells(5, 3)).Value = "DG" 'explicite ! 
        ''' équivalent à l'écriture : Sheet1.Range(Sheet1.Cells(1, 1), Sheet1.Cells(5, 3)).Value = "DG" si pas de With...
    End With
     
    If Err.Number <> 0 Then
        Msg = "Erreur : " & Str(Err.Number) & "générée par " & Err.Source & Chr(13) & Err.Description
        MsgBox Msg, , "Erreur", Err.HelpFile, Err.HelpContext
    Err.Clear
    End If
    ' penser à gérer la sauvegarde des modifs avant de fermer / quitter
    Set Sheet1 = Nothing
    XlApp.Quit
    Set XlApp = Nothing
     
    End Sub
    Cordialement,

    Ps : si le côté technique de la réponse = OK ou pas => pensez à cliquer sur les pouces et quand question résolue à la taguer résolue, et chaque action vous rapporte des points

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  10. #10
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    Bonsoir

    Merci pour ce mini cours...

    J'ai essayé cela... aussi... à un moment... mais difficile de trouver la bonne version avec tout ce qui traîne sur la toile.

    Je vais reprendre mon code (qui fonctionne pour l'instant) dans ce sens !

    Pour abuser - un peu - je souhaite (toujours à partir de Word) sauvegarder ma feuille 2 en .csv, séparé par des virgules !!!
    As-tu une idée ?
    J'imagine qu'après XlBook.Save, je dois, peut-être faire un Sheet2. save avec un Destination:= ... ????

    Je ne trouve pas grand chose sur ce sujet !

    J-J

  11. #11
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 696
    Points
    6 696
    Par défaut
    Bonjour,

    Pour ça il faut lire :

    Les règles :http://club.developpez.com/regles/

    Un sujet par fil

    cordialement,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

Discussions similaires

  1. Extraction de données sur des fichiers excel
    Par iupgeii dans le forum MFC
    Réponses: 3
    Dernier message: 23/01/2004, 13h53
  2. Enregistrement d'un fichier Excel par automation
    Par tiopan dans le forum Access
    Réponses: 2
    Dernier message: 04/12/2003, 19h57
  3. Sauvegarde fichier excel
    Par tiopan dans le forum VBA Access
    Réponses: 2
    Dernier message: 22/10/2003, 13h36
  4. [Turbo Pascal] Utiliser un fichier Excel
    Par Lady dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 09/03/2003, 20h34
  5. Réponses: 2
    Dernier message: 22/07/2002, 12h13

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