2016-07-31 30 views
0

Ich verwende den folgenden Codeblock, um einige Anfangswerte festzulegen. Ich habe mich selbst oft mit dieser Konstruktion beschäftigt und frage mich, ob es etwas Konkretes gibt.Kürzere Möglichkeit, in Excel auf Zellen zu verweisen 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 

Wenn es darauf ankommt, ist jeder dieser Bereiche eine Spalte breit.

Antwort

4

Ich würde eine Aufzählung verwenden, um die Spaltennummern zu referenzieren. Aufzählungen werden an der Spitze eines Codemoduls angezeigt. Die nächste Enumeration in der Liste ist Inkrement 1 von der vorherigen. Der große Vorteil der Aufzählung von Spalten besteht darin, dass Sie Ihre Spalten neu anordnen müssen. Sie müssen nur Ihre Aufzählung aktualisieren und Ihr Code wird wie zuvor ausgeführt. Die Aufzählungen funktionieren auch mit 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

Ich habe begonnen, diese Methode zu verwenden, und der Code funktioniert, aber das Intellisense zeigt die Aufzählungen nicht (funktioniert aber anders). Gibt es noch etwas, was ich tun muss, um die Enumerationen aufzunehmen? Sollte es erscheinen, nachdem ich Folgendes eingegeben habe: StartingRow, cn [intellisense here]? – WebUserLearner

+1

Ja, tippen Sie "cn" und halten Sie dann [Strg] + [Leertaste] gedrückt. –

3

Verwenden Sie eine oder mehrere With ... End With Anweisungen.

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 

Ich glaube nicht, das zweite mit .... End Mit so viel Verbesserung wie die erste in diesem Fall zeigen, aber die Zellen zu isolieren Sie verweisen ist effizienter und vermeidet Anrufe wiederholt Abstammungs zu lokalisieren.

Das explizite Referenzieren des übergeordneten Arbeitsblatts wird häufig als "best practice" betrachtet und vermeidet die Verwendung von .Select und .Activate insgesamt.

+0

Gibt es eine Möglichkeit zu verkürzen Sie die .Cells (StartingRow, .Range ("AppTransEffDate"). Spalte) = FirstPymtDueDate (Ich muss StartingRow als Variable behalten, weil es sich ändert) – WebUserLearner

+0

Ich habe keine Ahnung wo oder was sich AppTransEffDate, AppTransAmt, AppActionCode und AppDescr beziehen so Nein, ich kann nichts vorschlagen. – Jeeped

+0

Das sind Bereiche. Jeder ist im Grunde nur eine lange Strecke von Col. F, H, etc. – WebUserLearner

0

Meine übliche Art und Weise ist die erste Zelle der Zeile Bereich zu setzen und dann die Range._Default Eigenschaft zu verwenden

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

aber anstelle von benannten Bereichen, würde ich Enum wie in Thomas Inzina's Antwort.

Wenn benannte Bereiche aus Reihe 1 beginnen, dann könnte dies funktionieren

Range("AppTransEffDate")(StartingRow) = FirstPymtDueDate 

oder

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 

oder vielleicht Intersect könnte auch funktionieren:

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

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