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 :

Syntaxe (set, open, copy, activate..)


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 46
    Par défaut Syntaxe (set, open, copy, activate..)
    Bonjour,
    J'ai de gros problèmes concernant certains codes VBA tout simples. Je pense (j'espère!) que c'est juste un pb de syntaxe (je débute) mais je ne vois pas où ça pêche. De plus il y a des codes qui des fois marchent, des fois ne marchent pas. Bref je m'arrache les cheveux...

    Dans cette macro j'ai rassemblé les trucs basiques qui me posent pb

    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
    Sub test()
     
        Dim Cl1 As Workbooks
        Dim Cl2 As Workbooks
     
        Set Cl1 = Workbooks("E:\Classeur1.xls")
        Set Cl2 = Workbooks("E:\Classeur2.xls")
     
        Workbooks.Open Filename:=Cl2
        Workbooks.Open Filename:="E:\Classeur2.xls"
     
        Cl1.Worksheets("Feuil1!").Range("A1").Copy Destination:=Cl2.Worksheets("Feuil1!").Range("A1")
     
        Windows("Classeur1.xls").Activate
        Worksheets("Feuil1").Cells.Select
        Selection.Copy
        Windows("Classeur2.xls").Activate
        Worksheets("Feuil1").Select
        Range("A1").Select
        ActiveSheet.Paste
     
        Workbooks("Classeur1.xls").Worksheets("Feuil1").Cells.Select
        Selection.Copy
        Workbooks("Classeur2.xls").Worksheets("Feuil1").Select
        Range("A1").Select
        ActiveSheet.Paste
     
        Workbooks("Classeur2").Activate
        Cl2.Activate
     
        Worksheets("Feuil1").Range("B1").Value = 594
        Cl2.Worksheets("Feuil1").Range("B1").Value = 594
     
        Cl2.Save
        Cl2.Close
     
    End Sub
    Dans cette macro
    -- set ne marche pas toujours
    -- le premier open ne marche pas mais le deuxième si
    -- dans le "copy" le second worksheet n'est pas appréciée
    -- le bloc d'après fonctionne : c'est celui que j'ai fais avec la macro d'enregistrement et que je voudrais éviter de faire !
    -- le compromis entre les deux du dessus : "la méthode select a échouée"
    -- dans les affectations de la valeur 594 : la 1ère marche si l'on supprime les lignes set (sinon les set font foirer la macro) et la 2e ne marche pas
    -- les lignes avec activate ne marche pas
    -- save et cose non plus

    Je crois avoir remarquer que le set ne déraille que lorsque je ne l'utlise pas après. Et visiblement je n'utilise pas bien les variables Cl1 et Cl2...

    Avis aux bons samaritains ! J'ai besoin de vos lumières !

  2. #2
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Bonjour,

    Essaye ceci
    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
    Sub test()
     
        Dim Cl1 As Workbook, Cl2 As Workbook '<-- déclaration as Workbook sans S
     
        Set Cl1 = Workbooks.Open("E:\Classeur1.xls")
        Set Cl2 = Workbooks.Open("E:\Classeur2.xls")
     
        Cl1.Worksheets("Feuil1").Cells.Copy Cl2.Worksheets("Feuil1").Range("A1") '<-- worksheets("Feuil1") sans point d'exclamation
     
        Cl2.Worksheets("Feuil1").Range("B1").Value = 594
     
        Cl2.Save
        Cl2.Close
     
    End Sub

  3. #3
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 46
    Par défaut
    Merci pour les propositions !
    Sans la ligne copy tout fonctionne. Le copy ne fait pas foirer la macro mais il ne s'execute pas. Je me demande si ce n'est pas parce que je rouvre le Cl1 alors qu'il est déjà ouvert (c'est celui qui contient la macro). Quand je fais la macro "pas à pas détaillé" ça tourne en rond : arrivé au Cl1....open, il repart au début... et le reste du programme ne s'effectue pas. Il faudrait déclarer Cl1 sans l'ouvrir. Y a t il un moyen ? (j'ai réssayer Set Cl1 = Workbooks("E:\Classeur1.xls") mais ça ne marche pas)

    Par ailleurs j'ai besoin de déclarer une variable cellule dans une macro. J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set cel = ThisWorkbooks.Worksheets("Sheet1").Range("A2")
    Set cel = Workbooks("MacroHydraulique.xls").Worksheets("Sheet1").Range("A2")
    Le 2e marche mais pas le 1er. Pourquoi ? (MacroHydraulique.xls est bien le fichier contenant la macro)

  4. #4
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    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
    Sub test()
     
        Dim Cl1 As Workbook, Cl2 As Workbook '<-- déclaration as Workbook sans S
     
        Set Cl1 = ThisWorkbook
        Set Cl2 = Workbooks.Open("E:\Classeur2.xls")
     
        Cl1.Worksheets("Feuil1").Cells.Copy Cl2.Worksheets("Feuil1").Range("A1") '<-- worksheets("Feuil1") sans point d'exclamation
     
        Cl2.Worksheets("Feuil1").Range("B1").Value = 594
     
        Cl2.Save
        Cl2.Close
     
    End Sub

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut pythagore3_14 et le forumWorkbooks : Collection de classeurs
    Workbook : Classeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks.Open Filename:=Cl2
    Ouvrir un classeur déjà ouvert ? et tu t'étonne qu'Excel s'insurge ?
    Workbooks.Open Filename:="E:\Classeur2.xls"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cl1.Worksheets("Feuil1!").Range("A1").Copy Cl2.Worksheets("Feuil1!").Range("A1")
    En formule, l'opérateur de liaison est "!" donc, à moins que le nom réel de l'onglet soit bien "Feuil1!", utilises "Feuil1"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil1").Cells.Select
    Tu ne peux pas sélectionner une plage si la feuille n'est pas activée avant idem (feuille/classeur) La solution : ne pas utiliser Select/Activate pour faire référence à une plage. vais par refaire ce qu'à fait fring, autant qu'un seul se fatigue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        Workbooks("Classeur2").Activate
        Cl2.Activate
    Même instruction, à la condition que Cl2 soit Classeur2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         Worksheets("Feuil1").Range("B1").Value = 594
        Cl2.Worksheets("Feuil1").Range("B1").Value = 594
    La première ligne peut être remplacée par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWorkBook.Worksheets("Feuil1").Range("B1").Value = 594
    En inscrivant explicitement les valeurs par défaut. Mais en étant feignant tu peux te contenter de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil1").Range("B1") = 594
    C'est la même instruction.
    Pour la seconde, on utilise Cl2, variable, qui doit, vue la syntaxe de l'instruction, contenir un objet WorkBook. (nécessité de l'instruction Set précédente.

    La définition (pas la déclaration) d'une variable peut se "résumer" ainsi :
    - Pour un objet : Classeur, Feuille, plage, contrôle... impose l'instruction Set pour définir l'objet dans la variable et si la variable est bien déclarée, mais non définie, elle contient Nothing.
    - Pour les valeurs, pas de Set, et elle contient la valeur nulle de son type ("" pour string, 0 pour integer, false pour Boolean, etc. (restriction faite pour les tableaux, qui bien que contenant des valeur sont considérés comme des objets, il me semble). Si tu mets
    A1 : 1
    A2 : 2 et que tu exécutes la macro suivante
    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
    Sub test()
    'Déclarations ====================
    Dim V_1 As Integer, V_2 As Integer
    Dim O_1 As Range, O_2 As Range
    'Définitions =====================
    V_1 = Range("A1")
    V_2 = Range("A2")
    Set O_1 = Range("A1")
    Set O_2 = Range("A2")
    'Test ============================
    Range("B1") = V_1 + V_2
    Range("B2").Formula = "=" & V_1 & "+" & V_2
    Range("C1") = O_1 + O_2
    Range("C2").Formula = "=" & O_1 & "+" & O_2
    Range("C3").Formula = "=" & O_1.Address & "+" & O_2.Address
    End Sub
    Tu ne verra pas de différences entre B et C, du aux valeurs par défaut. Par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    V_1.Interior.ColorIndex = 3
    déclenchera une erreur, alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    O_1.Interior.ColorIndex = 3
    coloriera A1.
    A+

  6. #6
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 46
    Par défaut
    Merci à tous les deux !!
    J'ai tout compris, tout marche... Je vais pouvoir avancer bcp plus vite !

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

Discussions similaires

  1. Syntaxe For Open ne fonctionne pas
    Par go_to_debut dans le forum PL/SQL
    Réponses: 2
    Dernier message: 12/08/2013, 19h21
  2. Syntaxe set analysis
    Par Invité dans le forum QlikView
    Réponses: 6
    Dernier message: 08/03/2013, 13h28
  3. [WD17] Erreur de syntax System.Array.Copy
    Par benjahwest dans le forum WinDev
    Réponses: 4
    Dernier message: 09/01/2013, 10h41
  4. Réponses: 1
    Dernier message: 20/09/2007, 18h59
  5. Syntaxe de connection à un activ directory
    Par PrinceMaster77 dans le forum ASP
    Réponses: 2
    Dernier message: 17/02/2006, 12h33

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