1
votes

Copier le total général du tableau croisé dynamique dans la cellule vide suivante

J'ai donc un tableau croisé dynamique situé dans la colonne N, O avec une ligne de total général et je souhaite copier ce total dans la cellule vide suivante d'une liste de la colonne "R". J'ai trouvé un code qui peut copier le total général dans une cellule, mais je ne peux pas le faire fonctionner pour le copier dans la cellule vide suivante.

Dim rngPvt As Range, sht As Worksheet, valToFind$, gtv
Set sht = Sheets("Sheet1")
Set rngPvt = sht.PivotTables("1").RowRange
valToFind = sht.PivotTables("1").GrandTotalName
Set gtv = rngPvt.Find(valToFind, , xlFormulas)
'assumes value to the right of field name
Sheets("Sheet1").Cells(LastRow, 18).PasteSpecial xlPasteValues = gtv.Offset(, 1)


0 commentaires

3 Réponses :


0
votes

Essayez ceci.

Set targetCell = Range("R" & sh.Rows.Count).End(xlUp).Offset(1, 0)

L'attendez-vous après la dernière cellule remplie de la colonne R? Si tel est le cas, remplacez la ligne suivante

Set targetCell = FinalPvtGT.Offset(, 3)

par

Sub test()

Dim wb As Workbook
Set wb = ThisWorkbook
Dim sh As Worksheet
Set sh = wb.Sheets("Sheet1")
Dim pt As PivotTable
Set pt = sh.PivotTables("PivotTable1")
Dim FinalPvtGT As Range
Set FinalPvtGT = pt.TableRange1(pt.TableRange1.Rows.Count, _
                            pt.TableRange1.Columns.Count)
Dim targetCell As Range
Set targetCell = FinalPvtGT.Offset(, 3)

targetCell = FinalPvtGT

End Sub


4 commentaires

Merci pour la réponse, mais après l'avoir essayée, j'ai vu que je n'avais pas suffisamment expliqué le problème. Cela fonctionne, mais ce que je veux dire, c'est que le tableau croisé dynamique est situé dans les colonnes N et O et que le total général doit être copié sur la ligne vide suivante de la colonne R.


Il colle la valeur dans la colonne de droite maintenant, mais lorsque le total général est inférieur, il la colle à la même hauteur et non sur la cellule vide suivante (par exemple, le total général est sur la ligne 15, il la colle là mais la cellule vide suivante est au rang 13).


Je vous suggère de mettre à jour votre question avec une capture d'écran du pivot et de la cellule cible .. mentionnez-y comment vous attendez les résultats .... L'attendez-vous après la dernière cellule remplie de la colonne R?


J'ai un formulaire utilisateur auquel j'accède sur la feuille 2 et il a collé la valeur sur la feuille 2 (correctement mais) mais il doit être ajouté sur la feuille 1. J'ai essayé d'ajouter des feuilles de calcul ("Sheet1") en face de la plage de targetCell mais puis j'obtiens l'erreur d'exécution «1004»: nous ne pouvons pas modifier cette partie du tableau croisé dynamique.



0
votes

Voici un code que vous pouvez peut-être comprendre pour l'implémenter dans votre code:

Sheets("Sheet1").Cells(LastRow, 18).value = pt1.GetPivotData("SUM").Value

 entrez la description de l'image ici

le total général doit être copié sur la ligne vide suivante de colonne R

Oups ... désolé,
votre problème est donc le placement du GrandTotal copié :).

J'ai trouvé un code qui peut copier le total général dans une cellule, mais je impossible de le faire fonctionner pour le copier dans la cellule vide suivante

Sheets("Sheet1").Cells(LastRow, 18).Select

Si vous exécutez pas à pas le code ci-dessus, le résultat de la cellule active est-il correct? Ce qui, comme vous vous attendiez à ce que le résultat de la cellule active soit la prochaine cellule vide.

Si ce n'est pas correct, vous devrez peut-être ajouter .offset (1,0) code> avant le .select . Mais je ne sais toujours pas quelle est la valeur de votre variable «LastRow». Si la valeur est le dernier numéro de ligne de la feuille (où le mien est 1048576), vous devrez peut-être mettre .end(xlup).offset(1,0)

Si c'est correct, je me demande quel est le problème?

Cela peut aussi être fait avec le code ci-dessus:

Sub test()

Set sht = Sheets("Sheet1")
Set pt1 = sht.PivotTables(1)
Set pt2 = sht.PivotTables(2)
Range("E26").Value = pt1.GetPivotData("SUM").Value
Range("B26").Value = pt2.GetPivotData("SUM").Value

End Sub

Le mot "SUM" dépend sur quel est votre nom d'en-tête de colonne GrandTotal de tableau croisé dynamique. Le mien est SUM comme on le voit dans l'image ci-dessus.

Ce code ne dépend pas de la ligne où le tableau croisé dynamique GrandTotal est affiché. Vous n'avez donc pas besoin de coder pour trouver le mot du tableau croisé dynamique GrandTotal, puis offset (0,1) pour obtenir la valeur. Si, par exemple, au début, l'affichage GrandTotal à la ligne 200, et après le changement de source de données et actualise l'affichage GrandTotal à la ligne 1000, il vous donnera toujours le GrandTotal correct.


2 commentaires

J'ai essayé cela aussi mais j'ai une erreur d'exécution '1004': erreur définie par l'application ou définie par l'objet.


Comment le testez-vous? Si c'est juste en copiant le code ci-dessus, mettez-le dans votre éditeur vba, puis exécutez-le, bien sûr, cela vous donnera une erreur. Parce que le code ci-dessus est un exemple où dans la feuille de calcul il y a deux tableaux croisés dynamiques. Et il n'est pas clair si vous changez le mot «SOMME» dans le code en quelque soit le nom d'en-tête de colonne GrandTotal de votre tableau croisé dynamique ou non. Et vous ne dites pas non plus quelle est la valeur de votre variable LastRow.



0
votes

Faire pivoter le total général vers la cellule spécifiée
Option Explicit

Sub PivotGrandTotal()

    Const SheetName As String = "Sheet1"
    Const writeColumn As Long = 18

    Dim rng As Range          ' PivotTable's RowRange, Last Non-Empty Cell
    Dim findString As String  ' PivotTable's GrandTotalName
    ' If certain that whole number, then use "As Long" in the following line.
    Dim gTotal As Double      ' Grand Total Value
    Dim FER As Long           ' Write Row (First Empty Row)

    With ThisWorkbook.Worksheets(SheetName)
        ' Retrieve Grand Total.
        With .PivotTables(1)
            findString = .GrandTotalName
            Set rng = .RowRange
        End With
        gTotal = rng.Find(findString, , xlFormulas).Offset(, 1).Value
        ' Define writeRow.
        Set rng = .Columns(writeColumn).Find("*", , xlFormulas, , , xlPrevious)
        If Not rng Is Nothing Then FER = rng.Row + 1 Else FER = 1
        ' Write to writeCell.
        .Cells(FER, writeColumn).Value = gTotal
    End With

End Sub


0 commentaires