2016-02-22 104 views
3

我有一個宏,它可以在同一個工作簿中讀取和寫入兩張數據。簡化VBA代碼

是否可以清理和簡化代碼/語句以提高可讀性並有助於調試工作?

即使使用space-underscore方法使用多條線,這些陳述變得如此漫長,以至於令人困惑。這已成爲笨拙的聲明

例子:

Range("mx_plan").Cells(WorksheetFunction.Match(sortedAircraft.Item(i).tailNumber, Range("aircraft")), WorksheetFunction.Match(currentWeekId, Range("week_id")) + weekly_hours_col_offset) = (acft_hoursDNE/acft_weeksRemaining) 

我故意想避免單個單元格或範圍明確提及。

回答

3

您的聲明是225個字符!

調試它是不可能的,因爲它是一個指令太多的東西,你只能在一行代碼上放置一個斷點......所以你不能破壞和檢查任何中間值你正在使用。

打破它:

tailNumber = sortedAircraft.Item(i).tailNumber 
aircraft = someSheet.Range("aircraft").Value 
planRow = WorksheetFunction.Match(tailNumber, aircraft) 

weekId = someSheet.Range("week_id").Value 
planColumn = WorksheetFunction.Match(currentWeekId, weekId) 

Set target = someSheet.Range("mx_plan").Cells(planRow, planColumn + weekly_hours_col_offset) 
target.Value = acft_hoursDNE/acft_weeksRemaining 

記住聲明Dim)你使用(使用Option Explicit以確保代碼不能編譯,如果你與一個變量名一個錯字所有變量),對所有標識符使用有意義的名稱(告訴讀者它們的用途是什麼--當爲什麼從代碼本身不明顯時使用註釋)。

通過將其分解爲多個較小的步驟,您不僅可以更輕鬆地進行讀取/維護,還可以更輕鬆地進行調試,因爲運行時錯誤會在特定指令中引發特定線,您將能夠更輕鬆地找出故障輸入。

+0

回覆:225個字符 - 對嗎?!?恰好是我的問題。感謝關於分解的建議。我試圖儘可能使用有意義的名稱,等等。我將在這個項目失控之前開始工作。 –

+0

@ZephyrMays可以隨時在[codereview.se]上發佈您的工作代碼(儘可能多的上下文),以使其更具可讀性,高效性和可維護性等。 –

+0

絕對會這樣做。我很感謝你和@Jeeped回答的時間。打破事情的行爲揭示了大量的重複性陳述或部分陳述,我已經儘可能地將它們分解爲單獨的變量。任何時候,我不止一次看到相同的聲明,很容易將它拉出來。現在更容易辨認。 –

2

使用With ... End With語句來本地化任何Range.Parent屬性。

聲明並設置一個變量爲Excel Application object,該變量可用作WorksheetFunction object的替代品。這應該使重複調用工作表函數更具可讀性。

通過提供_(例如,chr(95)),將等號的所有內容帶到下一行。這就像串接字符一樣,並允許單個代碼行分佈在兩行或更多行上。我也用它來排列兩個MATCH函數,它們將行和列返回到Range.Cells property

Dim app As Application 
Set app = Application 

With Worksheets("Sheet1").Range("mx_plan") 
    .Cells(app.Match(sortedAircraft.Item(i).tailNumber, Range("aircraft"), 0), _ 
      app.Match(currentWeekId, Range("week_id"), 0) + weekly_hours_col_offset) = _ 
     (acft_hoursDNE/acft_weeksRemaining) 
End With 

Set app = Nothing 

這看起來比我的眼睛更具可讀性。您對命名範圍的使用也可能會得到改進,但在不知道每個屬於哪個父級工作表的情況下很難提出建議。

注意:我爲每個MATCH函數添加了一個, 0以強制對未排序數據進行完全匹配。我不知道這是你的意圖,但沒有他們的數據飛機week_id命名範圍必須排序(見MATCH function)。

+0

確實比較好。現在,假設'Range(「aircraft」)'包含一個使整個陳述被炸燬的值。或者''ActiveSheet''(它被隱含地用'Range'函數引用,就像這樣)不是預期的,並且命名的範圍不能被訪問。好玩嗎? ;-) –

+0

也會試試這個。 –