ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决]分别选择数据透视表姓名字段所有姓名并执行“打印”宏

[复制链接]

TA的精华主题

TA的得分主题

发表于 2007-9-19 08:55 | 显示全部楼层 |阅读模式

求宏代码:分别选择数据透视表姓名字段所有姓名并执行“打印”宏(即打印分别每个人的报表)。谢谢!

备注:姓名数量不确定;“空白”不选择

Rzz4eKcm.rar (9.45 KB, 下载次数: 74)
[此贴子已经被作者于2007-9-21 18:14:03编辑过]

TA的精华主题

TA的得分主题

发表于 2007-9-19 10:16 | 显示全部楼层

看看这样能满足要求不
Sub Macro2()
Dim pntAddress As Range
Application.ScreenUpdating = False
 PIcnt = ActiveSheet.PivotTables("数据透视表2").PivotFields("姓名").PivotItems.Count
 With ActiveSheet.PivotTables("数据透视表2").PivotFields("姓名")
     For i = 2 To PIcnt
        .PivotItems(1).Visible = True
        .PivotItems(i).Visible = False
     Next i
     Set pntAddress = Range("F1", "H" & getlastusedrow(Range("F1")))
     ActiveSheet.PageSetup.PrintArea = pntAddress.Address
     ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
    
     For j = 2 To PIcnt - 1
        .PivotItems(j).Visible = True
        .PivotItems(j - 1).Visible = False
        Set pntAddress = Range("F1", "H" & getlastusedrow(Range("F1")))
        ActiveSheet.PageSetup.PrintArea = pntAddress.Address
        ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
    Next j
End With
Application.ScreenUpdating = True
End Sub

Function getlastusedrow(rg As Range) As Long
Dim lmaxrows As Long
lmaxrows = ThisWorkbook.Worksheets(1).Rows.Count
If IsEmpty(rg.Parent.Cells(lmaxrows, rg.Column)) Then
    getlastusedrow = rg.Parent.Cells(lmaxrows, rg.Column).End(xlUp).Row
Else
    getlastusedrow = rg.Parent.Cells(lmaxrows, rg.Column).Row
End If
End Function

[此贴子已经被作者于2007-9-19 10:18:30编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-9-19 10:35 | 显示全部楼层

谢谢wanderchen兄的代码,经过验证结果正确。

可否将代码简化一下:将数据透视表中的姓名全选后再取消全选,可一次取消全部姓名的选择,不必一个一个取消。不知道我是否说清楚了。

TA的精华主题

TA的得分主题

发表于 2007-9-19 11:00 | 显示全部楼层

在打印之前,先人工选择第一项是选择,其他不选择,这样速度快点
Sub Macro2()
Dim pntAddress As Range
Application.ScreenUpdating = False
 With ActiveSheet.PivotTables("数据透视表2").PivotFields("姓名")
 PIcnt = .PivotItems.Count
     Set pntAddress = Range("F1", "H" & getlastusedrow(Range("F1")))
     ActiveSheet.PageSetup.PrintArea = pntAddress.Address
     ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
    
     For j = 2 To PIcnt - 1
        .PivotItems(j).Visible = True
        .PivotItems(j - 1).Visible = False
        Set pntAddress = Range("F1", "H" & getlastusedrow(Range("F1")))
        ActiveSheet.PageSetup.PrintArea = pntAddress.Address
        ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
        Application.StatusBar = J & " / " & PIcnt - 1
    Next j
End With
Application.ScreenUpdating = True
End Sub

Function getlastusedrow(rg As Range) As Long
Dim lmaxrows As Long
lmaxrows = ThisWorkbook.Worksheets(1).Rows.Count
If IsEmpty(rg.Parent.Cells(lmaxrows, rg.Column)) Then
    getlastusedrow = rg.Parent.Cells(lmaxrows, rg.Column).End(xlUp).Row
Else
    getlastusedrow = rg.Parent.Cells(lmaxrows, rg.Column).Row
End If
End Function

[此贴子已经被作者于2007-9-19 11:21:57编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-9-19 11:12 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2007-9-19 11:23 | 显示全部楼层

是我漏删了ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True前的“'”号

因为测试的时候不需要执行这代码,所有我屏蔽了

现在已经改正

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-9-19 11:31 | 显示全部楼层

代码正确,非常感谢wanderchen兄!

再请教一点,当数据透视表没有“空白”选项,或“空白”选项不在选项列表的最后,上边的代码也正确吧?

[此贴子已经被作者于2007-9-19 11:54:36编辑过]

TA的精华主题

TA的得分主题

发表于 2007-9-19 12:19 | 显示全部楼层

对着透视表按右键,字段设置\高级下,选择 升序

这样就该解决问题了

[此贴子已经被作者于2007-9-19 12:23:25编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-9-19 12:53 | 显示全部楼层

再次谢谢wanderchen兄!

这段代码以后会经常用到,如果还能有更通用、更完美的代码,因此也请你或其他朋友继续研究修改。

可以改进的地方:

1、执行代码前要手工取消透视表的全部选项并选择好第一个选项;

2、代码中限制了透视表的列区间(可否只需指定透视表的选项单元,这样可适应不同列数量的情况);

3、透视表要事先定义排序,将“空白”选项排到最后,不能自动识别“空白”。

[此贴子已经被作者于2007-9-19 14:32:59编辑过]

TA的精华主题

TA的得分主题

发表于 2007-9-20 09:06 | 显示全部楼层

回复:(LangQueS)[求助]分别选择数据透视表姓名字段...

函数版,试试:

GNz3BxGi.zip (13.51 KB, 下载次数: 65)


cPeFMZjf.zip

11.96 KB, 下载次数: 55

[求助]分别选择数据透视表姓名字段所有姓名并执行“打印”宏

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

本版积分规则

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

GMT+8, 2024-11-26 10:27 , Processed in 0.073004 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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