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.
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 SubCdlt
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.
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:=TrueJ'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)