使用vba对数据透视表分组百分比范围

使用vba对数据透视表分组百分比范围,vba,excel,Vba,Excel,我有一个销售产品的价格列表和上周的价格变化,现在我正在计算百分比变化,我正在编写vba代码来创建一个透视表,包括百分比范围的分组 需要分组方面的帮助 Sub Part_I() 'Group by Dim pf3 As PivotField Pvt2.RowAxisLayout xlTabularRow Set pf3 = Pvt2.PivotFields("% Premium Difference from Prior Term") pf3.LabelRange.Group Sta

我有一个销售产品的价格列表和上周的价格变化,现在我正在计算百分比变化,我正在编写vba代码来创建一个透视表,包括百分比范围的分组

需要分组方面的帮助

    Sub Part_I()


'Group by
Dim pf3 As PivotField

Pvt2.RowAxisLayout xlTabularRow
Set pf3 = Pvt2.PivotFields("% Premium Difference from Prior Term")
pf3.LabelRange.Group Start:=-1, End:=1.2, By:=0.1
pf3.Caption = "% Premium Difference from Prior Term2"



Dim pi3          As PivotItem
Dim sCaption3    As String

Application.ScreenUpdating = False


'Format so that groupings appear as percentage values


For Each pi4 In pf3.PivotItems

    sCaption3 = pi3.Caption & "0.0%"
    sCaption3 = Replace$(sCaption3, "0.", "")
    sCaption3 = Replace$(sCaption3, "-", " - ")
    sCaption3 = Replace$(sCaption, "0%", "0.0%")
    sCaption3 = Replace$(sCaption3, " - ", "0.0% - ")
    sCaption3 = Replace$(sCaption3, "00.0%", "0.0%")
    sCaption3 = Replace$(sCaption3, "<0.0%", "<")
    sCaption3 = Replace$(sCaption3, "< - 10.0%", "-100.0% - 0.0%")
    pi3.Caption = sCaption3

Next pi4

Application.ScreenUpdating = True
子部分_I()
"分组,
将pf3设置为数据透视字段
Pvt2.RowAxisLayout xl表格箭头
设置pf3=Pvt2.PivotFields(“%溢价与上一个期限的差额”)
pf3.LabelRange.Group开始:=-1,结束:=1.2,由:=0.1
pf3.Caption=“%保费与之前的第2条不同”
作为数据透视项的尺寸pi3
作为字符串的Dim sCaption3
Application.ScreenUpdating=False
'格式,以便分组显示为百分比值
对于pf3.PivotItems中的每个pi4
sCaption3=pi3.标题和“0.0%”
sCaption3=替换$(sCaption3,“0.”,“”)
sCaption3=替换$(sCaption3,“-”,“-”)
sCaption3=替换$(sCaption,“0%”,“0.0%”)
sCaption3=替换$(sCaption3,“-”,“0.0%-”)
sCaption3=替换$(sCaption3,“00.0%”,“0.0%”)

sCaption3=Replace$(sCaption3,“好的,我已经建立了一个称为PercentGroupings的参数化子模块,您可以从主例程调用它,如下所示:

    Option Explicit

Sub GroupPercents()
Dim pt As PivotTable
Dim pf As PivotField

Set pt = ActiveSheet.PivotTables("PivotTable1") '<= Change as appropriate
Set pf = pt.PivotFields("Data") '<= Change as appropriate
PercentGroupings pf, -1, 1, 0.1
End Sub

Sub PercentGroupings(pf As PivotField, lFrom As Double, lTo As Double, lGroup As Double, Optional sDelim As String = " to ")

Dim pi          As PivotItem
Dim sCaption    As String
Dim vSplit      As Variant
Dim vItem       As Variant
Dim i           As Long


With Application
    .ScreenUpdating = False
    .EnableEvents = False
    .Calculation = xlCalculationManual
End With


On Error Resume Next
pf.LabelRange.Ungroup
On Error GoTo 0

pf.LabelRange.Group Start:=lFrom, End:=lTo, By:=lGroup
pf.Parent.ManualUpdate = True


'Format so that groupings appear as % values
For Each pi In pf.PivotItems
    With pi
        If InStr(.Caption, "<") > 0 Then
            'Less Than Group
            .Caption = "<" & Split(.Caption, "<")(1) * 100 & "%"
        ElseIf InStr(.Caption, ">") > 0 Then
            'Greater Than Group
            .Caption = ">" & Split(.Caption, ">")(1) * 100 & "%"
        Else
            sCaption = ""
            vSplit = Split(pi.Caption, "--")
            If UBound(vSplit) = 1 Then
                'Negative numbers
                .Caption = vSplit(0) * 100 & "%" & sDelim & "-" & vSplit(1) * 100 & "%"
            Else
                'Positive numbers
                vSplit = Split(pi.Caption, "-")
                If UBound(vSplit) = 1 Then
                    On Error Resume Next
                    vSplit(0) = vSplit(0) * 100
                    vSplit(1) = vSplit(1) * 100
                    On Error GoTo 0
                ElseIf UBound(vSplit) = 3 Then
                    ' There's some kind of bug with Excel's Grouping feature whereby
                    ' the zero grouping sometimes shows as scientific notation  e.g. -2.77555756156289E-17
                    ' So we'll test for this, and change it to zero
                    If IsNumeric(Join(Array(vSplit(2), vSplit(3)), "-")) Then
                        vSplit(0) = vSplit(1) * -100
                        vSplit(1) = 0
                    End If
                End If
                .Caption = vSplit(0) & "%" & sDelim & vSplit(1) & "%"
            End If
        End If
    End With
Next pi

pf.Parent.ManualUpdate = False

With Application
    .ScreenUpdating = True
    .EnableEvents = True
    .Calculation = xlCalculationAutomatic
End With

End Sub
选项显式
子组百分比()
数据透视表
Dim pf作为数据透视字段
设置pt=ActiveSheet.PivotTables(“PivotTable1”)“0然后
“不到一组
.Caption=”“&Split(.Caption,“>”)(1)*100&“%
其他的
sCaption=“”
vSplit=Split(pi.Caption,“--”)
如果UBound(vSplit)=1,则
"负数",
.Caption=vSplit(0)*100&“%”和sDelim&“-”&vSplit(1)*100&“%”
其他的
"正数",
vSplit=拆分(pi.Caption,“-”)
如果UBound(vSplit)=1,则
出错时继续下一步
vSplit(0)=vSplit(0)*100
vSplit(1)=vSplit(1)*100
错误转到0
ElseIf UBound(vSplit)=3然后
Excel的分组功能存在某种缺陷
“零分组有时显示为科学符号,例如-2.77555756156289E-17
'所以我们将对此进行测试,并将其更改为零
如果是数字(Join(数组(vSplit(2),vSplit(3)),“-”),则
vSplit(0)=vSplit(1)*-100
vSplit(1)=0
如果结束
如果结束
.Caption=vSplit(0)和“%”以及sDelim和vSplit(1)和“%”
如果结束
如果结束
以
下一个pi
pf.Parent.ManualUpdate=False
应用
.ScreenUpdate=True
.EnableEvents=True
.Calculation=xlcalculation自动
以
端接头
…这将为您提供以下信息:


您是否逐行查看代码行,以查看其中没有创建您想要的内容?尤其是
sCaption2=
行。是的,我将结果作为一张图片包含在内,它们看起来是正确的,但当我展开选项时,不确定为什么会有更多的选项我试图删除。您能否显示g的图片在应用格式化之前进行分组?例如,你可以只运行代码的第一部分而不是第二部分,然后粘贴一个屏幕截图。是的,给我一秒钟。我在格式化之前和之后发布了结果,我认为我在章节2中做了一些错误。顺便说一下,Jeffrey,你过滤掉零的代码非常有效,我知道怎么做o再次修改我的代码,我有0个低于0.0%的值。sc1324:如果不完整查看代码,我很难排除故障。请您将其添加到原始问题中,或者将其添加为答案,以便我可以查看,然后在我了解问题所在后,您可以删除答案。啊,好的。我想您只需要移动到e line
pf.Parent.ManualUpdate=True
到紧跟其后的line
pf.LabelRange.Group Start:=lFrom,End:=lTo,By:=lGroup
而不是在它之前。谢谢我弄明白了为什么,不知为什么我需要先为%声明LabelRange,然后在添加代码时它工作得很好。再次感谢。我很确定你也会想要m执行我上面提到的更改,否则代码将在第二次在同一个轴上运行时失败。我收到了基于代码结果的反馈,我需要稍微修改范围。我想知道您是否能够提供帮助?因此低于0%的范围应为一组,高于100%的范围应为一组,在0%和100%范围内我需要设置范围例如0%-9.9%和10.0%-10.9%等等……我将开始一个新问题。让我知道,谢谢。