2016-07-31 84 views
0

我使用以下代码块来设置一些初始值。我发现我的自我使用这种构造很多,我想知道是否有更简洁的东西?在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 

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

回答

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 
+0

我已经开始使用这种方法和代码工作,但Intellisense不显示枚举(但工作,否则)。我还需要做些什么来使它枚举枚举?在我键入以下内容后,是否应该显示:StartingRow,cn [智能感知此处]? – WebUserLearner

+1

是键入cn cn,然后按住[ctrl] + [空格键]。 – 2016-07-31 19:05:22

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 

我不认为第二位....尾随着将显示尽可能多的改进在这种情况下,第一,但隔离你引用的细胞更有效,避免重复调用定位血统。

总是明确引用父工作表被广泛认为是“最佳实践”,并避免使用.Select和.Activate。

+0

有什么办法缩短 .Cells(StartingRow,.Range(“AppTransEffDate”)。Column)= FirstPymtDueDate (我需要保持StartingRow作为一个变量,因为它会改变) – WebUserLearner

+0

我不知道AppTransEffDate,AppTransAmt,AppActionCode和AppDescr指的是哪里或什么,所以不,我不能建议任何东西。 – Jeeped

+0

这些都是范围。每个基本上只是F,H等Col. – WebUserLearner

0

我通常的方法是设置行范围的第一个单元格,然后使用Range._Default财产

Set r = Sheets(AppTab).Range("A" & StartingRow) 
r(, Range("AppTransEffDate").Column) = FirstPymtDueDate 

而是命名范围的,我会用Enum像在Thomas Inzina的回答中。

如果您的命名范围从第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 
相关问题