Copier/coller des données en VBA

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.

8test-fre.xlsm (26.47 Ko)

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

Bonjour Arturo,

Merci pour votre proposition rapide, je teste ça en arrivant au bureau et vous tiens au courant.

Merci Arturo pour la solution, ça marche nickel :)

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 :

pbm de base

résultat attendue :

solution souhaitee

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

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")"

que veux dire la 1ère ligne ? : "Application.ScreenUpdating = False"
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

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

Rechercher des sujets similaires à "copier coller donnees vba"