2011-02-25 96 views
0

我決定通過例子問這個問題。我試圖解釋整個項目,但如果你還沒有在同一個項目上工作,那麼我們就去了。VBA找到excel中列間的距離

作爲我正在編寫的代碼的用戶,您需要確定您希望程序實際獲取哪些列以及將所有計算寫入哪裏。總共有9個用戶可以玩,但我會專注於前四個,所以它不會太複雜。

前兩個是我的程序需要執行計算的列(稍後解釋),它是整個項目運行的基礎。我們稱它們爲Data_Before和Data_After。

接下來的兩列是根據Data_Before和Data_After中的信息進行的計算。這兩列是差異和百分比。像標題所示,Diff是Data_After - Data_Before,Percent是Diff/Data_Before。

截至目前,列必須緊挨着彼此。因此,如果Data_Before在列「A」中,那麼Data_After必須出現在「B」中,差異在「C」和百分比在「D」中。這是因爲我的計算來自記錄宏功能。用於填充在DIFF和百分比細胞中的代碼是下面

' Diff column 
ActiveCell.FormulaR1C1 = "=RC[-1]-RC[-2]" 
' Percent column 
ActiveCell.FormulaR1C1 = "=RC[-1]/RC[-3]" 

對不起在代碼中,「差別列」和「百分比列」的怪異着色是註釋。無論如何,在這裏我們有FormulaR1C1,這使得程序不靈活。問題是,如何找到差異列和Data_Before或Data_After列之間的距離,以便用戶可以在列「A」中具有Data_Before,在列「B」中具有Data_After,但是可以在任何他們想要的位置使用Diff和Percent列?

對不起,問題的長度。

+0

比方說,用戶想要X和Y列中有Diff和Percent。那些地點將如何傳達給該計劃?換句話說:就像現在寫的那樣,你是如何確定列C和D是正確的輸出列的? – 2011-02-25 23:06:06

+0

其中包含所有代碼的excel文件與獲取數據的文件不同。對不起,我很難解釋清楚,但在代碼文件中,用戶輸入他們想要的所有內容。例如:用戶可能會說「我想讓Data_Before在F列,Data_After在G列等代碼:Dim Data_Before As String ... Set s1excel = ThisWorkbook.ActiveSheet ... Data_Before = Range(「B2」)。Text。The用戶會在計算文件中的B2單元格中輸入所需的列號 – 2011-02-25 23:12:16

回答

1

我只是在完成下面的步驟後纔看到您對程序設置的評論,希望能夠以某種方式提供幫助。

Sub InsertDiffPercentCalc(ByVal rngDataBeforeColumn As Excel.Range, ByVal rngDataAfterColumn As Excel.Range, ByVal rngTargetDiffColumn As Excel.Range, ByVal rngTargetPercentColumn As Excel.Range) 

' Diff column 
rngTargetDiffColumn.FormulaR1C1 = "=RC" & CStr(rngDataAfterColumn.Column) & "-RC" & CStr(rngDataBeforeColumn.Column) 
' Percent column 
rngTargetPercentColumn.FormulaR1C1 = "=RC" & CStr(rngTargetDiffColumn.Column) & "/RC" & CStr(rngDataBeforeColumn.Column) 

End Sub 

基於您的評論,你可以創建一個無參數子,但在任何情況下,你仍然必須確定目標列(或至少他們的地址) - 你怎麼做呢? 編輯剛剛看到您的其他評論。

Sub InsertDiffPercentCalc() 

Dim rngDataBeforeColumn As Excel.Range 
Dim rngDataAfterColumn As Excel.Range 
Dim rngTargetDiffColumn As Excel.Range 
Dim rngTargetPercentColumn As Excel.Range 

Set wksSettings = ThisWorkbook.Sheets("<settings sheet name>") 
Set wksTarget = Application.Workbooks("<target workbook name>").Sheets("<target sheet name>") 

Set rngDataBeforeColumn = wksTarget.Range(wksSetting.range("A2").Value & ":" & wksSetting.range("A2").Value) 
Set rngDataAfterColumn = wksTarget.Range(wksSetting.range("B2").Value & ":" & wksSetting.range("B2").Value) 
Set rngTargetDiffColumn = wksTarget.Range(wksSetting.range("C2").Value & ":" & wksSetting.range("C2").Value) 
Set rngTargetPercentColumn = wksTarget.Range(wksSetting.range("D2").Value & ":" & wksSetting.range("D2").Value) 

' Diff column 
rngTargetDiffColumn.FormulaR1C1 = "=RC" & CStr(rngDataAfterColumn.Column) & "-RC" & CStr(rngDataBeforeColumn.Column) 
' Percent column 
rngTargetPercentColumn.FormulaR1C1 = "=RC" & CStr(rngTargetDiffColumn.Column) & "/RC" & CStr(rngDataBeforeColumn.Column) 

End Sub 

其中wksSetting是設置表的名稱,wksTarget是目標(輸出)表的名稱。

+0

對不起,我對VBA很新,但我甚至沒有意識到你可以在Sub中輸入參數。我不完全確定如何編輯編碼實現該功能,因爲總共有9列。我試圖編輯此代碼,以取代ByVal ...作爲Excel.Range作爲參數,我使它Dim ... As Excel.Range在正文中。在我的代碼中,我和後面的計算有相同的計算,但是出現錯誤,提示「對象變量或塊變量未設置」首先計算。這個ByVal有什麼特別的嗎?當我將Dim轉換爲ByVal時,出現語法錯誤 – 2011-02-25 23:32:15

+0

不用擔心,我們來幫忙:) Sub被設計爲從另一個Sub中調用並傳遞四個參數 - Before/After/Diff/Perc。範圍。您的錯誤可能是由於您正在運行Sub而沒有提供這些參數。如果你希望它沒有參數運行,請參閱我的(編輯)答案。 – 2011-02-25 23:46:06

+0

當我嘗試運行它時,它給了我一個運行時錯誤'424',表示需要一個對象。被弄糟的那一行是第一個Set ......這讓我認爲所有的集合都會得到一個運行時間。我檢查了我的拼寫和一切,這一切都似乎匹配到你的,所以我不知道什麼是錯的 – 2011-03-01 19:45:21

0

根據您的評論,似乎您確切知道在哪裏放置輸出。對?所以,如果B列是數據之後列A是數據前,用戶想要在G列DIFF列,您可以使用此爲您的DIFF公式:

Range("G1").Formula = "=B1-A1" 

還是我誤會?

編輯

你可能這樣的事情後:

sheet1.Columns(15).column - sheet1.Columns(13).column ' returns 2 

你可以用它來創建一個R1C1公式。

+0

問題是用戶可以在任何地方使用這些列。我想嘗試讓代碼具有足夠的靈活性,以便用戶可以說「data_before和data_after列在Z和AA中,我希望在FEM和FEN列(真正的任何列是有效的)中完成計算」。我想我希望特定單元格的位置不會被硬編碼,以至於不能適應用戶所說的他們希望列的位置。我需要從用戶那裏得到的唯一真正需求是他們指定的data_before和data_after列實際上包含數字 – 2011-02-25 23:36:07

+0

好的,但是我們回到了原來的問題:如果用戶改變了他們對輸出位置的想法,那麼傳達給程序?命名範圍?用戶窗體?或者將目的地寫入某處的單元格中? – 2011-02-25 23:44:38

+0

目標地址寫入所有代碼所在的excel文件中(代碼位於一個按鈕內)。所以在這個單獨的文件中,我的列A具有諸如「Data_Before」或「Data_After」之類的單元,其中列B是它們將要進入​​的目標列。因此,如果用戶在單元格A2中輸入「H」而在單元格B2中輸入「I」我的代碼將會識別並查找具有原始數據的excel文件中的這兩個單元。對不起,我沒有很好地解釋它,但通常代碼只知道一切開始運行的地方,沒有什麼是硬編碼的,這樣對用戶來說就會更加靈活 – 2011-02-25 23:49:43

相關問題