Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

copie feuille active

7 réponses
Avatar
Nicoh
Bonsoir à tous,

J'utilise le code suivant 4 fois de suite avec des plages différentes bien
entendu.
La feuille se copie quand on répond oui à la dernière question=MsgBox
"facturation sur 12 mois ?"
Or, si je répond oui 4 fois, la feuille se copie 4 fois. Mon souhait est que
la feuille active ne se copie qu'une seule fois quelque soit l'ordre dans
lequel on répond à la question.

If Not Intersect(Target, Range("ba16:cc16")) Is Nothing Then
question = MsgBox("Est-ce un NEW ?", vbYesNo,
Application.UserName)
If question = vbYes Then
question = MsgBox("La facturation se fait-elle sur 12 mois
?", 4, Application.UserName)
If question = 7 Then
Cells(Target.Row - 1, Target.Column) = "NEW": Exit Sub
Else
ActiveSheet.Copy after:=Sheets(Sheets.Count)
End If
End If
End If

Autrement dit, la commande "Active.copy after " ne doit s'exécuter que la
première fois où l'on répond oui à la question.

D'avance merci,
@+,

Nicoh

7 réponses

Avatar
Youky
Salut Nico
ActiveSheet.Copy after:=Sheets(Sheets.Count)
Exit sub 'ici on le fait sortir de la procédure aprés avoir copié
End If

youky
Avatar
Nicoh
Bonjour Youky,

Merci de ta réponse, mais cela ne répond pas vraiment à ma problématique.
En fait, dans la plage "BA6:CC6", on suppose que je mettes 59 en BA6. Je
dois alors répondre à la question de la facturation : si oui la feuille
active se copie.
Si je mets 60 en BC6, j'ai aussi la question et je répond oui, la feuille
se copie une deuxième fois.
Or, ce que je veux obtenir, c'est une copie de la feuille active une seule
fois dès la première fois où la question est posée.

D'avance merci,

Nicoh


Salut Nico
ActiveSheet.Copy after:=Sheets(Sheets.Count)
Exit sub 'ici on le fait sortir de la procédure aprés avoir copié
End If

youky





Avatar
Youky
Private Sub CommandButton1_Click()
'le dim en tete de macro
Dim impr(4) As Boolean
'ton for ou while ou autres boucle qui se fait 4 fois

boucle = boucle + 1 ' on incrémente à chaque passage

'avant la copie on vérifie si toujours false
If impr(boucle) = False Then
ActiveSheet.Copy after:=Sheets(Sheets.Count)
impr(boucle) = True
End If
'
'
'
End Sub

ou encore si tu ne fait pas de boucle mais tout à la suite

Dim impr(4) As Boolean 'ici en plus
If Not Intersect(Target, Range("ba16:cc16")) Is Nothing Then
question = MsgBox("Est-ce un NEW ?", vbYesNo,
Application.UserName)
If question = vbYes Then
question = MsgBox("La facturation se fait-elle sur 12 mois
?", 4, Application.UserName)
If question = 7 Then
Cells(Target.Row - 1, Target.Column) = "NEW": Exit Sub
Else
boucle=boucle+1 'ici en plus
If impr(boucle) = False Then 'ici en plus
ActiveSheet.Copy after:=Sheets(Sheets.Count)
impr(boucle) = True 'ici en plus
End If 'ici en plus
End If
End If
End If
'et la suite, remettre pareil sauf le dim de départ
Youky
Avatar
Nicoh
Youky,

Je suis désolé mais je pense avoir mal expliqué ma problématique et viens de
comprendre que j'ai demandé, il me semble, le contraire du résultat que je
veux obtenir.

Tout d'abord, j'espère que tu es patient car mon niveau en VBA est proche de
zéro. J'espère que tu voudras bien continuer à m'aider.

En fait je veux avoir une copie de la feuille 1 quand en BA16 on répond oui
à la question de la facturation. Ainsi j'ai 2 feuilles avec feuille 1 =
feuille2.
Puis, je reviens sur la feuille 1 (je pense que mon erreur dans
l'explication est là), en BC16 je répond oui à la question et là, il ne doit
pas y avoir de copie. Pour le moment, je dirais qu'il ne doit rien se passer,
cela se compliquera ensuite !

J'espère que c'est maintenant plus clair et suis vraiment désolé de t'avoir
mal orienté.

D'avance merci pour ton éventuelle réponse.

Nicoh


Private Sub CommandButton1_Click()
'le dim en tete de macro
Dim impr(4) As Boolean
'ton for ou while ou autres boucle qui se fait 4 fois

boucle = boucle + 1 ' on incrémente à chaque passage

'avant la copie on vérifie si toujours false
If impr(boucle) = False Then
ActiveSheet.Copy after:=Sheets(Sheets.Count)
impr(boucle) = True
End If
'
'
'
End Sub

ou encore si tu ne fait pas de boucle mais tout à la suite

Dim impr(4) As Boolean 'ici en plus
If Not Intersect(Target, Range("ba16:cc16")) Is Nothing Then
question = MsgBox("Est-ce un NEW ?", vbYesNo,
Application.UserName)
If question = vbYes Then
question = MsgBox("La facturation se fait-elle sur 12 mois
?", 4, Application.UserName)
If question = 7 Then
Cells(Target.Row - 1, Target.Column) = "NEW": Exit Sub
Else
boucle=boucle+1 'ici en plus
If impr(boucle) = False Then 'ici en plus
ActiveSheet.Copy after:=Sheets(Sheets.Count)
impr(boucle) = True 'ici en plus
End If 'ici en plus
End If
End If
End If
'et la suite, remettre pareil sauf le dim de départ
Youky





Avatar
Youky
Trés difficile en effet de bien piger ta demande
Je t'ai fais une macro comme je l'ai compris
je rajoute le target.value pour le nom de l'onglet rajouté et me permet
ensuite de voir ci celui-ci existe déja
Vendredi je serai libre que dans la soirée
Youky

Private Sub Worksheet_Change(ByVal Target As Range)
If ActiveSheet.CodeName <> "Feuil1" Then Exit Sub 'si le nom n'est pas
Feuil1 on quitte
If Target.Value = "" Then Exit Sub
If Not Intersect(Target, Range("ba16:cc16")) Is Nothing Then
question = MsgBox("Est-ce un NEW ?", vbYesNo, Application.UserName)
If question = vbYes Then
question = MsgBox("La facturation se fait-elle sur 12 mois? ",
4, Application.UserName)
If question = vbNo Then
Feuil1.Cells(Target.Row - 1, Target.Column) = "NEW": Exit Sub
Else
zz = ""
For k = 1 To Sheets.Count
If Sheets(k).Name = Target.Value Then zz = 1: Exit For
Next
If zz = "" Then
ActiveSheet.Copy after:=Sheets(Sheets.Count)
ActiveSheet.Name = Target.Value
Feuil1.Select
End If
End If
End If
End If

End Sub


"Nicoh" a écrit dans le message de news:

Youky,

Je suis désolé mais je pense avoir mal expliqué ma problématique et viens
de
comprendre que j'ai demandé, il me semble, le contraire du résultat que je
veux obtenir.

Tout d'abord, j'espère que tu es patient car mon niveau en VBA est proche
de
zéro. J'espère que tu voudras bien continuer à m'aider.

En fait je veux avoir une copie de la feuille 1 quand en BA16 on répond
oui
à la question de la facturation. Ainsi j'ai 2 feuilles avec feuille 1 > feuille2.
Puis, je reviens sur la feuille 1 (je pense que mon erreur dans
l'explication est là), en BC16 je répond oui à la question et là, il ne
doit
pas y avoir de copie. Pour le moment, je dirais qu'il ne doit rien se
passer,
cela se compliquera ensuite !

J'espère que c'est maintenant plus clair et suis vraiment désolé de
t'avoir
mal orienté.

D'avance merci pour ton éventuelle réponse.

Nicoh


Private Sub CommandButton1_Click()
'le dim en tete de macro
Dim impr(4) As Boolean
'ton for ou while ou autres boucle qui se fait 4 fois

boucle = boucle + 1 ' on incrémente à chaque passage

'avant la copie on vérifie si toujours false
If impr(boucle) = False Then
ActiveSheet.Copy after:=Sheets(Sheets.Count)
impr(boucle) = True
End If
'
'
'
End Sub

ou encore si tu ne fait pas de boucle mais tout à la suite

Dim impr(4) As Boolean 'ici en plus
If Not Intersect(Target, Range("ba16:cc16")) Is Nothing Then
question = MsgBox("Est-ce un NEW ?", vbYesNo,
Application.UserName)
If question = vbYes Then
question = MsgBox("La facturation se fait-elle sur 12
mois
?", 4, Application.UserName)
If question = 7 Then
Cells(Target.Row - 1, Target.Column) = "NEW": Exit Sub
Else
boucle=boucle+1 'ici en plus
If impr(boucle) = False Then 'ici en plus
ActiveSheet.Copy after:=Sheets(Sheets.Count)
impr(boucle) = True 'ici en plus
End If 'ici en plus
End If
End If
End If
'et la suite, remettre pareil sauf le dim de départ
Youky







Avatar
Nicoh
Bonsoir Youky,

Je pense que tu dois être largement capable de réaliser une macro qui répond
à ma demande, mais le plus dur est de me faire comprendre. Je vais essayer
d'illustrer ma demande par un exemple simple que j'adapterais ensuite à ma
macro initiale.

En feuille1, travaillons sur la ligne 1.
En A1 je rentre un chiffre compris entre 1 et 10, disons 1. Alors, la
feuille 1 se copie et la copie obtenue s'appelle feuille 2.
En B1 de la feuille 1, je rentre 11, il ne se passe donc rien.
En C1 de la feuille 1, je rentre 3, alors la feuille 1 ne se copie pas, mais
la cellule C1 se copie uniquement en C1 de la feuille 2.

Considérons maintenant la ligne 3 avec A3=2, alors la feuille 1 ne se copie
pas mais la cellule A3 se copie en feuille 2 en A3=2

Au final j'ai donc deux feuilles : feuille 1 où A1=1, B1, C1=3 et A3=2 ;
feuille 2 A1=1, C1=3 et A3=2.

La feuille 1 ne se copie qu'une seule et unique fois : la première fois où
dans les deux plages considérées (ligne 1 et ligne 3) la condition (chiffre
compris entre 1 et 10) est remplie.
Autrement dit, si on reprend l'exemple mais dans le sens inverse, la feuille
se copiera quand on commence à remplir A3 (=2) et ne se copie plus ensuite.

En espérant que cet exemple soit plus compréhensible, sinon, je ne sais pas
comment je vais faire.

en tout cas merci pour ton aide et ton implication à mon cas,

Nicoh
Avatar
Youky
Voici une macro qui répond à ta demande je crois......
Par contre elle utilise que les lignes 1 et 3 et la copie se fait seulement
lors d'un changement col A et que 1 ligne sur les 2 soit vide
voici mon mail perso pour me contacter si besoin
ou
Pour tes tests click directement avec le bouton droit de souris sur l'onglet
Feuil1 d'un classeur vierge et colle ceci

Private Sub Worksheet_Change(ByVal Target As Range)
If ActiveSheet.CodeName <> "Feuil1" Then Exit Sub
If Not IsNumeric(Target.Value) Then Exit Sub
If Target.Value > 10 Then Exit Sub
If Target.Column <> 1 Then GoTo fin
If Target.Row = 1 Then lig = 3
If Target.Row = 3 Then lig = 1
If lig = "" Then GoTo fin
If Cells(lig, 1) = "" Then
ActiveSheet.Copy after:=Sheets(Sheets.Count)
Feuil1.Select
End If
fin:
If lig > 0 Then Exit Sub
If Target.Value > 10 Then Exit Sub
Application.EnableEvents = False
Sheets(Sheets.Count).Range(Target.Address) = Target.Value
Application.EnableEvents = True
End Sub


"Nicoh" a écrit dans le message de news:

Bonsoir Youky,

Je pense que tu dois être largement capable de réaliser une macro qui
répond
à ma demande, mais le plus dur est de me faire comprendre. Je vais essayer
d'illustrer ma demande par un exemple simple que j'adapterais ensuite à ma
macro initiale.

En feuille1, travaillons sur la ligne 1.
En A1 je rentre un chiffre compris entre 1 et 10, disons 1. Alors, la
feuille 1 se copie et la copie obtenue s'appelle feuille 2.
En B1 de la feuille 1, je rentre 11, il ne se passe donc rien.
En C1 de la feuille 1, je rentre 3, alors la feuille 1 ne se copie pas,
mais
la cellule C1 se copie uniquement en C1 de la feuille 2.

Considérons maintenant la ligne 3 avec A3=2, alors la feuille 1 ne se
copie
pas mais la cellule A3 se copie en feuille 2 en A3=2

Au final j'ai donc deux feuilles : feuille 1 où A1=1, B1, C1=3 et A3=2
;
feuille 2 A1=1, C1=3 et A3=2.

La feuille 1 ne se copie qu'une seule et unique fois : la première fois où
dans les deux plages considérées (ligne 1 et ligne 3) la condition
(chiffre
compris entre 1 et 10) est remplie.
Autrement dit, si on reprend l'exemple mais dans le sens inverse, la
feuille
se copiera quand on commence à remplir A3 (=2) et ne se copie plus
ensuite.

En espérant que cet exemple soit plus compréhensible, sinon, je ne sais
pas
comment je vais faire.

en tout cas merci pour ton aide et ton implication à mon cas,

Nicoh