[Résolu] Copier/coller successifs VBA

D277

XLDnaute Nouveau
Bonjour à tous,

Je possède un fichier qui est une ébauche de formulaire. Sur ce fichier, lorsque l'on clique sur le Commandbutton "Créer une nouvelle demande" présent sur la feuille nommée "Formulaire". Un userform apparaît proposant un choix de différents essais. Pour chaque essai, j'ai créé sur la feuille "Listes" (qui sera masquée par la suite), des plages de cellules avec menus déroulants.

Le but étant, que la personne ouvre le fichier, clique sur le Commandbutton, choisisse un essai et que la plage correspondante se copie/colle sur la feuille formulaire, disons avec la colonne B pour colonne de réception de la première cellule.
Puis la personne, clique sur "Valider", ce qui ferme le Userform, et si elle souhaite faire un autre essai (même un second essai de même nature que le premier, exemple : 2 fois acier), elle reprend le userform, et la seconde plage de cellules se copie/colle juste en-dessous de la première et à la rigueur en espaçant d'une ligne, et ainsi de suite..

Le problème est que je n'arrive pas à intégrer cette notion de copier/coller successifs. Alors je voudrais savoir tout d'abord si mon "projet" est possible et réalisable et si c'est le cas, comment faire vis-à-vis du VBA ?

Merci d'avance à tous ceux qui pourront m'aider.

Bonne journée

D277
 

Pièces jointes

  • Beta Formulaire .xlsm
    21.7 KB · Affichages: 63
  • Beta Formulaire .xlsm
    21.7 KB · Affichages: 60
  • Beta Formulaire .xlsm
    21.7 KB · Affichages: 66
Dernière édition:

titiborregan5

XLDnaute Accro
Re : Copier/coller successifs VBA

Bonjour D277, le forum,

en vba le copier coller se fait par la formule

range("a2:l2").copy range("a5") 'copy classique 3 lignes en dessous
range("a65000").end(xlup) 'part de A65000 et remonte jusqu'à la 1ère cellule nom vide de la colonne A. en rajoutant .row après on obtient son numéro, parfois nécessaire.

Si on rajoute .offset(1,0) à range("a65000").end(xlup) on remonte jusqu'à la 1ère cellule non vide et on se décale d'une ligne vers le bas (le 1 du offset) et de 0 colonne à droite (le o!).

Donc en faisant qqch comme:
sheets(2).range("a2:l2").copy sheets(1).range("a65000").end(xlup).offset(1,0) ça devrait marcher...

PS: j'utilise A65000 car je suis sous Excel et que le max est aux alentours de 65000 lignes... Pour les versions supérieures d'Excel, la limite est beaucoup plus haute mais je ne me souviens plus à combien.

PS2: j'utilise plutôt du bas vers le haut (xlup) que du haut vers le bas (xldown) au cas où il y aurait des cellules vides entre...

En espérant que ça t'aide sur la méthode!
Bon courage

Edit: j'ai regardé ton fichier et je ne comprends ce qu'on doit copier coller...
Une fois les données choisies dans la feuille Liste que se passe t il??

Edit : salut Robert!
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Copier/coller successifs VBA

Bonjour D, bonjour le forum,

Je ne comprends pas bien... Tu parles de copier/coller successifs et tu utilises de boutons d'option (OptionButton) qui ne permettent qu'un seul choix au lieu de cases à cocher (CheckBox) qui elles permettent de sélectionner plusieurs choix.

Voilà comment je verrais les choses, le code (j'ai nommé les plages de l'onglet Listes) :

Code:
Private Sub CommandButton4_Click() 'bouton Valider
Dim F As Object 'déclare la variable F (onglet Formulaire)
Dim CTRL As Control 'déclare la variable CTRL (ConTRôLe)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

Set F = Sheets("Formulaire") 'définit l'onglet F
For Each CTRL In Me.Controls 'boucle sur tous les contrôle de l'UserForm
    If TypeOf CTRL Is MSForms.CheckBox Then 'condition 1 "si le contrôle est une checkbox
        If CTRL.Value = True Then 'condition 2 : si le contrôle est coché
            Set DEST = IIf(F.Range("A2") = "", F.Range("A2"), F.Cells(Application.Rows.Count, 1).End(xlUp).Offset(2, 0)) 'définit la cellule de destination DEST
            DEST.Value = CTRL.Caption 'place le nom de l'essai choisi
            Range(CTRL.Caption).Copy DEST.Offset(1, 0) 'copie la plage de l'essai choisi et la colle une ligne en dessous de DEST
        End If 'fin de la condition 2
    End If 'fin de la condition 1
Next CTRL 'prochaine controle de la boucle
Unload Me 'vide et ferme l'UserForm
End Sub

[Édition]
Bonjour Titiborregan on s'est croisé...

Le fichier :
 

Pièces jointes

  • D_v01.xlsm
    25.6 KB · Affichages: 68
Dernière édition:

camarchepas

XLDnaute Barbatruc
Re : Copier/coller successifs VBA

Bonjour D277, titiborregan5, Robert,

Bon , voici ma proposition , cela peut toujours servir, et puisque c'est écrit , je poste
 

Pièces jointes

  • Beta Formulaire .xlsm
    26.3 KB · Affichages: 84
  • Beta Formulaire .xlsm
    26.3 KB · Affichages: 74
  • Beta Formulaire .xlsm
    26.3 KB · Affichages: 60

D277

XLDnaute Nouveau
Re : Copier/coller successifs VBA

Bonjour à vous 2,

Tout d'abord, un grand merci d'avoir répondu aussi vite et en étant aussi efficace.

Titiborregan5, pour t'expliquer le principe, mon idée est de créer un formulaire vierge à la base (feuille formulaire) avec seulement un Commandbutton relié au userform pour que la personne crée SON formulaire et ainsi ne pas mettre un formulaire avec toutes les possibilités d'essais, ce qui l'encombrerait inutilement.
L'histoire des "copier/coller" réside dans la copie des plages de cellules avec les menus déroulants sur la feuille listes vers la feuille formulaire. Merci pour ces lignes de code et tes explications, j'avais déjà travaillé sur un formulaire où j'utilisais la synthaxe "end.xlup" et "offset(1,0)" pour des copies de lignes. Je n'arrivais pas à transposer pour une plage de cellules.

Robert, oui effectivement j'ai longtemps hésité entre les Optionbutton et les Checkbox. Mon choix s'est finalement orienté vers les Optionbutton car je voulais laisser la possibilité à la personne de choisir un essai du même type (2 fois acier). Mais dans les 2 cas, et c'est donc des checkbox que je vais mettre, il fallait fermer le userform pour resélectionner l'essai précédent. Ce qui est pareil avec les checkbox, de plus avec ces dernières, il est possible de sélectionner 2 essais différents en même temps et donc d'avoir un léger gain de temps.
Ton code est génial et tes explications très claires. Je t'en remercie car j'aime comprendre ce que je fais.
Il y a un problème néanmoins, les menus déroulants copiés sont vides et pourtant les cellules sont bien validées en listes avec les bonnes données. Est-ce juste un bug ou j'ai raté quelque chose ?

Encore merci.

D277
 

D277

XLDnaute Nouveau
Re : Copier/coller successifs VBA

Bonjour camarchepas,

Dsl, j'ai posté mon précédent message en même temps que toi tu as posté le tien. Du coup, je ne l'ai pas vu de suite.
Un grand merci également, ton code est aussi efficace que celui de Robert, mais les menus déroulants ne sont pas conservés comme pour la solution de Robert.
Y-a-t-il un argument à ajouter dans la macro pour garder le contenu des listes déroulantes ?

D277
 

camarchepas

XLDnaute Barbatruc
Re : Copier/coller successifs VBA

Voilà,

J'ai essayé par vba de rajouter la feuille dans le choix de liste , mais je n'arrive pas à lire via VBA la configuration de la validation .


Donc une solution peut consister à déplacer tous les modeles dans un autre onglet afini de pouvoir définir la feuille de référence des listes.
 

Pièces jointes

  • Beta Formulaire .xlsm
    30.1 KB · Affichages: 65
  • Beta Formulaire .xlsm
    30.1 KB · Affichages: 59
  • Beta Formulaire .xlsm
    30.1 KB · Affichages: 64

D277

XLDnaute Nouveau
Re : Copier/coller successifs VBA

En effet, tu as raison, en les mettant sur une feuille à part et en nommant les listes pour qu'elles soient conservées dans toutes les feuilles, vos macros fonctionnent !!

Un grand merci à vous 3.
Ca fait vraiment plaisir de recevoir de l'aide aussi rapide et efficace.

Bonne journée

D277
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : [Résolu] Copier/coller successifs VBA

Bonjour le fil, bonjour le forum,

Dans la version 2 les validations de données se font avec la formule Decaler et le copier/coller conserve ces validations. Possibilité de faire dans le même essai plusieurs fois le même matériau à l'aide des boutons toupie.
Le code :

Code:
Private Sub SpinButton1_Change() 'au chagement du SpinButton1
Me.TextBox1.Value = Me.SpinButton1.Value 'la textbox1 récupère la valeur du SpinButton1
End Sub

Private Sub SpinButton2_Change() 'au chagement du SpinButton2
Me.TextBox2.Value = Me.SpinButton2.Value 'la textbox2 récupère la valeur du SpinButton2
End Sub

Private Sub SpinButton3_Change() 'au chagement du SpinButton3
Me.TextBox3.Value = Me.SpinButton3.Value 'la textbox3 récupère la valeur du SpinButton3
End Sub

Private Sub SpinButton4_Change() 'au chagement du SpinButton4
Me.TextBox4.Value = Me.SpinButton4.Value 'la textbox4 récupère la valeur du SpinButton4
End Sub

Private Sub CommandButton4_Click() 'bouton Valider
Dim F As Object 'déclare la variable F (onglet Formulaire)
Dim CTRL As Control 'déclare la variable CTRL (ConTRôLe)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Dim I As Byte 'déclare la variable I (Incrément)

Set F = Sheets("Formulaire") 'définit l'onglet F
For Each CTRL In Me.Controls 'boucle sur tous les contrôle de l'UserForm
    If TypeOf CTRL Is MSForms.CheckBox Then 'condition 1 "si le contrôle est une checkbox
        If CTRL.Value = True Then 'condition 2 : si le contrôle est coché
            For I = 1 To Me.Controls("Spinbutton" & Right(CTRL.Name, 1))
                Set DEST = IIf(F.Range("A2") = "", F.Range("A2"), F.Cells(Application.Rows.Count, 1).End(xlUp).Offset(2, 0)) 'définit la cellule de destination DEST
                DEST.Value = CTRL.Caption 'place le nom de l'essai choisi
                Range(CTRL.Caption).Copy DEST.Offset(1, 0) 'copie la plage de l'essai choisi et la colle une ligne en dessous de DEST
            Next I
        End If 'fin de la condition 2
    End If 'fin de la condition 1
Next CTRL 'prochaine controle de la boucle
Unload Me 'vide et ferme l'UserForm
End Sub
Le fichier :
 

Pièces jointes

  • D_v02.xlsm
    28.7 KB · Affichages: 78

Discussions similaires

Statistiques des forums

Discussions
312 153
Messages
2 085 800
Membres
102 980
dernier inscrit
brossadan