2014-03-27 59 views
1

哇,我覺得我真的很接近這一個。For循環改變公式相對於範圍excel vba

我有這樣的代碼模塊中:

Range("R1400").Formula = "=(ROUND(AC1400, 0))+0.0625" 
Range("R1401").Formula = "=(ROUND(AC1401, 0))+0.0625" 
Range("R1402").Formula = "=(ROUND(AC1402, 0))+0.0625" 
Range("R1403").Formula = "=(ROUND(AC1403, 0))+0.0625" 
Range("R1404").Formula = "=(ROUND(AC1404, 0))+0.0625" 
Range("R1405").Formula = "=(ROUND(AC1405, 0))+0.0625" 
Range("R1406").Formula = "=(ROUND(AC1406, 0))+0.0625" 
Range("R1407").Formula = "=(ROUND(AC1407, 0))+0.0625" 
Range("R1408").Formula = "=(ROUND(AC1408, 0))+0.0625" 
Range("R1409").Formula = "=(ROUND(AC1409, 0))+0.0625" 
Range("R1410").Formula = "=(ROUND(AC1410, 0))+0.0625" 
Range("R1411").Formula = "=(ROUND(AC1411, 0))+0.0625" 
Range("R1412").Formula = "=(ROUND(AC1412, 0))+0.0625" 
Range("R1413").Formula = "=(ROUND(AC1413, 0))+0.0625" 
Range("R1414").Formula = "=(ROUND(AC1414, 0))+0.0625" 
Range("R1415").Formula = "=(ROUND(AC1415, 0))+0.0625" 
Range("R1416").Formula = "=(ROUND(AC1416, 0))+0.0625" 
Range("R1417").Formula = "=(ROUND(AC1417, 0))+0.0625" 
Range("R1418").Formula = "=(ROUND(AC1418, 0))+0.0625" 
Range("R1419").Formula = "=(ROUND(AC1419, 0))+0.0625" 
Range("R1420").Formula = "=(ROUND(AC1420, 0))+0.0625" 
Range("R1421").Formula = "=(ROUND(AC1421, 0))+0.0625" 
Range("R1422").Formula = "=(ROUND(AC1422, 0))+0.0625" 
Range("R1423").Formula = "=(ROUND(AC1423, 0))+0.0625" 
Range("R1424").Formula = "=(ROUND(AC1424, 0))+0.0625" 
Range("R1425").Formula = "=(ROUND(AC1425, 0))+0.0625" 
Range("R1426").Formula = "=(ROUND(AC1426, 0))+0.0625" 
Range("R1427").Formula = "=(ROUND(AC1427, 0))+0.0625" 
Range("R1428").Formula = "=(ROUND(AC1428, 0))+0.0625" 
Range("R1429").Formula = "=(ROUND(AC1429, 0))+0.0625" 

現在,讓我清楚,這個代碼工作,因爲我想它。可能很明顯,我在一列中取一個數字範圍,將它們全部舍入到最接近的整數,然後添加十六分之一,並在不同列中表示這些值。

然而

我覺得這可能是更少的代碼「好」的執行,我想成爲一個更有效率的程序員,所以我儘量把它寫像這樣:

Dim X As Integer 
For X = 1400 To 1429 
    Range("R" & X).Formula = "=(ROUND(""AC"" "&X", 0))+0.0625" 
Next X 

但是這個(以及我試過的變化)都會拋出'1004'錯誤或語法錯誤。我所做的大部分改變都與引號及其位置有關,然後我也試着從這些問題實施建議herehere,here,here,here,但他們都沒有提供相當的我正在尋找的解決方案,或者在我的經驗不足的情況下對我沒有意義。

這是可能的(可能),我的搜索沒有包含我正在尋找正確的空話,但是這可能是因爲我剛纔把我的第一個嘗試在VBA與此:)

感謝任何幫助或參考。這是我在StackOverflow上的第一個問題,但你們這些人肯定教會了我幾乎所有我知道的關於編碼的知識。

+3

你不需要循環。改用這個:'Range(「R1400:R1429」)。Formula =「=(ROUND(AC1400,0))+ 0.0625」'。順便說一句,錯誤發生,因爲你已經錯過'&'''''''''後'''''AC'周圍不需要引號:'「=(ROUND(AC」&X&「,0))+ 0。0625「' –

+0

只是爲了解釋Simoco的優秀解決方案:VBA可以在一個操作中將單個公式應用於整個單元格範圍內,當這樣做時,就像在普通Excel中將單個公式向下複製單元格一樣,它會根據公式與複製「= SUM(A2:D2)」相比,引用的哪些位用「$」符號固定,哪些位不是(例如複製「= SUM($ A $ 2:$ D $ 2)左單元始終是'錨'單元,所以在這種情況下,將'AC1400'分配到一個範圍會自動適當調整,以對應每一行來表示'AC1401','AC1402'等等。 –

+0

@simoco,這就是它,nixing for循環比我所要做的更有效率,如果你提交這個答案,我會很樂意接受它。 –

回答

3

正如我在評論中提到上面,你不需要循環,你可以簡單地使用:

Range("R1400:R1429").Formula = "=(ROUND(AC1400, 0))+0.0625" 

Excel中會適當調整公式的每一行,所以你會:

  • R1400=(ROUND(AC1400, 0))+0.0625
  • R1401=(ROUND(AC1401, 0))+0.0625
  • .....
  • in R1429公式=(ROUND(AC1429, 0))+0.0625
2

您需要將Range函數中的X值作爲字符串強制轉換。您可以使用相同的技術將引用的單元格的值直接傳遞給ROUND,而不是傳遞單元格引用。我不知道這是否有進步,但這是我的第一本能。

Range("R" & CStr(X)).Formula = "=(ROUND(" & Range("AC" & CStr(X)).Value & ", 0))+0.0625" 

正如@simoco指出的,你根本不必使用循環。但是如果你仍然想要,或者將來遇到類似的問題,上述應該可以工作。

+0

你正在幫助證明這個網站的價值。這很好理解。如上所述,當我獲得許可時,我會加倍努力。 –