我目前有3个工作表:输入、处理、输出和一个使用输入表上显示的值的宏,以及工艺表上的各种存储。问题是,当用户按下链接到输入页面上的宏的提交按钮时,工作表在显示输出工作表之前切换到流程工作表。我知道这是因为下面这行代码:
Worksheets("Process").Select但是,每当我将它从宏中删除时,所有的东西都会疯狂地超出范围。有没有什么方法可以选择一个工作表,而不是实际移动到它?我需要宏做它的事情,然后简单地显示输出表。提前感谢!
发布于 2016-06-08 18:24:48
正如@Jeeped声明和引用的那样,避免使用Select和Activate,此外,限定引用更安全。
例如,您可以使用Range("A1").Value来获取当前活动工作表中的单元格A1的值,但是如果用户当时没有激活该工作表,或者另一个进程移动了视图,该怎么办?您可以从任何可能的工作表中获取单元格A1的值。
最好是创建一个对工作表的引用,然后通过它发送您的所有工作,这样您就不需要更改活动工作表,并且不会对范围值的来源有任何歧义。
例如:
Option Explicit
Dim WkSht_I As Worksheet 'Input
Dim WkSht_P As Worksheet 'Process
Dim WkSht_O As Worksheet 'Output
Public Sub Sample()
Set WkSht_I = ThisWorkbook.Worksheets("Input")
Set WkSht_P = ThisWorkbook.Worksheets("Process")
Set WkSht_O = ThisWorkbook.Worksheets("Output")
MsgBox "Input A1 = " & WkSht_I.Range("A1").Value
MsgBox "Process A1 = " & WkSht_P.Range("A1").Value
MsgBox "Output A1 = " & WkSht_O.Range("A1").Value
Set WkSht_O = Nothing
Set WkSht_P = Nothing
Set WkSht_I = Nothing
End Sub将您的过程转换为此方法应该更安全、更清晰,并且您可以只设置一次活动工作表,使其在显示其他内容或正在处理其他内容时显示内容。
发布于 2016-06-08 19:23:31
@Gary的方法是当你处理多个工作表时最好的方法。
如果您只使用两个工作表(考虑到您有活动工作表和目标工作表),我将建议您
With Worksheets("Process")
Debug.Print .Range("A1")
Debug.Print Range("A1")
End With注意Range前面的"."。
"."表示它是带有的的一部分
换句话说,与Worksheets("Process").Range("A1")相同的是.Range("A1")
因为第二个范围(“A1”)没有“.”,所以它与Activesheet.Range("B1")相同,即使它在具有-End的内
如果活动表是Process,则输出将是相同的
但当您选择工作表而不是Process时,由于活动表已更改,因此输出将不同。
这将避免使用更改活动表的选择
https://stackoverflow.com/questions/37699065
复制相似问题