Excel公式(VBA)中从绝对引用到相对引用的更改

不幸的是我找不到下面的答案在其他问题 – 我的问题是复制和粘贴公式,将使用相对单元格引用,而不是dynamic的。

我正在处理的工作簿的一般问题是,它包含几个不同的工作表,可能会发生dynamic范围变化。 给一个更好的概述:

  • 公式必须在的列是基于一个偏移单元格 – 我不能给它一个静态值 – 并在第2行开始;
  • 公式本身如下: =CONCATENATE(LEFT(AA2,13), “:”, RIGHT(AA2,5) (和要连接的值将始终出现在AA列中)

macros应该将公式插入到偏移单元格中,将其复制并粘贴到整个列中,因此第3行中的单元格指向单元格AA3等等。

 Sub Copy1() Range("A1").Select Range(Selection, Selection.End(xlToRight)).Select Selection.End(xlToRight).Select ActiveCell.Offset(, 1).Select Dim rng as Range Set rng = ActiveCell rng.Select rng.Offset(1, 0).Select ActiveCell.FormulaR1C1 = "=CONCATENATE(LEFT(R2C27,13), "":"", RIGHT(R2C27,5))" rng.Offset(1, 0).Select Selection.Copy Range(Selection, Selection.End(xlDown)).Select ActiveSheet.PasteSpecial Selection.EntireColumn.Select Application.CutCopyMode = False End Sub 

问题是 – 在尝试插入单元格的确切名称时,macros将使用以下内容填充它:

 =CONCATENATE(LEFT('AA2',13), "":"", RIGHT('AA2',5)) 

由于引号,公式不起作用。

使用参考R2C27结果与绝对值被复制,因此列中的每个单元格指的是单元格AA2

有没有可能使它创build,复制和粘贴相对引用而不是绝对的?

如果复制+粘贴公式或将其分配给多个单元格,则通常不需要R1C1引用,因为相对引用是自动调整的。 例如:

 Range("A2:A9").Formula = "=CONCATENATE(LEFT(AA2,13), "":"", RIGHT(AA2,5)" 

如果我明白你想列参考总是$AA (绝对),而行参考是相对的。 你可以试试这个:

 ActiveCell.Formula = "=CONCATENATE(LEFT($AA2,13), "":"", RIGHT($AA2,5))" 

然后自动填充将自动调整行号,同时保持列“$ AA”。

这就是说,重构你的代码来摆脱select东西。 看看除了使用“显式引用”(只需用您的工作表的实际名称replace“Sheet1”)之外,它将变得更短:

 Sub Copy1() Dim rng As Range Set rng = Worksheets("Sheet1").Range("A1").End(xlToRight).Offset(1, 1) rng.Formula = "=CONCATENATE(LEFT($AA2,13), "":"", RIGHT($AA2,5))" rng.Copy rng.Parent.Range(rng, rng.End(xlDown)) End Sub