XL 2016 Interdire le clique sur un bouton avant un autre

ReneDav14000

XLDnaute Occasionnel
Bonjour à toutes et à tous,

Dans mon application j'ai deux boutons : un qui est nommé "BoutZéro" qui efface certaines données de la feuille de calcul "BDD"
et un autre qui est nommé "BoutCopie" qui copie les lignes non vides dans une autre feuille "Temps"
J'aimerai savoir si il est possible d'empêcher l'utilisateur de cliquer sur le bouton "BoutZéro" tant qu'il n'a pas cliqué sur "BoutCopie".
Cela pour ne pas que l'utilisateur efface les données avant de les avoir copiées dans l'autre feuille "Temps"
Merci par avance pour votre aide

Voici le code pour le bouton "BoutZéro"
VB:
Private Sub BoutZéro_Click()
If MsgBox("Etes-vous certain de vouloir effacer les pointages horaires ? Cette action est irréversible - N'oubliez pas de copier les données avant l'effacement.", vbYesNo + vbQuestion, "Effacement des données") = vbYes Then

    Sheets("BDD").Select
    
Dim DerLigne As Long
    DerLigne = Sheets("BDD").Range("A1048576").End(xlUp).Row
    
        If DerLigne >= 6 Then
            Sheets("BDD").Range("G6:L" & DerLigne).Select
            
                Selection.ClearContents
End Sub
 
Solution
J'ai fait un essai, que je te livre tel quel...

Libre à toi de t'en inspirer, ou pas, bien sûr. ;)


ps : j'ai modifié "Tableau1" (intégration de la colonne "Date") et "Tableau2" (intégration de la colonne "Commentaires").
Je n'arrivais pas à bien discerner les limites des tableaux alors j'ai inséré une ligne au-dessus et une colonne à gauche, pour mieux voir les tableaux.

ReneDav14000

XLDnaute Occasionnel
Patrick,
Voici ce que cela donnerait avec ta solution.
Est-ce que cela te semble correct ?

Code:
Private Sub BoutZéro_Click()

    With BoutZéro
        Select Case .Caption
        Case "copie"
            'ici tu mets ton code de copie
Dim MaPlage
Application.ScreenUpdating = False

If MsgBox("Vous allez copier les données avant qu'elles soient effacées ? Cette action est irréversible.", vbYesNo + vbQuestion, "Copie et effacement des heures") = vbYes Then

    If Sheets("BDD").FilterMode Then Sheets("BDD").ShowAllData 'BDD feuille qui doit être copiée
       
        Set MaPlage = Sheets("BDD").UsedRange.Offset(1).Resize(Sheets("BDD").UsedRange.Rows.Count - 1, Sheets("BDD").UsedRange.Columns.Count)
       
        With MaPlage '"Temps" la feuille qui reçoit les données à la suite des autres à partir de B2
        On Error Resume Next
        .Offset(1).Resize(plage.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Copy Sheets("Temps").Range("B" & Sheets("Temps").Cells.Find("*", , , , xlByRows, xlPrevious).Row + 1)
            .Caption = "Tout à zero"

        Case "Tout à zéro"
            'ici tu mets ton code de tout à zéro
   
    Sheets("BDD").Select
   
Dim DerLigne As Long
    DerLigne = Sheets("BDD").Range("A1048576").End(xlUp).Row
   
        If DerLigne >= 6 Then
            Sheets("BDD").Range("G6:L" & DerLigne).Select
           
                Selection.ClearContents
    End If

            .Caption = "copie"
        End Select
    End With
End Sub
 

patricktoulon

XLDnaute Barbatruc
re
j'ajouterais que quelque chose me perturbe
tu peux t'expliquer ce double resize et ce double offset
Code:
 Set MaPlage = Sheets("BDD").UsedRange.Offset(1).Resize(Sheets("BDD").UsedRange.Rows.Count - 1, Sheets("BDD").UsedRange.Columns.Count)
            With MaPlage
                On Error Resume Next
                .Offset(1).Resize(plage.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Copy Sheets("Temps").Range("A" & Sheets("Temps").Cells.Find("*", , , , xlByRows, xlPrevious).Row + 1)
ta pas l'impression d'en faire un peu trop là ;)

parce que je récapitule ce que tu fait
Set MaPlage = Sheets("BDD").UsedRange.Offset(1).Resize(Sheets("BDD").UsedRange.Rows.Count - 1, Sheets("BDD").UsedRange.Columns.Count)

traduction
set maplage= toute la range utilisée - sa ligne1


bon OK....... si tu veux

et maintenant dans le with plage
.Offset(1).Resize(plage.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Copy Sheets("Temps").Range("A" & Sheets("Temps").Cells.Find("*", , , , xlByRows, xlPrevious).Row + 1)

traduction
toute les cellules visible plage - sa ligne1 .copy vers sheet temps premiere cellule dispo apres les lignes deja utilisées


ca veux dire que ce qui est copié commence a la ligne 2 de maplage initiale


tu peux m'expliquer pour quoi tu offset et resize 2 fois avant de copier
pourquoi grand diable n'utilise tu pas des tableau structurés tu t'ennuirais beaucoup moins et les macros serait plus perennes
 

ReneDav14000

XLDnaute Occasionnel
re
j'ajouterais que quelque chose me perturbe
tu peux t'expliquer ce double resize et ce double offset
Code:
 Set MaPlage = Sheets("BDD").UsedRange.Offset(1).Resize(Sheets("BDD").UsedRange.Rows.Count - 1, Sheets("BDD").UsedRange.Columns.Count)
            With MaPlage
                On Error Resume Next
                .Offset(1).Resize(plage.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Copy Sheets("Temps").Range("A" & Sheets("Temps").Cells.Find("*", , , , xlByRows, xlPrevious).Row + 1)
ta pas l'impression d'en faire un peu trop là ;)

parce que je récapitule ce que tu fait


traduction
set maplage= toute la range utilisée - sa ligne1


bon OK....... si tu veux

et maintenant dans le with plage


traduction
toute les cellules visible plage - sa ligne1 .copy vers sheet temps premiere cellule dispo apres les lignes deja utilisées


ca veux dire que ce qui est copié commence a la ligne 2 de maplage initiale


tu peux m'expliquer pour quoi tu offset et resize 2 fois avant de copier
pourquoi grand diable n'utilise tu pas des tableau structurés tu t'ennuirais beaucoup moins et les macros serait plus perennes
Je n'ai pas eu le reflex tableau structuré et j'ai tort.
Je vais m'y atteler de ce pas.
Pour l'offset et le resize, je n'ai pas d'explication à part une mauvaise lecture en recopiant ce code que j'avais sous le coude. Je ne comprends pas moi-même.
 

ReneDav14000

XLDnaute Occasionnel
a oui ben la on est joli alors si tu ne sais pas ce que tu fait 😂
restons simple
ma question
tu veux copier maplage sans sa premiere ligne vers sheet temps premiere ligne dispo a la suite de ce qu'il y a deja

c'est ça ????
Je souhaite copier les données de la feuille "BDD", (maintenant Tableau1) à partir de la ligne 6 colonne A qui est la première ligne de saisie et la coller dans la feuille "Temps" à partir de la ligne 2 colonne B (Tableau2). Ensuite, les autres données qui seront copiées iront en-dessous de celles déjà présentes dans la feuille "Temps".
Parfois je me perds en codant, je dois rester attentif car sinon je m'égare dans mes lignes. Mon cerveau peut rencontrer des problèmes et moi avec. 😜
 

patricktoulon

XLDnaute Barbatruc
si c'est tout le tableau 1 qu'il faut vider apres ca se resume à cela
c'est dingue comme ça devient plus simple avec des TS
VB:
Private Sub CommandButton1_Click()
    With CommandButton1
        Select Case .Caption
        Case "copie"
            Set c = Range("Tableau2").ListObject.ListRows.Add.Range.Cells(1)
            Range("tableau1").SpecialCells(xlCellTypeVisible).Copy c
            .Caption = "Tout à zero"
        Case "Tout à zero"
            Range("tableau1").ListObject.DataBodyRange.Delete
            .Caption = "copie"
        End Select
    End With
End Sub

LOL
 

ReneDav14000

XLDnaute Occasionnel
et ben alors c'est simple avec un tableau structuré
et la suppression alors le clear contents c'est tout le tableau 1 ou seulement les lignes qui ont été copié qui doivent etre supprimées
repond a ça et je te donne le code complet du bouton
J'ai tardé à réponde. Pour le tableau1 les colonnes A à F doivent rester. Ne sont effacées que les colonnes G à L puisque les colonnes M à R contiennent des formules de calcul qui seront automatiquement remises à zéro sans information dans les colonnes G à L.
Toutefois, c'est quand même tout le tableau1 qui est copié (sans les en-têtes)
Tu as été plus rapide que moi. Pas le temps de faire une pause.
 

Discussions similaires

Statistiques des forums

Discussions
314 491
Messages
2 110 182
Membres
110 691
dernier inscrit
Marhvax