Excel中Range.Cells的Select方法在第二次循环时执行失败
EntireRow.Select执行失败的问题 看起来你卡在循环的后续步骤里了,这种Select方法报错的情况在VBA里挺常见的,尤其是涉及到切换工作簿的时候。先把你的问题再理一遍:
我编写一段Excel VBA代码许久,接近完成。该代码从一个工作表提取3个单元格的数据,复制到另一个工作表,根据第一个工作表中的名称保存副本,然后循环处理所有已填充行。当前遇到的问题是:第一次循环完成后,需要选择存储数据的工作簿(该选择为函数必需)时,因
WsStam.Cells(row, iKolomnrCorpID).EntireRow.Select执行失败而无法完成选择,调试时……
问题根源
Select方法有个硬性要求:你要选择的行所在的工作表,必须是当前活动工作表。第一次循环完成后,你刚保存了新的工作簿,此时活动对象已经切换到那个新保存的文件了,再直接调用原工作表WsStam的Select方法,自然会报错——VBA找不到要操作的活动对象。
两种解决方案
方案1:彻底抛弃Select(推荐!)
VBA里依赖Select/Activate是很多bug的根源,能不用就不用。如果你的后续操作(比如复制、处理数据)不需要依赖选中状态,直接通过对象引用操作就行。
比如原来你可能写的是:
WsStam.Cells(row, iKolomnrCorpID).EntireRow.Select Selection.Copy 目标工作表.Range("A1").PasteSpecial
改成直接操作:
WsStam.Cells(row, iKolomnrCorpID).EntireRow.Copy _ Destination:=目标工作表.Range("A1")
这样完全不需要选中,既高效又不会出对象混乱的问题。
方案2:必须用Select时,先激活目标工作表
如果你的某个函数确实必须依赖选中状态(比如一些老旧的自定义函数),那就在执行Select前,先把WsStam所在的工作表和工作簿激活:
' 先激活WsStam所在的原工作簿 WsStam.Parent.Activate ' 再激活WsStam工作表 WsStam.Activate ' 现在再执行选择就不会报错了 WsStam.Cells(row, iKolomnrCorpID).EntireRow.Select
循环里的额外注意事项
每次保存新工作簿后,记得切回原工作簿继续循环,最好提前把原工作簿用变量存起来,避免依赖ActiveWorkbook这种不稳定的对象:
' 提前保存原工作簿的引用 Dim wbOriginal As Workbook Set wbOriginal = ThisWorkbook ' 循环处理每一行 For row = 2 To WsStam.Cells(WsStam.Rows.Count, iKolomnrCorpID).End(xlUp).row ' 1. 提取并复制数据到目标工作表 ' ... 你的提取代码 ... ' 2. 保存新工作簿 Dim savePath As String savePath = "C:\你的保存路径\" & WsStam.Cells(row, iKolomnrCorpID).Value & ".xlsx" 目标工作表.Parent.SaveAs Filename:=savePath ' 3. 切回原工作簿,准备下一次循环 wbOriginal.Activate WsStam.Activate ' 如果需要选中当前行,执行这里 WsStam.Cells(row, iKolomnrCorpID).EntireRow.Select Next row
这样就能保证每次循环时,操作的对象都是正确的,不会出现第一次循环后找不到工作表的情况。
内容的提问来源于stack exchange,提问作者MyName

