VBA Copier une plage de donner et coller/transposer dans un tableau

Bonjour,

je viens vers vous pour un code VBA que je n'arrive pas à réaliser.

J'ai plusieurs plages de donnés (sans que ce soit des tableaux) et je souhaite via un bouton, copier (puis effacer ces données) et les coller en transposer dans un tableau qui comporte un nom spécifique.

image

Autrement dit, je souhaite que la plage E9 à E20 soit copier (seulement les valeurs) et coller dans le tableau en dessous en transposé et en créant une nouvelle ligne. (et que 2023 soit inscrit dans la 1ere colonne du tableau qui s'appelle MWhELECBP).

Pareil pour le 2ème plages de données à droite dans la tableau en dessous.

Je mets en joint le fichier, il faut chercher dans l'userform "Menu", le code est dessus et s'inspire des codes dans les autres userform.

Merci pour votre aide.

Bonjour,

Comme je n'ai pas compris à quels boutons on devait attribuer les macros, je vous les livre telles quelles, vous n'avez plus qu'à les placer au bon endroit.

Sub Report_Conso_Elec() 'dans tableau MWhELECBP
    Dim f1 As Worksheet
    Dim DerLig As Long, i As Long
    Application.ScreenUpdating = False
    Set f1 = Sheets("ELEC BP")
    DerLig = f1.Range("A" & Rows.Count).End(xlUp).Row
    f1.Cells(DerLig + 1, "A") = f1.Cells(8, "A")
    For i = 2 To 13
        f1.Cells(DerLig + 1, i) = f1.Cells(i + 7, "E") / 1000
    Next i
    f1.Cells(DerLig + 1, "N").FormulaR1C1 = "=SUM(MWhELECBP[@[Janvier]:[Décembre]])"
    Set f1 = Nothing
End Sub

 '*******************************************************************************************************

Sub Report_Mwh_Jtr() 'dans tableau RatioELECBP
    Dim f1 As Worksheet
    Dim DerLig As Long, i As Long
    Application.ScreenUpdating = False
    Set f1 = Sheets("ELEC BP")
    DerLig = f1.Range("P" & Rows.Count).End(xlUp).Row
    f1.Cells(DerLig + 1, "P") = f1.Cells(8, "M")
    For i = 2 To 13
        f1.Cells(DerLig + 1, i + 15) = f1.Cells(i + 7, "G") / 1000
    Next i
    f1.Cells(DerLig + 1, "N").FormulaR1C1 = "=SUM(RatioELECBP[@[Janvier]:[Décembre]])"
    Set f1 = Nothing
End Sub

Cdlt

Bonjour

J'ai pas tout compris...

Dans le fichier joint sur la feuille elec BP j'ai copié les cellules E9 à E20 sur le tableau MWhELECBP

Pour le reste j'ai rien compris...lol

A+ François

Bonjour,

merci pour votre aide.

Pour faire simple, un clique sur un bouton d'historisation copie les données de "Conso" (colonne E) vers le tableau nommé "MWhELECBP" (en dessous) en créant une ligne à la fin du tableau et en collant en transposé les infos. Puis après la colonne doit être vidé des données.

image

J'ai réussi à faire un bout de code qui m'aide.

Private Sub CommandButton8_Click()

Windows("A3_Pilotage_MULTI_SITE.xlsm").Activate 'Pour éviter l'erreur multi excel ouvert

Dim nIWS As Integer
Dim wsConso As Worksheet
Dim avInfos As Variant
Dim nRefCol As Integer
Dim nLig As Long
Dim Col As Variant
Application.ScreenUpdating = False

    If MsgBox("Attention : l'historisation efface les données de l'année qui vient de s'écouler et les historises pour recommancer une nouvelle année?", vbYesNo, "Confirmation d'historisation ?") = vbYes Then

   ' Tableau permettant un traitement itératif (une dimension par onglet : nom de l'onglet, refs des colonnes)
   avInfos = Array(Array("ELEC BP", "E", "G", "P")) ', Array("GAZ BP", "F", "I", "J", "T") , Array("EAU BP", "D", "N"), Array("ELEC CY", "E", "P"), Array("GAZ CY", "F", "I", "T"), Array("EAU CY", "D", "N"), Array("ELEC VV", "E", "P"), Array("GAZ VV", "F", "I", "T"), Array("EAU VV", "D", "N"))
   'avInfos(0)(2) '1er = numéro du tableau, 2ème = nom dans l'array(ex 0 = ELEC BP, 1 = E, ...)

   ' Boucle sur les 9 onglets
   For nIWS = 0 To 8

      ' Init de l'onglet
      Set wsConso = Worksheets(avInfos(nIWS)(0)) 'Choisi le numéro de tableau d'après avInfos

      ' Boucle sur les références de colonnes Ubound = plus grande valeur
      For nRefCol = 1 To UBound(avInfos(nIWS))
        Col = avInfos(nIWS)(nRefCol) 'Récupère la lettre de la colonne
        ForWS = avInfos(nIWS)(0) 'recupère le nom du worksheet

            'test vérification
            test = wsConso.Cells(9, avInfos(nIWS)(nRefCol))
            MsgBox test
            MsgBox nIWS
            MsgBox nRefCol
            MsgBox ForWS
            MsgBox Col
            'test

        With wsConso
        Select Case ForWS
            Case "ELEC BP"
                Select Case Col
                    Case "E"
                        .Range(Cells(9, Col), Cells(20, Col)).Copy
                        .ListObjects("MWhELECBP").ListRows.Add
                        .ListObjects("MWhELECBP").DataBodyRange.Rows(.ListObjects("MWhELECBP").DataBodyRange.Rows.Count).PasteSpecial Paste:=xlPasteValues, Transpose:=True

J'ai une erreur sur la dernière ligne. erreur 1004 avec le PasteSpécial.

De plus, j'aurais souhaité que les valeurs collées soient divisées par 1000. Comment faire ?

Merci :)

PS : J'ai mis des select case en double car j'ai plusieurs colonnes dans plusieurs feuilles à traiter avec des noms différents, des noms de tableaux différents)

Rechercher des sujets similaires à "vba copier plage donner coller transposer tableau"