Copier/coller des données en VBA
- Messages
- 16
- Excel
- OFFICE 365 FR
- Inscrit
- 29/12/2021
- Emploi
- Comptable / développeur web
Bonjour à tous,
mon problème est simple mais j'ai beau réfléchir, je ne vois pas par quel bout le prendre pour le résoudre.
je m'explique.
Dans un onglet "données" j'ai un jeu de données brutes qui s'étale de la cellule A2 à la cellule V37. (en sachant que sur la plage A1:V1 j'ai l'entête)
je souhaite pouvoir faire une macro qui me permettrait de sélectionner l'intégralité de ce tableau de façon dynamique (car le nombre de lignes peut varier), de le copier, et de le coller sous la dernière ligne active.
je souhaiterais également que les montants indiqués dans la colonne O (débit2) et P (crédit2) soient inversés lorsque je colle les données.
car étant comptable, le but de mon collage est de pouvoir créer une contrepartie.
je vous met le résultat attendue dans l'onglet "résultat attendue" pour que ça soit plus parlant.
voilà, si quelqu'un passe par là et peut m'aider ou m'expliquer pas à pas comment arriver à ma solution ça serait génial.
Bonjour,
Comme vous ne précisez pas si l'on doit permuter que les valeurs ou bien les formules, voici le fichier avec les 2 propositions, supprimez celle qui ne vous convient pas.
et les 2 codes
Sub Recopie_Tableau1() 'Valeurs de Crédit2 et Débit2 permutées
Dim DerLig As Long
Application.ScreenUpdating = False
With Sheets("Données")
DerLig = .Range("A" & Rows.Count).End(xlUp).Row
.Range("A2:V" & DerLig).Copy .Range("A" & DerLig + 1)
.Range(Cells(DerLig + 1, "P"), Cells((2 * DerLig) - 1, "P")).Value = .Range(Cells(2, "O"), Cells(DerLig, "O")).Value
.Range(Cells(DerLig + 1, "O"), Cells((2 * DerLig) - 1, "O")).Value = .Range(Cells(2, "P"), Cells(DerLig, "P")).Value
End With
End Sub
Sub Recopie_Tableau2() 'Formules de Crédit2 et Débit2 permutées
Dim DerLig As Long
Application.ScreenUpdating = False
With Sheets("Données")
DerLig = .Range("A" & Rows.Count).End(xlUp).Row
.Range("A2:V" & DerLig).Copy .Range("A" & DerLig + 1)
.Range(Cells(DerLig + 1, "P"), Cells((2 * DerLig) - 1, "P")).FormulaR1C1 = "=VALUE(RC[-3])"
.Range(Cells(DerLig + 1, "O"), Cells((2 * DerLig) - 1, "O")).FormulaR1C1 = "=VALUE(RC[-1])"
End With
End Sub
Cdlt
- Messages
- 16
- Excel
- OFFICE 365 FR
- Inscrit
- 29/12/2021
- Emploi
- Comptable / développeur web
Bonjour Arturo,
Merci pour votre proposition rapide, je teste ça en arrivant au bureau et vous tiens au courant.
- Messages
- 16
- Excel
- OFFICE 365 FR
- Inscrit
- 29/12/2021
- Emploi
- Comptable / développeur web
Merci Arturo pour la solution, ça marche nickel :)
- Messages
- 16
- Excel
- OFFICE 365 FR
- Inscrit
- 29/12/2021
- Emploi
- Comptable / développeur web
Bonjour à tous et à Arturo si tu es encore dans le coin.
Dans la droite lignée de mon problème déjà exposé, je tente d'automatiser une tâche en amont de la macro de contrepartie déjà codée par Arturo.
mon but ici, est :
- de créer les colonnes "débit2" et "crédit2" (qui sont utilisées dans la macro de contrepartie.)
- de récupérer les valeurs qui sont stockées dans les colonnes débit et crédit sous forme de texte pour les transformer en nombre.
- et de faire en sorte que les formules qui sont en "débit2" et "crédit2" fonctionnent jusqu'à la dernière ligne active
données en entrée :
résultat attendue :
j'ai tenté cette macro :
Sub Cnum ()
Dim NbLignes
NbLignes = ActiveSheet.UsedRange.Rows.Count
Columns("O:O").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("O1").Select
ActiveCell.FormulaR1C1 = "débit2"
Range("P1").Select
ActiveCell.FormulaR1C1 = "crédit2"
Range("O2").Select
ActiveCell.FormulaR1C1 = "=VALUE(RC[-2])"
Range("O2").Select
Selection.AutoFill Destination:=Range("O2:O" & NbLignes)
Range("P2").Select
ActiveCell.FormulaR1C1 = "=VALUE(RC[-2])"
Range("P2").Select
Selection.AutoFill Destination:=Range("P2:P" & NbLignes)
End Sub
mais j'ai un résultat très bizarre, qui est que les formules s'étendent au delà des lignes activent et s'arrêtent à un numéro de ligne que je ne comprends pas.
mais c'est dynamique, parce que ça varie en fonction du nombre de lignes au départ.
quelqu'un a une idée pour m'aider ?
en PJ le fichier dans lequel vous trouverez le "pas à pas" mené jusqu'au résultat attendue
Bonjour,
Essayez ceci
Sub Insert_Colonne()
Application.ScreenUpdating = False
Columns("O:P").Insert Shift:=xlToRight
Range("O1:P1").Value = Array("Débit2", "Crédit2")
DerLig = Range("A" & Rows.Count).End(xlUp).Row
Range("O2:P" & DerLig).FormulaR1C1 = "=RC[-2]"
End Sub
Cdlt
- Messages
- 16
- Excel
- OFFICE 365 FR
- Inscrit
- 29/12/2021
- Emploi
- Comptable / développeur web
C'est génial, ça fonctionne du premier coup :D
par contre je veux bien une petite explication du bout de code stp Arturo.
que veux dire la 1ère ligne ? : "Application.ScreenUpdating = False"
et pourquoi faire la création d'un tableau en ligne 3 ? : "Range("O1:P1").Value = Array("Débit2", "Crédit2")"
Cela évite que l'affichage suive le code, exemple: on sélectionne la feuille 1, puis on sélectionne des cellules pour y inscrire des valeurs, puis on passe à la feuille 2 ainsi de suite, s'il n'y pas cette ligne, on va voir l'affichage de la feuille 1 puis on va voir les cellules sélectionnées, puis on va voir la feuille 2 etc.. donc on voit tout ce que déroule le programme, et c'est très pénible pour celui qui regarde l'écran.
En mettant cette ligne, ça bloque les rafraîchissements de l'affichage à l'écran, donc on ne voit rien bouger et du fait qu'il n'y a plus tous ces affichages successifs, ça accélère considérablement les temps d'exécution.Donc il est conseillé de mettre cette ligne en début de code pour éviter tous ces problèmes.
et pourquoi faire la création d'un tableau en ligne 3 ? : "Range("O1:P1").Value = Array("Débit2", "Crédit2")"
En une simple et unique ligne de code, on remplit les 2 cellules avec les valeurs voulues.
Cdlt
- Messages
- 16
- Excel
- OFFICE 365 FR
- Inscrit
- 29/12/2021
- Emploi
- Comptable / développeur web
ah ok, je comprends mieux maintenant,
merci beaucoup pour les explications.
donc on pourrait presque mettre par défaut la ligne "Application.ScreenUpdating = False" à chaque fois qu'on fait une procédure ?
et simple curiosité, j'ai profité d'une promotion la nuit dernière pour acheter une formation en ligne pour apprendre le VBA, mais vous, comment avez vous appris ? avez vous des ressources à conseiller ?
Tous les moyens sont bons pour apprendre, en librairie on trouve des livres qui traitent du VBA, il y a les forums d'aide sur internet, l'aide en ligne(avec la touche F1) en sélectionnant sur les mots clés du vba, et surtout il y a l'enregistreur de macro qui permet de voir se qui passe lorsqu'on effectue des manoeuvres.
j'ai profité d'une promotion la nuit dernière pour acheter une formation en ligne pour apprendre le VBA, avec tout ce qu'on trouve comme aides gratuites, il suffit de saisir sur google ce qu'on cherche à obtenir et il est bien rare qu'on ne trouve pas de solutions, les forums comme celui-ci en sont l'exemple.
Moi, j'ai appris tout seul avec excel 5 (le vba était en français), j'ai beaucoup utilisé l'enregistreur de macro, et me suis amusé à comprendre comment il fonctionnait, j'ai trituré le code obtenu et observé les résultats, ça m'a beaucoup aidé a bien comprendre. Au début (et même encore maintenant)on fait tous beaucoup d'erreurs mais à force de persévérer on finir par avoir une meilleure maîtrise de l'outil et on arrive à des résultats très satisfaisant et on finit par donner un coup de main aux autres.
Cdlt