Copier lignes sélectionnées dans classeur fermé
bonjour, je relance le sujet suite à mon ancien poste : https://forum.excel-pratique.com/post182285.html#p182285
Je recherche une macro qui doit effectuer cette démarche :
Mon classeur 1 possède une Feuil1 qui possède un tableau dont le contenue commence à partir de la ligne 3 (colonne B>G inclue)
Mon classeur 2 est identique.
Je souhaite copier une ligne du classeur 1 ouvert vers le classeur 2 fermé (ou ouvert) en l'enregistrant. Les conditions sont : La ligne doit comporter une colonne supplémentaire afin que l'utilisateur puisse la sélectionner/déselectionner puis un bouton "exporter" doit exécuter la macro qui copie uniquement les lignes sélectionnées vers le classeur 2. Autre détail, les lignes doivent être copiées et placées les unes après les autres dans le classeur 2 sans laisser de ligne vide.
Je sais que c'est un challenge important, j'ai pourtant cherché mais rien ne correspond et je n'arrive pas combiner les réponses entre-elles.
Bonjour,
Pour lire/écrire dans un classeur "fermer" il doit être structurer comme une base de donnée, les titres de colonne en ligne 1 et les données commençant à la ligne 2
Le plus simple.. Ouvrir une autre instance d'excel la laisser invisible et y travailler.
A+
bonjour Lermite, pourrais-tu être plus clair car je ne comprend pas tout. J'ai réussi à obtenir des bout de code me permettant d'ouvrir le fichier d'y écrire, de sauvegarder et de fermer le fichier ni vu ni connu. Je souhaite simplement "Archiver des lignes de donnée". Comment puis-je procéder, as tu une solution ?
Je désespère légèrement. A croire qu'il n'y a aucune solution....
Si la ligne du Check box est coché alors on n'exécute le transfert de la ligne....
Code pour connaître si la Check box est cochée :
Sub StatutCheckbox_Formulaire()
If Feuil1.Shapes("Check Box 1").ControlFormat.Value = xlOn Then
MsgBox "Coché."
Else
MsgBox "Décoché." 'xlOff
End If
End SubCode pour transférer le contenu de B à H des lignes sélectionnées :
Sub Archivage()
Dim Wb As Workbook
Dim i As Byte
Dim j As Integer
Application.ScreenUpdating = False
'ouvre le classeur 'essai1'
Set Wb = Workbooks.Open("C:\Users\frhode\Desktop\essai1.xls")
'determine la premiere ligne vide dans la 1ere feuille du classeur 'archive'
j = Wb.Sheets(1).Range("A65536").End(xlUp).Row + 1
'transfet des données saisies dans la plage C1:H1 du classeur contenant cette
'macro , vers le classeur 'Archive'
For i = 3 To 8
Wb.Sheets(1).Cells(j, i) = ThisWorkbook.Sheets(1).Cells(2, i)
Next i
'referme le classeur 2 en sauvegardant les modifications
Wb.Close True
Application.ScreenUpdating = True
End SubComment mixer les 2 ?
Re,
Je suis GO pour t'aider mais je devrais déjà comprendre ce que tu veux faire.
Par contre, plusieurs remarques.
Si tu ouvre le classeur dans la même instance que ton classeur tu ne peu pas le laisser invisible.
Explication Instance ->>> Si tu clic 2 fois sur l'icône d'Excel tu a... deux instances d'excel.
Ton code...
'referme le classeur 2 en sauvegardant les modifications
Wb.Close TrueNe sauve pas le classeur, il dis simplement... le classeur à été sauver.
Il faut...
'referme le classeur 2 en sauvegardant les modifications
Wb.Save
Wb.Close True 'le true qui n'est plus nécessaire.Et
Application.ScreenUpdating = Truen'est pas nécessaire c'est automatique quand tu quite la sub.
A+
Edit: Tu pourrais mettre deux classeurs en exemple avec des explications de ce que tu veux de l'un à l'autre ?
C'est gentil de te dévouer Lermite, j'en n'ai grand besoin !
En fait grâce à mon code de transfert j'ai reussi à copier les lignes cela fonctionne bien, il ne reste plus qu'à utiliser la condition de sélection. Je te glisse un fichier d'exemple de checkbox qui sélectionne la ligne et met en couleur les colonnes à copier. (Je l'ai récupéré, pas crée !). L'autre fichier d'exemple représente mon tableau qui est le même pour Classeur1 (émetteur) et classeur2 (récepteur). Merci encore
Merci Lermite, j'examine ca chez moi une fois rentré du boulot
Re, je n'ai pas eu le temps d'examiner le problème en détail ce weekend. En revanche ce matin j'ai regardé le fichier. Le macro ouvre bien le fichier de destination mais le contenu n'est pas transféré. Pourtant le chemin d'accès est bon. Une erreur de manipulation de ma part ? Bizarrement je n'arrive pas à modifier le bouton "Archiver", est-ce normal ?
Voici le fichier de destination et ton fichier ou j'ai modifier les commentaires.
Ps: Peut tu mexpliquer le code contenu dans "thisworkbook"
Re,
Le code de thisWorkBook était déjà dans ton classeur mais comme je 'reconnais' ce code
Modifier le bouton ? le nom ? sa place ?
De toutes façons tu dois être en mode Création pour y accéder.
Alors ça fonctionne pas parce que tu n'a pas adapter les CheckBox, il faut les lier à la cellule, j'explique
Ruban Développeur -> Clic sur Mode Création
Clic droit sur le CheckBox qui est en A4 -> propriétés
Dans la propriété LinkedCell mettre A4
Même chose pour les autres en mettant A5, A6 et A7
Supprimer le ModeCréation
Pour tester, élargit la colonne A et clic sur un CheckBox, en fonction de sa valeur il y sera inscrit VRAI ou FAUX
Quand tu rétabli la colonne A il y a des points noir assez gênant, pour y remédier mettre la couleur texte de la colonne A sur blanc de cette façon ont voit plus rien.
Tu dis
EDIT :
Rectification, j'ai oublié les points dans la procédure, modifie comme suit...
With ThisWorkbook.Sheets(1)
For i = 4 To 8
If .Cells(i, 1) Then
Range(.Cells(i, 2), .Cells(i, 6)).Copy
Wb.Sheets(1).Cells(j, 3).PasteSpecial Paste:=xlValue
j = j + 1
End If
Next i
End WithBonjour lermite,
Merci d'avoir rectifier le code, effectivement la différence n'est vraiment pas flagrante : un point !
J'ai testé mais cela fait planter mon OS
Je te glisse mon fichier qui exécute plusieurs macros. J'ai fait en sorte que tout soit reprit tel quel, le fichier s'ouvre, s'enregistre puis se ferme mais le contenu n'est pas copié pourtant j'ai veillez à corriger l'erreur précédente. J'ai dû oublier un élément essentiel mais lequel ? La plage à sélectionner = $B3:$G3. j'ai normalement modifier le code en conséquence, il y a juste à cliquer sur le checkbox pour voir la plage grisée.
Si je comprend bien, la procédure Archivage(), copie les cellules qui sont grisées c'est bien cela ?
J'ai quelques questions concernant le code :
A quoi sert la procédure Sub Test()
A quoi correspond la condition ci dessous notamment la première ligne qui indique "SI la plage de ligne i, et colonne 1, ALORS..."
"If .Cells(i, 1) Then
Range(.Cells(i, 2), .Cells(i, 7)).Copy
Wb.Sheets(1).Cells(j, 3).PasteSpecial Paste:=xlValue "
il n'y a pas de condition du type Si valeur = <> ALORS
Dernière question
Cells(Valeur, 2).Resize(1, 7).Interior.ColorIndex = _
IIf(ButtonGroup.Value, 15, xlNone)
Par avance, merci Lermite
J'ai tester le classeur que je t'ai passer et il fonctionne normalement.
Tu est avec Windows ? version ?
Avec Excel ?
A quoi correspond la condition ci dessous notamment la première ligne qui indique "SI la plage de ligne i, et colonne 1, ALORS..."
"If .Cells(i, 1) Then
Range(.Cells(i, 2), .Cells(i, 7)).Copy
C'est un test implicite, équivalent à If .Cells(i, 1) = True Then
Les autres questions ?? tu devrais commencer à apprendre à te servir de l'aide
Exemple pour IIF(
Tu double clic sur le mot, il va se mettre en surbrillance et tu tape F1
Idem pour tout les mots de syntaxe que tu connais pas.
J'ai pourtant bien changé le chemin d'accès....
Pour ma part j'ai windows 7 pro avec Office 2007 au boulot et 2010 Pro à la maison.
Je vais me servir de l'aide pour comprendre certaines lignes. Pour ma question "Si je comprend bien, la procédure Archivage(), copie les cellules qui sont grisées c'est bien cela ? ", qu'en est-il ?
Pourquoi mon fichier ne copie pas les lignes ?
Si je comprend bien, la procédure Archivage(), copie les cellules qui sont grisées c'est bien cela ?
Non, aucun rapport
En fait j'avais mis un poste pour expliquer ce qu'il fallait faire mais appariement je ne l'ai pas valider.
Je reprend donc..
Tu dois lier les checkBox aux cellules qui les contiennent.
Exemple pour le premier qui est en A3
- > Clic sur le ruban Développeur
- > clic sur "Mode création"
- >Clic droit sur le checkBox -> Propriétés
idem pour le suivant en mettant A4
idem. pour les suivant
Quand il sont tous fait, relâcher le Mode Création
Si tu clic sur un CheckBox tu va avoir VRAI qui va s'afficher sous lui.
Tu Reclic et c'est FAUX qui va s'afficher.
C'est là dessus que je fais le test
Si ça gène de voir les VRAI et FAUX tu met ces cellules avec la couleur texte idem que la couleur fond. (Blanc)
Merci pour cette explication ! Cela fonctionne à merveille à présent
Comme tu as pu le constater, il y a la présence d'une colonne pour la suppression des ligne à l'aide du double clic sur la croix rouge. le problème que je rencontre est que lorsque je supprime une ligne en plein milieu du tableau, elle génère un trou, et en suite la croix rouge se transforme automatiquement en date. il est possible de retirer cette mise en forme automatique à l'aide d'un bout de code ? Car j'ai ce problème uniquement sur 2007 mais pas sur 2010....
-Tu ne peu pas supprimer une ligne sinon tout les checkBox suivant ne seront plus avec les bonnes adresses.
Si tu veux absolument supprimer une ligne il faut revoir tout le code (de A à Z)
Sans faire de grosse modif tu peu "Vider" la ligne en la laissant disponible pour une autre entrée.
Et il est possible de tester si une donnée est présente dans la ligne sélectionnée si elle est cochée par erreur..
Il y a toujours 42 lignes disponibles ou tu compte en ajouter ?
Mais tout bien réfléchi, je pense qu'il faut refaire le code pour pouvoir ajouter/supprimer des lignes.
EDIT:
Je viens de voir ton UserForm et commence à comprendre l'optique de ton appli.
Tu fais comme tout les débutants
Alors oublie le design pour l'instant.
Crée une feuille avec les articles disponible qui servira de base de données.
Crée une feuille accueil qui oriente l'utilisateur vers le choix qu'il souhaite.
Enlève tout les checkBox et ligne de la feuille existante.
Et t'occupe pas du design, tu verras ça plus tard.
Pas de code non plus.
Quand tu à un classeur qui correspond, poste le, je verrais pour le faire fonctionner, et oublie rien parce que je recommencerais plus.
EDIT 2
Tâche de penser à tout, un mode de passe ? autre chose ? le nom ? etc
A+
Quand je dis "supprimer une ligne" je me suis mal exprimé car je que je souhaite c'est juste nettoyer la ligne en vidant le contenu et non l'ensemble de la ligne.
Refaire le code serai trop conséquent car même si il demeure pas ultra développé, il me sert de base sur lequel je peux m'appuyer et l'étudier par la suite. En parallèle je m'exerce sur des programme très simples et à côté de ca je bosse sur le réel projet actuel. En réalité le projet provient d'une optimisations des achats afin de regrouper les demandes. Mais pour la suite, nous avons un ERP qui se charge de tout. Donc pour l'instant, le projet tien la route puisqu'il répond à nos attentes. Maintenant que je me suis lancé dans le vba j'ai l'intention de continuer jusqu'à atteindre un bon niveau. (J'ai le temps encore
Donc il ne manque plus que l'histoire des boutons "supprimer" et normalement c'est bon. On pourra en suite essayer de créer quelque chose de plus élaboré. Merci de ton soutien lermite
OK
If Not Intersect(Target, Range("H" & ldeb & ":H" & lfin)) Is Nothing And Target.Count = 1 Then
If MsgBox("Voulez vous supprimer la ligne " & Target.Row & " ?", vbOKCancel + vbQuestion) = vbOK Then
Range(Cells(Target.Row, 2), Cells(Target.Row, 6)).ClearContents
End If
End IfA+