ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 461|回复: 5

读取透视表字段,生成新数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-5-30 15:58 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 erorpqitp 于 2023-5-30 16:39 编辑

本来是有这个需求,就是数据透视表透视字段名每月一样,但是数据源字段排列的顺序每个月不稳定。我就想搞个窗体,读取原透视表的排列,然后引入新数据,自动生产透视表。写了一会,被excle版本,和wps不兼容,搞得烦死了。不知道这个需求有没有价值,发了半成品上来。还有就是我激活窗体,换其他表格读取数据源的时候,窗体只显示在原先的表上,没有显示在新的表上。看看有没有大佬帮忙解决一下。

2-透视表多表.rar

53.96 KB, 下载次数: 4

TA的精华主题

TA的得分主题

发表于 2023-5-30 16:42 | 显示全部楼层
首先你的这个需求是有价值的,但是这个价值被市面上的BI工具实现了;
其次,你的问题有点多,且没有头绪,同时也没有逻辑,说明你并不清楚自己要什么,需要再梳理一下!
VBA操作透视表是有现成的案例可循的;
VBA自动化报表也是有现成的案例的,包括自动导入数据源功能(数据源一致);
数据源不稳定是不可以的,必须一致,要定模板,定标准,别给自己找麻烦;
Excel版本问题,要稳定,OFFICE就是OFFIC,WPS就是WPS,MAC就是MAC,不要妄想兼容;
做自动化报表起码要对数据结构要有一定的了解,了解以后就不会再纠结顺序了!
激活窗体后,换表格读取数据,窗体只显示在原先的表上,这是没有问题的,因为窗体就在原来的表格上,所以没有毛病;为什么没有显示在新的表上,因为它是原来的表格上的窗体! 怎么能让它切换到新表呢?按加载宏的标准要求重新开发!
送你一个案例,之前帮论坛里的某兄弟开发的,VBA生成透视表!
回复:工作簿1-20230506.zip (24.85 KB, 下载次数: 4)
如果你能看明白,就会发现,压根就不需要什么透视表,一句SQL的事;
image.jpg
祝您生活愉快,再见!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-5-30 16:47 | 显示全部楼层
你的问题用VBA解决是不难的,就是你说的顺序每个月不稳是怎么个不稳法?从附件中看不出来

TA的精华主题

TA的得分主题

发表于 2023-5-31 07:32 | 显示全部楼层
这个问题,就没有必要追求透视表,直接用vba代码实现数据透视表的效果不就行了吗?
即使你每个月的数据源的字段排列顺序不一样,也是可以解决的嘛,用字典来判断不就行了吗

TA的精华主题

TA的得分主题

发表于 2023-5-31 08:56 | 显示全部楼层
Private Sub CommandButton1_Click()
With ListBox1
    For i = 0 To .ListCount - 1
        .Selected(i) = True
    Next i
End With
End Sub

Private Sub CommandButton2_Click()
With ListBox1
    For i = 0 To .ListCount - 1
        .Selected(i) = False
    Next i
End With
End Sub

Private Sub CommandButton3_Click()
With ListBox1
    For i = 0 To .ListCount - 1
        If .Selected(i) = True Then
            .Selected(i) = False
        Else
            .Selected(i) = True
        End If
    Next i
End With
End Sub

Private Sub CommandButton4_Click()
Dim ar As Variant, br As Variant
Dim rn As Range
Dim i As Long, r As Long, yy As Long
Dim d As Object, dc As Object
Dim rr()
ReDim rr(1 To ListBox1.ListCount)
Set d = CreateObject("scripting.dictionary")
Set dc = CreateObject("scripting.dictionary")
Set dic = CreateObject("scripting.dictionary")
With ActiveSheet
    r = .Cells(Rows.Count, 1).End(xlUp).Row
    yy = .Cells(3, Columns.Count).End(xlToLeft).Column
    zd = Trim(.[b1])
    If r > 3 Then .Range(.Cells(4, 1), .Cells(r, yy)).Clear
    br = .Range(.Cells(3, 1), .Cells(50000, yy))
    For j = 2 To UBound(br, 2)
        If Trim(br(1, j)) <> "" Then
            d(Trim(br(1, j))) = j
        End If
    Next j
    With ListBox1
        For i = 0 To .ListCount - 1
            If .Selected(i) = True Then
                n = n + 1
                dic(.List(i, 0)) = ""
            End If
        Next i
    End With
    If n = "" Then MsgBox "请选择要汇总的单号!": Exit Sub
    k = 1
    For Each sh In Sheets
        If sh.Name <> "求和" Then
            ar = sh.[a1].CurrentRegion
            Set rn = sh.Rows(1).Find("生产任务单号", , , , , , 1)
            If rn Is Nothing Then MsgBox sh.Name & "中没有生产任务单号字段!": End
            y = rn.Column
            For i = 2 To UBound(ar)
                If Trim(ar(i, y)) <> "" Then
                    If dic.exists(Trim(ar(i, y))) Then
                        T = dc(Trim(ar(i, y)))
                        If T = "" Then
                            k = k + 1
                            dc(Trim(ar(i, y))) = k
                            T = k
                            br(k, 1) = ar(i, y)
                        End If
                        For j = 1 To UBound(ar, 2)
                            lh = d(Trim(ar(1, j)))
                            If lh <> "" Then
                                br(T, lh) = br(T, lh) + ar(i, j)
                            End If
                        Next j
                    End If
                End If
            Next i
        End If
    Next sh
    If k = 1 Then MsgBox "没有符合具体的数据!": End
    .[a3].Resize(k, UBound(br, 2)) = br
End With
MsgBox "ok!"
End Sub
Private Sub UserForm_Initialize()
Dim ar As Variant
Dim rn As Range
Dim i As Long
Dim d As Object
Set dic = CreateObject("scripting.dictionary")
For Each sh In Sheets
    If sh.Name <> "求和" Then
        Set rn = sh.Rows(1).Find("生产任务单号", , , , , , 1)
        If rn Is Nothing Then MsgBox sh.Name & "中没有生产任务单号字段!": End
        y = rn.Column
        ar = sh.[a1].CurrentRegion
        For i = 2 To UBound(ar)
            If Trim(ar(i, y)) <> "" Then
                dic(Trim(ar(i, y))) = ""
            End If
        Next i
        Set rn = Nothing
    End If
Next sh
Me.ListBox1.List = dic.keys
Set dic = Nothing
End Sub

TA的精华主题

TA的得分主题

发表于 2023-5-31 08:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
仅供参考
工作簿1.rar (80.54 KB, 下载次数: 1)

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-16 08:27 , Processed in 0.038077 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表