我听说过很多关于.Select在Excel VBA 中使用的可理解的憎恶,但我不确定如何避免使用它.我发现如果我能够使用变量而不是Select函数,我的代码将更加可重用.但是,ActiveCell如果不使用,我不确定如何引用事物(如等)Select.
我发现这篇关于范围的文章和这个例子关于不使用select的好处却找不到怎么样的东西?
在Excel中,我有一些宏是Worksheet模块的一部分.
在代码中,我想确保引用的范围是该工作表的一部分.
例如,在我的Main Sheet工作表模块中,说我有:
Sub test()
Dim rng as Range
Set rng = Range("A1")
End Sub
Run Code Online (Sandbox Code Playgroud)
当然,我想明确给出工作表范围.通常情况下,我会这样做
Set rng = Worksheets("Main Sheet").Range("A1")
Run Code Online (Sandbox Code Playgroud)
但我很好奇,因为我在工作表模块中有我的代码,我怎么能参考那个工作表?我在考虑类似的东西,ThisWorksheet但这不是VBA中的一种方法(但是ThisWorkbook,这就是为什么我想尝试它).
我唯一的另一个想法是,由于我的宏在工作表模块中,"未分配"范围变量隐式引用Main Sheet并且不能引用任何其他工作表的单元格.
我是否理解正确,或者是否有某种方法可以参考运行代码的工作表?
我刚刚在 Excel VBA 中编写了这个简单的宏,用于合并一组选定的单元格:
Sub Macro_Merge()
Dim Temp As String
Dim S As Variant
Temp = ""
For Each S In Selection
If Temp = "" Then
Temp = CStr(S.Value)
Else:
Temp = Temp + "," + CStr(S.Value)
End If
Next
Selection.Merge
Selection.Value = Temp
Selection.VerticalAlignment = xlTop
End Sub
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我总是看到那个烦人的对话框,警告我在合并时丢失数据(这正是我在宏中试图避免的情况)。
我可以摆脱该对话框,配置Application的DisplayAlerts属性:
Application.DisplayAlerts = False
Selection.Merge
Selection.Value = Temp
Application.DisplayAlerts = True
Run Code Online (Sandbox Code Playgroud)
这工作正常。
因此,与Application默认对象一样,我尝试清理我的代码,如下所示:
DisplayAlerts = False
Selection.Merge
Selection.Value = Temp
DisplayAlerts = True …Run Code Online (Sandbox Code Playgroud)