2014-03-27 60 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

你正在帮助证明这个网站的价值。这很好理解。如上所述,当我获得许可时,我会加倍努力。 –