ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 删除文件夹中其他工作薄中隐藏的工作表 (Excel版本2016))

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-9-17 10:36 | 显示全部楼层 |阅读模式
请见我附件“删除文件夹中其他文件中的隐藏表格”中模块1,为什么VBA中wb.Worksheets.Count的结果总是多1,而在立即窗口中执行这句结果是对的?



------------------------------------以下为代码------------------------------------------------------
  Sub 删隐藏()
'删除其他工作薄中隐藏工作表
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    With Application.FileDialog(msoFileDialogFolderPicker)
         .Title = "请选择工作簿所在的文件夹路径"
        If .Show Then
            Dim pathSelected As String, fn As String
            pathSelected = .SelectedItems(1)
            fn = Dir(pathSelected & "\*.xls*")
            
            Dim wb As Workbook
            Dim ws As Worksheet
            Dim t As Integer
            Dim i As Integer
            Do While fn <> ""
                Set wb = Workbooks.Open(pathSelected & "\" & fn, False)
               
               If wb.Name <> ThisWorkbook.Name Then
                   t = wb.Worksheets.Count          '就是这句有问题
                   MsgBox t
                    For i = 1 To t
                        If wb.Sheets(i).Visible <> xlSheetVisible Then
                           wb.Sheets(i).Visible = xlSheetVisible      '如果不加这句,隐藏的工作表无法删除
                            wb.Sheets(i).Delete
                        End If
                    Next i
                End If
               
                wb.Save
                wb.Close
                fn = Dir
            Loop
        End If
    End With
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    MsgBox "已完成"
End Sub


删除隐藏的工作表.rar

113.91 KB, 下载次数: 7

附件

TA的精华主题

TA的得分主题

发表于 2024-9-17 11:20 | 显示全部楼层
隐藏的工作表是无法正常删除的,所以,只有先把隐藏工作表先显示出来才能删除了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-18 16:14 | 显示全部楼层
ykcbf1100 发表于 2024-9-17 11:20
隐藏的工作表是无法正常删除的,所以,只有先把隐藏工作表先显示出来才能删除了。

谢谢老师解惑

TA的精华主题

TA的得分主题

发表于 2024-9-18 17:01 | 显示全部楼层
代码看下来好像有好几个问题,等下班后下载附件再仔细确认。

TA的精华主题

TA的得分主题

发表于 2024-9-19 09:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
count数值问题没有发现,但有几个逻辑问题:
1、现在的逻辑,打开工作簿后判断与当前工作簿名是否相同,应该在打开前做判断;
2、用index遍历删除隐藏工作表时,应该倒序处理,不然会导致遗漏。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-21 11:30 | 显示全部楼层
大灰狼1976 发表于 2024-9-19 09:48
count数值问题没有发现,但有几个逻辑问题:
1、现在的逻辑,打开工作簿后判断与当前工作簿名是否相同,应 ...

版主,没明白您的意思,能改造一下我的代码吗?谢谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-21 11:31 | 显示全部楼层
ykcbf1100 发表于 2024-9-17 11:20
隐藏的工作表是无法正常删除的,所以,只有先把隐藏工作表先显示出来才能删除了。

老师,您说的这个问题我上面的代码已经解决,能否帮我解决一下第一个问题?谢谢!

TA的精华主题

TA的得分主题

发表于 2024-9-21 20:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
scl2003921 发表于 2024-9-21 11:31
老师,您说的这个问题我上面的代码已经解决,能否帮我解决一下第一个问题?谢谢!

为什么会总是多1呢?多的应该是隐藏的表吧。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-22 13:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 scl2003921 于 2024-9-22 19:48 编辑
大灰狼1976 发表于 2024-9-18 17:01
代码看下来好像有好几个问题,等下班后下载附件再仔细确认。

谢谢老师,已经解决!


Sub 删隐藏()
    '删除其他工作薄中隐藏工作表
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
     Dim fn As String
    With Application.FileDialog(msoFileDialogFolderPicker)
         .Title = "请选择工作簿所在的文件夹路径"
        If .Show Then
            Dim pathSelected As String
            pathSelected = .SelectedItems(1)
            fn = Dir(pathSelected & "\*.xls*")
            Dim wb As Workbook
            Dim ws As Worksheet
            Dim t As Integer
            Dim i As Integer
            If fn Like ThisWorkbook.Name Then  '如果Dir首次选中的是thisworkbook则重新选择。这个判断原来在循环条件中,不知道为什么效果不行。
                fn = Dir
             End If
            Do While fn <> ""
               Set wb = Workbooks.Open(pathSelected & "\" & fn, False)
                    t = wb.Worksheets.Count
                     For i = t To 1 Step -1      '听取老师建议,采用倒序法,避免溢出
                        If wb.Sheets(i).Visible <> xlSheetVisible Then
                           wb.Sheets(i).Visible = xlSheetVisible
                            wb.Sheets(i).Delete
                        End If
                    Next i
                wb.Save
                wb.Close
                fn = Dir
            Loop
        End If
    End With
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub


删除隐藏的工作表.rar

101.87 KB, 下载次数: 3

附件

TA的精华主题

TA的得分主题

发表于 2024-9-23 21:10 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 02:32 , Processed in 0.035939 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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