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 :

deux boutons qui appellent la même procédure


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Points : 18
    Points
    18
    Par défaut deux boutons qui appellent la même procédure
    Hello!

    J'ai 2 boutons créé dans excel, voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Copier2_Click()
    Call Recuperer_Click(1)
    End Sub
     
    Private Sub Recuperer_Click(Optional j)
    instructions...
    if j = 1 then
    entree = Application.InputBox(prompt:="indiquer la date format jj.mm.aaaa", Title:="choisir la date", Type:=8)
    jourtravail = entree
    End If
    instructions...
    End Sub
    Quand je lance le code il met une erreur de compilation. Est-ce que c'est à cause du _Click? Est-il possible de mettre 2 boutons, avec 1 qui appelle le 2e sub? J'espère être assez clair... Merci!

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

    Informations professionnelles :
    Activité : Engineering

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

    Pour réaliser cela, il faut mettre la procédure dans un module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub MaProcedure(j As Integer)
    instructions...
    if j = 1 then
    entree = Application.InputBox(prompt:="indiquer la date format jj.mm.aaaa", Title:="choisir la date", Type:=8)
    jourtravail = entree
    End If
    instructions...
    End Sub
    et ensuite dans le code des boutons on appelle cette procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Copier2_Click()
        MaProcedure(1)
    End Sub
     
    Private Sub Recuperer_Click()
        MaProcedure
    End Sub

  3. #3
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonsoir.

    A mon avis, il n'y a pas de pb à appeler une procédure évènementielle à partir d'une autre procédure.

    Mais dans to code, il y a des lignes "instructions..." qu'on ne voit pas.

    ET il y a probablement un pb avec ton argument 'Optional j' qui modifie explicitement la description de l'évènement 'onclick'.

    Je te conseille d'utiliser 2 procédures évènementielles, une pour chaque bouton, et une procédure publique que tu pourras appeler depuis les 2 évènementielles. La procédure publique pourra avoir j en paramètre.

    Attention quand même, à mon avis c'est plutôt 'as integer'.

    Bon courage,

    PGZ

    PS : désolé fring, tu fus plus rapide que moi.

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

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    pas de problème PGZ, au contraire, tu as donné des infos complémentaires (j'ai été fainéant )

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Points : 18
    Points
    18
    Par défaut
    Merci! Ca fonctionne maintenant! Si j'ose encore abuser... j'ai un problème de copier / coller, il faudrait que je colle uniquement les valeurs + formats, sans formules. J'ai essayé ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    'Copie de la plage de cellules sur la destination
    WSsource.Range(WSsource.Cells(starty, 73), WSsource.Cells(endy, 256)).Copy
    'WScible.Cells(destination, 1)
    WScible.Cells(destination, 1).Activate
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    (Qui ne fonctionne pas...)
    Bonne journée!

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    Attention: ne pas confondre la méthode Activate et la méthode Select qui n'ont rien à voir. Sinon il n'y aurait qu'une seule méthode soyons logiques.

    La méthode Activate définit ton Range comme étant la "ActiveCell", tandis que Select définit ton Range comme étant la "Selection".

    Faire très attention à ça: c'est porteur à confusion.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Points : 18
    Points
    18
    Par défaut
    Salut! Merci de la réponse!

    Justement, lorsque je fais un copier / coller j'ai un doute là-dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Set WBsource = Workbooks(nomfichiersource)
    Set WSsource = WBsource.Sheets(semainefeuille)
    Set WBcible = Workbooks(nomfichiercible)
    Set WScible = WBcible.Sheets("base")
    'Copie de la plage de cellules sur la destination
    WSsource.Range(WSsource.Cells(starty, 73), WSsource.Cells(endy, 256)).Select
    'WScible.Cells(destination, 1)
    Selection.Copy
    WScible.Range(WSsource.Cells(destination, 1)).Activate
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Sur la ligne WScible.Range(WSsource.Cells(destination, 1)).Activate
    Il faut mettre à la place du .Activate un .Select? Que faut-il utiliser?

    Merci et bonne journée!

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    C'est ça c'est .Select qu'il faut utiliser en toute rigueur.

    Toutefois, je ne sais pas si utiliser un .Activate fonctionne quand même, car disons je ne suis pas du genre à mettre du gasoil dans un véhicule essence.

    Sinon ton attribut Operation devrait être xlPasteSpecialOperationNone à en juger l'explorateur d'objets. Et ce qui fait planter à coup sûr, c'est ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WScible.Range(WSsource.Cells(destination, 1)).Activate
    Dans un Range, on met toujours 2 Cells, donc il faut faire comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WScible.Cells(destination, 1).Activate
    Je n'ai pas moyen de tester ton code (vu que tu ne donnes pas tout), donc tu testes et tu dis si c'est bien ça.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Points : 18
    Points
    18
    Par défaut
    Salut!

    Ca me fait toujours une erreur le code du Sub est :

    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
    Private Sub copie(starty As Integer, endy As Integer, destination As Integer)
    Dim chemin As String
    Dim nomfichiersource As String
    Dim nomfichiercible As String
    Dim WBsource As Workbook, WBcible As Workbook
    Dim WSsource As Worksheet, WScible As Worksheet
    'Plus d'update d'écran
    Application.ScreenUpdating = False
    'Affectation Variables
    nomfichiersource = "Schichtplan the_new_the_one_and_only.xls"
    nomfichiercible = "planning_jour.xls"
    Set WBsource = Workbooks(nomfichiersource)
    Set WSsource = WBsource.Sheets(semainefeuille)
    Set WBcible = Workbooks(nomfichiercible)
    Set WScible = WBcible.Sheets("base")
    'Copie de la plage de cellules sur la destination
    WSsource.Range(WSsource.Cells(starty, 73), WSsource.Cells(endy, 256)).Select
    'WScible.Cells(destination, 1)
    Selection.Copy
    WScible.Range(WScible.Cells(destination, 1)).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlPasteSpecialOperationNone, SkipBlanks:=False, Transpose:=False
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlPasteSpecialOperationNone, SkipBlanks:=False, Transpose:=False
    End Sub
    J'ouvre et ferme le Workbook depuis un autre Sub, j'ai mis également une variable semainefeuille avec ce code au début :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Option Explicit
    Dim semainefeuille As String
    Et j'utilise Excel 2000, en allemand.

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

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Re,

    Quelques petites rectifications de tir

    1. tu as des anomalie dans la syntaxe, du style WScible.Range(WSsource.Cells

    2. non il ne faut pas utiliser Select en toute rigueur, ni Activate...aucun des deux...!

    3. inutile de faire un PasteSpecial pour copier la valeur et le format, via une simple copie les deux seront copiés

    La bonne procédure en toute rigueur est la 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
    Sub test()
    Dim WBKs As Workbook, WBKc As Workbook
    Dim SHs As Worksheet, SHc As Worksheet
    Application.ScreenUpdating = False '<-- désactivation de l'écran
     
    Set WBKs = ThisWorkbook '<-- classeur source
    Set SHs = WBKs.Sheets(1) '<-- feuille source du classeur source
    Set WBKc = Workbooks.Open("D:\temp\Cible.xls") '<-- ouverture du classeur cible
    Set SHc = WBKc.Sheets(1) '<-- feuille cible du classeur cible
     
    SHs.Range("A1:A20").Copy SHc.Range("A1") '<-- copie la valeur et le format de la feuille source vers la feuille cible
    WBKc.Close True '<-- fermeture et sauvegarde du classeur cible
     
    Application.ScreenUpdating = True '<-- réactivation de l'écran
    End Sub
    [EDIT]
    et en plus tu n'écoutes pas ce qu'on te dit, ça fait 2x que decondelite te dit que WScible.Range(WSsource.Cells(destination, 1)).Activate ne fonctionne pas et au code suivant qu'est ce qu'on retrouve ? Exactement la même syntaxe

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Points : 18
    Points
    18
    Par défaut
    Merci de la réponse.

    Pour le cible au lieu du source, je l'ai modifié, ça ne fonctionne toujours pas. Ce qui se passe c'est quand je fais une copie "simple", ça me copie aussi les formules, comme mis dans mon post. Est-ce qu'il est possible de copier uniquement le format et le contenu, sans formule?

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

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    aah oui ok je n'avais pas pensé aux formules, tu dois donc effectivement passer par un PasteSpecial.
    Il n'est toujours pas nécessaire d'utiliser Select ou Activate.

    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
    Sub test()
    Dim WBKs As Workbook, WBKc As Workbook
    Dim SHs As Worksheet, SHc As Worksheet
    Application.ScreenUpdating = False '<-- désactivation de l'écran
     
    Set WBKs = ThisWorkbook '<-- classeur source
    Set SHs = WBKs.Sheets(1) '<-- feuille source du classeur source
    Set WBKc = Workbooks.Open("D:\temp\Cible.xls") '<-- ouverture du classeur cible
    Set SHc = WBKc.Sheets(1) '<-- feuille cible du classeur cible
     
    SHs.Range("A1:A2").Copy
    With SHc.Range("B10")
        .PasteSpecial Paste:=xlPasteValues '<-- copie la valeur de la feuille cible vers la feuille source
        .PasteSpecial Paste:=xlPasteFormats '<-- copie le format de la feuille cible vers la feuille source
    End With
    Application.CutCopyMode = False '<-- quitte le mode CutCopy
     
    WBKc.Close True '<-- fermeture et sauvegarde du classeur cible
     
    Application.ScreenUpdating = True '<-- réactivation de l'écran
    End Sub
    Tu dois juste adapter ce code aux classeurs, feuilles, cellules sources et cibles
    .

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Points : 18
    Points
    18
    Par défaut
    Hello!

    J'ai une erreur 436 avec le code adapté :

    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
    Private Sub copie(starty As Integer, endy As Integer, destination As Integer)
    Dim chemin As String
    Dim nomfichiersource As String
    Dim nomfichiercible As String
    Dim WBsource As Workbook, WBcible As Workbook
    Dim WSsource As Worksheet, WScible As Worksheet
    'Plus d'update d'écran
    Application.ScreenUpdating = False
    'Affectation Variables
    nomfichiersource = "Schichtplan the_new_the_one_and_only.xls"
    nomfichiercible = "planning_jour.xls"
    Set WBsource = Workbooks(nomfichiersource)
    Set WSsource = WBsource.Sheets(semainefeuille)
    Set WBcible = Workbooks(nomfichiercible)
    Set WScible = WBcible.Sheets("base")
    'Copie de la plage de cellules sur la destination
    WSsource.Range(WSsource.Cells(starty, 73), WSsource.Cells(endy, 256)).Copy
     
    With WScible.Range(WScible.Cells(destination, 1))
    .PasteSpecial Paste:=xlPasteValues
    .PasteSpecial Paste:=xlPasteFormats
    End With
    Application.ScreenUpdating = True
    End Sub
    A la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With WScible.Range(WScible.Cells(destination, 1))
    J'espère que j'ai bien adapté selon ce que tu avais écrit? C'est à cause que j'ouvre le fichier source sur un autre Sub? Est-ce que Set WBsource = Workbooks(nomfichiersource) n'est pas mis correctement? Désolé, mais je suis débutant, peut-être que ce n'est pas à ma portée

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

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    peut-être que la 4ème répétition sera la bonne
    cette syntaxe With WScible.Range(WScible.Cells(destination, 1)) n'est pas correcte...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With WScible.Cells(destination, 1)
    devrait mieux fonctionner

    Maintenant si tu tiens absolument à ton Range
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With WScible.Range(WScible.Cells(destination, 1).Address)
    Cdlt

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Points : 18
    Points
    18
    Par défaut
    Ca fonctionne! Merci beaucoup!!!

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

Discussions similaires

  1. [PHP 5.0] Deux boutons "submit" dans un même formulaire
    Par cyrilherve dans le forum Langage
    Réponses: 2
    Dernier message: 19/03/2009, 15h08
  2. Réponses: 2
    Dernier message: 24/09/2007, 17h06
  3. Réponses: 3
    Dernier message: 04/03/2007, 20h00
  4. [Javascript] bouton qui appele a une page php
    Par belakhdarbts dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 23/06/2006, 23h38
  5. Réponses: 10
    Dernier message: 10/06/2004, 17h20

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