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
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.
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
Je teste toutes les solutions proposées. Ce n'est pas facile de choisir tant elles sont aussi bonnes les unes que les autres.
J'apprécie l'aide que tu m'apportes.
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
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.
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
d'accords donc on copie les ligne visible par filtre de tableau1 a la suite dans tableau 2
et la ligne que tu ne prends pas je suppose que c'est les entêtes de colonne
c'est ça ?
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
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.
Je pars de la ligne 6 pour BDD car avant il y a mes en-têtes et d'autres bricoles.
Et j'arrive ligne 2 de Temps car il y mes en-têtes et dans la colonne A il y aura la date de transfert.
Merci pour ta patience.
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
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
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.