在Excel VBA中多次引用单元格的更短方法

时间:2016-07-31 00:45:30

标签: excel vba excel-vba excel-2010

我使用以下代码块来设置一些初始值。我发现自己经常使用这种结构,我想知道是否有更简洁的东西?

(a, b)

如果重要,这些范围中的每一个都是一列宽。

3 个答案:

答案 0 :(得分:4)

我会使用枚举来引用列号。枚举位于代码模块的顶部。列表中的下一个枚举是从前一个增加1。枚举列的最大优点是需要重新排序列时;您只需更新枚举,您的代码将像以前一样运行。枚举也适用于intellisense。

enter image description here

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

答案 1 :(得分:3)

使用一个或多个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。

答案 2 :(得分:0)

我通常的方法是设置行范围的第一个单元格,然后使用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

或者也许Intersect可能会起作用:

Set areas = Sheets(AppTab).Range("(AppTransEffDate,AppTransAmt,AppActionCode,AppDescr) " & StartingRow & ":" & StartingRow).Areas

areas(1) = FirstPymtDueDate
areas(2) = RegularPymt
areas(3) = SchPymtDueActionCode
areas(4) = TransDescr