ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

vba 编程求解

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-11-30 21:18 | 显示全部楼层 |阅读模式
下面的代码标红的如果是True,就会进入死循环,如果改成False,就会正常,请高手们给解释一下
Sub huizong()

Application.DisplayAlerts = False
Dim wb As Workbook
Dim wb1 As Workbook
Dim i
Dim file1 As String

  mpath = ThisWorkbook.Path
   Set wb = Workbooks.Add
  file1 = Dir(mpath & "\" & "*.xlsx")
i = 1
Do While file1 <> ""
   Set wb1 = Workbooks.Open(mpath & "\" & file1)
wb1.Sheets(Array(Sheets(1).Name, Sheets(2).Name)).Copy before:=wb.Sheets(1)
wb1.Close savechanges:=True
i = i + 1
file1 = Dir
Loop
'wb.SaveAs (mpath & "\hongzong.xlsx")
'wb.Close

End Sub


123.zip

592.82 KB, 下载次数: 3

TA的精华主题

TA的得分主题

发表于 2024-11-30 23:12 | 显示全部楼层
代码功能概述
这段 VBA 代码的主要目的是遍历指定文件夹(由 ThisWorkbook.Path 确定的当前工作簿所在文件夹)下的所有 .xlsx 文件,然后将每个文件中的指定工作表(这里是第一个和第二个工作表,通过 Array(Sheets(1).Name, Sheets(2).Name) 指定)复制到一个新建的工作簿 wb 中,最后保存或关闭这个汇总的工作簿(虽然代码中保存和关闭的部分被注释掉了,但从整体意图来看应该是要完成这样的操作)。
关于循环条件和可能出现死循环的分析
在 Do While 循环中,循环条件是 file1 <> "",这里 file1 的值是通过 Dir 函数来获取的。
正常情况(将相关代码改为 False 时正常的假象分析):
当你说把某些代码改成 False 就正常时,我推测你可能是指对 Application.DisplayAlerts = False 这行代码的修改。实际上,这行代码本身与循环是否正常结束并没有直接关系。但如果将它改成 True,在后续操作中(比如打开和关闭工作簿时)可能会弹出一些提示框(例如询问是否保存更改等),这些提示框会中断代码的执行,导致你可能误以为循环不正常结束了。而将它设置为 False 抑制了这些提示框,使得代码能够顺利执行完循环,让你感觉循环是正常结束的,但其实这只是让代码执行过程中不被提示框干扰,并不是真正解决了循环条件本身可能存在的问题。
导致死循环的真正原因分析:
循环中通过 file1 = Dir 来更新 file1 的值以获取下一个文件名。然而,这里存在一个潜在的问题,如果在循环过程中没有找到任何符合条件(即 *.xlsx)的文件,Dir 函数会返回一个空字符串。但是,如果在进入循环之前,指定文件夹下就没有任何 .xlsx 文件,那么第一次调用 Dir 函数(通过 file1 = Dir(mpath & "\" & "*.xlsx"))就会返回空字符串,此时循环条件 file1 <> "" 就不满足,循环根本不会进入,这是一种情况。
另一种情况是,如果在循环过程中,已经遍历完了所有符合条件的文件,Dir 函数同样会返回空字符串,但此时循环条件判断 file1 <> "" 依然会成立(因为还没有更新 file1 的值),就会导致循环再次执行,然后再次执行到 file1 = Dir,又得到空字符串,如此反复,就形成了死循环。
为了避免死循环,应该在更新 file1 的值之后,立即检查它是否为空,如果为空,就应该退出循环。

TA的精华主题

TA的得分主题

发表于 2024-11-30 23:14 | 显示全部楼层
wb1.Close savechanges:=True是关闭并保存,=false是关闭不保存,工作簿wb1打开并复制文件,是不需要保存的。
Sub huizong()
Dim wb As Workbook
Dim wb1 As Workbook
Dim file1 As String
Application.ScreenUpdating = False
Application.DisplayAlerts = False
mpath = ThisWorkbook.Path
Set wb = Workbooks.Add
file1 = Dir(mpath & "\" & "*.xlsx")
Do While file1 <> ""
   Set wb1 = Workbooks.Open(mpath & "\" & file1)
   wb1.Sheets(Array(Sheets(1).Name, Sheets(2).Name)).Copy before:=wb.Sheets(1)
   wb1.Close savechanges:=False
   file1 = Dir
Loop
wb.SaveAs (mpath & "\hongzong.xlsx")
wb.Close
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

TA的精华主题

TA的得分主题

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

本版积分规则

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

GMT+8, 2024-12-1 09:02 , Processed in 0.040557 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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