在Excel VBA中多次引用单元格的更简单的方法
我使用下面的代码块来设置一些初始值。 我发现我自己使用这种结构很多,我想知道是否有更简洁的东西?
Sheets(AppTab).Select Cells(StartingRow, Range("AppTransEffDate").Column).Value = FirstPymtDueDate Cells(StartingRow, Range("AppTransAmt").Column).Value = RegularPymt Cells(StartingRow, Range("AppActionCode").Column).Value = SchPymtDueActionCode Cells(StartingRow, Range("AppDescr").Column).Value = TransDescr
如果重要,这些范围中的每一个都是一列宽。
我将使用枚举引用列号。 枚举位于代码模块的顶部。 列表中的下一个枚举是从前一个增量1。 枚举列的最大好处是当你需要重新排列列时, 你只需要更新你的枚举,你的代码将像以前一样运行。 枚举也适用于intellisense。
Option Explicit Public Enum Cols cnAppTransEffDate = 2 cnAppTransAmt = 4 cnAppActionCode = 5 cnAppDescr End Enum Sub FillData() ' Some Code With Worksheets(AppTab) .Cells(StartingRow, cnAppTransEffDate).Value = FirstPymtDueDate .Cells(StartingRow, cnAppTransAmt).Value = RegularPymt .Cells(StartingRow, cnAppActionCode).Value = SchPymtDueActionCode .Cells(StartingRow, cnAppDescr).Value = TransDescr End With End Sub
使用一个或多个With … End With语句。
with Sheets(AppTab) .Cells(StartingRow, .Range("AppTransEffDate").Column) = FirstPymtDueDate .Cells(StartingRow, .Range("AppTransAmt").Column) = RegularPymt .Cells(StartingRow, .Range("AppActionCode").Column) = SchPymtDueActionCode .Cells(StartingRow, .Range("AppDescr").Column) = TransDescr end with 'alternate with Sheets(AppTab) with .rows(StartingRow) .Cells(1, .Range("AppTransEffDate").Column) = FirstPymtDueDate .Cells(1, .Range("AppTransAmt").Column) = RegularPymt .Cells(1, .Range("AppActionCode").Column) = SchPymtDueActionCode .Cells(1, .Range("AppDescr").Column) = TransDescr end with end with
我不认为第二个With …. End With会在这种情况下显示出与第一个一样的改进,但是隔离您引用的单元格会更高效,并避免重复调用来定位父项。
始终明确引用父级工作表被广泛认为是“最佳实践”,并避免使用.Select和.Activate。
我通常的方法是设置行范围的第一个单元格,然后使用Range._Default
属性
Set r = Sheets(AppTab).Range("A" & StartingRow) r(, Range("AppTransEffDate").Column) = FirstPymtDueDate
而不是命名的范围,我会像Thomas Inzina的答案那样使用Enum
。
如果您的命名范围从第1行开始,那么这可能工作
Range("AppTransEffDate")(StartingRow) = FirstPymtDueDate
要么
Set areas = Sheets(AppTab).Range("AppTransEffDate,AppTransAmt,AppActionCode,AppDescr").Areas areas(1)(StartingRow) = FirstPymtDueDate areas(2)(StartingRow) = RegularPymt areas(3)(StartingRow) = SchPymtDueActionCode areas(4)(StartingRow) = TransDescr
或者也许相交也可能工作:
Set areas = Sheets(AppTab).Range("(AppTransEffDate,AppTransAmt,AppActionCode,AppDescr) " & StartingRow & ":" & StartingRow).Areas areas(1) = FirstPymtDueDate areas(2) = RegularPymt areas(3) = SchPymtDueActionCode areas(4) = TransDescr