鱼C论坛

 找回密码
 立即注册
查看: 3846|回复: 13

[已解决]有没有批量删除xls和xlsx多个工作簿里的工作表的方法?

[复制链接]
发表于 2019-11-13 11:43:46 | 显示全部楼层 |阅读模式
10鱼币
如题,跪求大神们解答!
最佳答案
2019-11-13 11:43:47
本帖最后由 倒戈卸甲 于 2019-11-13 18:00 编辑

如果你没用过excel的编程功能,这里简单介绍一下:按住Alt键+F11键打开VBA,然后在左侧找到VBAproject,模块右键添加模块,然后在右侧窗口粘贴我的代码即可。使用哪个函数就在哪个函数内左键点击一下(表示在这个函数内),然后按F5运行即可。

最佳答案

查看完整内容

如果你没用过excel的编程功能,这里简单介绍一下:按住Alt键+F11键打开VBA,然后在左侧找到VBAproject,模块右键添加模块,然后在右侧窗口粘贴我的代码即可。使用哪个函数就在哪个函数内左键点击一下(表示在这个函数内),然后按F5运行即可。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-13 11:43:47 | 显示全部楼层    本楼为最佳答案   
本帖最后由 倒戈卸甲 于 2019-11-13 18:00 编辑

如果你没用过excel的编程功能,这里简单介绍一下:按住Alt键+F11键打开VBA,然后在左侧找到VBAproject,模块右键添加模块,然后在右侧窗口粘贴我的代码即可。使用哪个函数就在哪个函数内左键点击一下(表示在这个函数内),然后按F5运行即可。
无标题.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-13 13:20:19 From FishC Mobile | 显示全部楼层
如果要单纯操作workbook中的worksheet对象,可以使用VBA,只用几行代码而且稳定。这方面python效果不如Virtul Basic简单暴力
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-13 16:52:58 | 显示全部楼层
倒戈卸甲 发表于 2019-11-13 13:20
如果要单纯操作workbook中的worksheet对象,可以使用VBA,只用几行代码而且稳定。这方面python效果不如Virt ...

能附上代码么?大神
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-13 17:02:52 From FishC Mobile | 显示全部楼层
弱弱的佳佳 发表于 2019-11-13 16:52
能附上代码么?大神

之前不清楚你问这个是想实际拿来用还是要学习python进阶算法,,,实际用的话,等我吃过饭去给你写一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-13 17:41:33 | 显示全部楼层
  1. Sub sheets另存()  '把所有工作表另存出去
  2.     Dim sht As Worksheet
  3.     For Each sht In Sheets
  4.         
  5.         
  6.         sht.Copy
  7.         ActiveWorkbook.SaveAs Filename:="d:\data" & sht.Name & ".xlsx"
  8.         ActiveWorkbook.Close
  9.    
  10.     Next



  11. End Sub



  12. Sub del()   '删除所有工作表
  13. Dim i As Integer
  14.     Excel.Application.DisplayAlerts = False
  15.    
  16.     If Sheets.Count > 1 Then
  17.    
  18.         For i = 2 To Sheets.Count
  19.             Sheets(2).Delete
  20.         Next
  21.     End If
  22.     Excel.Application.DisplayAlerts = True
  23. End Sub



  24. Sub test1()   '导入工作表
  25.     Dim arr()
  26.     Dim str As String
  27.     Dim wb, wb1 As Workbook
  28.     Set wb1 = ActiveWorkbook
  29.    
  30.    
  31.     arr = Application.GetOpenFilename("excel文件,.xls*", 2, , , True)
  32.     If arr(1) <> False Then
  33.         For i = LBound(arr) To UBound(arr)
  34.         
  35.         Set wb = Workbooks.Open(arr(i))
  36.         
  37.         wb.Sheets(1).Copy after:=wb1.Sheets(wb1.Sheets.Count)
  38.         wb1.Sheets(wb1.Sheets.Count).Name = Split(wb.Name, ".")(0)
  39.         
  40.         
  41.         wb.Close
  42.         
  43.         Next
  44.     End If
  45.    
  46. End Sub
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-13 17:49:23 | 显示全部楼层
本帖最后由 倒戈卸甲 于 2019-11-13 18:07 编辑

以上代码包含三个函数,sheets另存函数可以把所有的工作表存为单独的excel文件。也是一颗后悔药。在使用前你要在d盘根目录下新建一个名字为data的空文件夹。del函数是你要的东西,可以删除所有工作表只留一个。test1函数就是使用后悔药,能弹出一个对话框让你导入excel文件,选择你想的文件夹,按住ctrl选择多个文件,这些文件会被添加到工作表。但test1函数我写的比较简略,没有去预防一些bug,如果你现有的工作表和要导入的excel文件重名,程序会崩溃。
这三个函数应该能满足你的所有需求了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-13 18:05:52 | 显示全部楼层
如果仅仅实现删除工作表,函数del只需要8行代码,VBA的简单粗暴还是让人吃惊的。因为excel作为一个微软的windows软件,其开发思想是面向对象,而VBA能够直接去调用被定义好的单元格、工作表和工作薄对象,其效率可想而知。如果你有这方面的需求,应当学习一下VBA
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-13 18:11:52 | 显示全部楼层
本帖最后由 倒戈卸甲 于 2019-11-13 18:15 编辑

特别强调一句,我给你三个函数可不是我吃饱了撑的。因为VBA函数对excel的操作是破坏性,一旦使用del()函数,你没办法Ctrl+Z,也没办法用excel工具栏的撤销按钮恢复工作表。
当然,其这三个函数单独使用其实也都是很好使的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-14 08:39:22 | 显示全部楼层
倒戈卸甲 发表于 2019-11-13 18:11
特别强调一句,我给你三个函数可不是我吃饱了撑的。因为VBA函数对excel的操作是破坏性,一旦使用del()函数 ...

学习了,谢谢大神!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-16 17:17:04 | 显示全部楼层

我决定自学vbs,先请教一下这个问题怎么解决,我现在有一个文件夹,里面有很多的xls工作簿,想把每个工作簿里的第四个工作表删除,请问怎么操作能解决呢?麻烦您写一下注释,拜托了大神!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-16 17:26:22 From FishC Mobile | 显示全部楼层
弱弱的佳佳 发表于 2019-11-16 17:17
我决定自学vbs,先请教一下这个问题怎么解决,我现在有一个文件夹,里面有很多的xls工作簿,想把每个工作 ...

那个我今天有点事,看看晚上十点左右能不能有空去玩会儿电脑,能的话就给你写,不然的话可能要等明天
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-16 21:44:43 | 显示全部楼层
本帖最后由 倒戈卸甲 于 2019-11-17 08:58 编辑
  1. Sub 删第四张表()

  2. Dim str As String '字符串变量str
  3. Dim wb As Workbook '工作簿变量wb(这是VBA的灵魂,也是面向对象编程的特色,Workbook与单元格、工作表这些都是
  4. '被定义好的类,可以实例化为对象,也就是excel主程序你看到的具体的单元格和工作表。这里定义了工作薄变量wb,接下来
  5. 'wb既能像变量一样放在for和if等语句被执行,同时wb作为工作簿的属性(比如有名称、拥有下属工作表)以及wb作为工作簿的方法(比如能被
  6. 'excel主程序打开和关闭)都能随时被调用

  7.     Excel.Application.DisplayAlerts = False '关闭掉excel保护提醒,否则每次执行删除sheet操作excel都会弹出确认对话框
  8.     str = Dir("C:\john\*.xlsx") 'dir就是目录的意思,这个函数和其它编程语言没差别。然后点睛之笔在于excel支持模糊匹配
  9.     '这一个*能把你所有的xlsx文件全部都抓取到。然后C:\john你需要改成自己的文件夹,xlsx后缀当然可改为xls。
  10.    
  11.     For i = 1 To 100 '循环语句,把循环体内的内容执行100次,如果你文件夹里有1000个文件,把100修改为1000,一般20就足够用
  12.    
  13.         Set wb = Workbooks.Open("c:\john" & str)   'Workbooks.Open是工作薄Workbook的一个方法(函数),功能就是打开文件
  14.         '后面都是固定写法,"c:\john" & str等同于"c:\john\*.xlsx"
  15.         
  16.         If wb.Sheets.Count > 3 Then '显然if 、then、 end if 为VBA分支语句的关键字
  17.         '这里三个语句功能执行删除第四个工作表的功能,之所以放到if语句里是为了防止工作薄中不足4个工作表时程序崩溃。
  18.         wb.Sheets(4).Delete
  19.         End If
  20.         
  21.         wb.Close '显然,close是与open对立的方法(函数),功能是关闭文件
  22.         
  23.         
  24.         str = Dir '这里应该是第二处点睛之笔,这个程序能如此简洁应该归功于它。具体原理你不需要了解,只需要知道一个事实
  25.         
  26.         '那就是str在模糊匹配的情况下,每次调用dir会顺次得到第一个文件、第二个文件……直至最后一个文件
  27.         
  28.         If str = "" Then '其实仍然是模糊匹配的霸道之处,或者说VB语法的简单粗暴之处,能在遍历所有文件之后给你一个空值。
  29.         Exit For '相当于C中关键字break
  30.         
  31.         End If 'endif 与if总是成对

  32.     Next 'for 与next 总是成对
  33.     Excel.Application.DisplayAlerts = True '恢复excel的保护提醒
  34. End Sub 'sub ()与end sub总是成对
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-16 21:52:07 | 显示全部楼层
算是如约而至吧,因为楼主的问题也比较规范,想要实现的功能很符合编程的逻辑。这个函数是对指定文件夹中的xlsx文件进行操作的,其实我最初给你的导入工作表那个函数能交互式地选择文件,把那个函数稍微改动两行也能实现多个工作薄中的第四工作表删除功能。但那个函数远不如这一个函数基础,我觉得这个函数楼主更能看懂。只要有高中的英语水平。VB的语法非常朴素
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-27 15:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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