在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