Excel 在代码执行期间多次使用Set Worksheets方法不是一个好主意吗?

Excel 在代码执行期间多次使用Set Worksheets方法不是一个好主意吗?,excel,vba,image,Excel,Vba,Image,我正在尝试使用下面的代码将不同的图像复制到工作簿的不同工作表中。我在另一个子系统中动态更改目标工作表,在全局声明部分使用字符串变量。我可以看到变量被传递到sub,事实上它在代码的第一次传递中起作用,但是当我尝试将“TargetSheetIni”变量更改为新的工作表时,它会在循环时继续使用第一个原始工作表 在使用Set关键字后,您不能更改目标工作表吗?我应该直接参考表格吗 Sub Test1() Dim TargetWS, SourceWS As Worksheet Set TargetWS

我正在尝试使用下面的代码将不同的图像复制到工作簿的不同工作表中。我在另一个子系统中动态更改目标工作表,在全局声明部分使用字符串变量。我可以看到变量被传递到sub,事实上它在代码的第一次传递中起作用,但是当我尝试将“
TargetSheetIni
”变量更改为新的工作表时,它会在循环时继续使用第一个原始工作表

在使用
Set
关键字后,您不能更改目标工作表吗?我应该直接参考表格吗

Sub Test1()

Dim TargetWS, SourceWS As Worksheet

Set TargetWS = Worksheets(TargetSheetIni)
Set SourceWS = Worksheets("Images")

DoEvents
SourceWS.Shapes(CurrentImageId).Copy
DoEvents
TargetWS.Paste Range(ColumnLetter2 & RwCnter)
DoEvents

End Sub

我想我可能已经弄明白了。据我所知,问题可能是我最初创建目标工作表时使用了Excel中的“复制工作表”功能。即使我在下面的选项卡和项目编辑器中重命名了图纸。。。出于某种原因,VBA一直只针对原始图纸

我通过改变我的代码来明确地调用我想要针对的工作表来证明这一点,如下所示:

ActiveWorkbook.Worksheets("Sheet2").Paste Range("I2")
即使这样做,粘贴命令也会以工作表1为目标,而不是预期的工作表2。我删除了三个拷贝表,从头开始创建了一个新的拷贝表,并重新执行了代码,现在它像预期的那样以表2为目标

我发现这篇文章可以解释我想


好的,我的最后一个答案可能不正确。似乎由于某种原因,插入ws.activate导致我的代码开始工作
非常令人沮丧的修正。我一直听说要避免使用它。

您的代码不完整。您在哪里设置工作表名称变量?您可以在任何时间、任何频率使用set:没有限制。但是,您应该做的是明确限定您想要的工作表位于哪个工作簿中。这样可以避免在打开多个工作簿时出现混乱。例如,
Set TargetWS=thiswook.Worksheets(TargetSheetIni)
Set TargetWS=ActiveWorkbook.Worksheets(TargetSheetIni)
。如果您正在运行Set,但它没有任何效果,那么您可能正在代码中使用错误恢复下一步的
?您可以多次使用
Set
。那不是你问题的原因。您没有显示足够的代码来找出问题所在。但您可能需要全局定义工作表对象变量,而不是名称字符串。感谢大家迄今为止的回答!我已将工作表声明移至模块的“全局”部分。我应该使用一个模块,还是应该在“ThisWorkbook”部分使用这样的代码?我也在set语句中添加了“ThisWorkbook”名称,但我很确定这不是问题所在。因为我在运行代码时只打开了一个工作簿,但为了以防万一,这样做可能是一个很好的做法。至于另一个代码丢失了。这是一个相当大的子,所以我只想包括相关的内容。但是,i=1到4 TargetSheetIni=“Sheet”&我调用test1 Next i End Sub“的Sub SheetChooser()是它的jist