Vba 将包含连接部分的公式写入单元格

Vba 将包含连接部分的公式写入单元格,vba,excel,Vba,Excel,场景:我有一个代码,可以将公式写入工作表单元格。此公式用于API检索某些值。我的公式在一个循环中(这是对多列执行的),并引用第一行作为标识符 原始公式: =FS(B1;"FI(DATE,,DATE)") For i = 1 To lColumn If wb.Worksheets("Dates").Cells(i, 1).Value <> "" Then wb.Worksheets("Dates").Cells(i,2).value = "=FS(" &

场景:我有一个代码,可以将公式写入工作表单元格。此公式用于API检索某些值。我的公式在一个循环中(这是对多列执行的),并引用第一行作为标识符

原始公式:

=FS(B1;"FI(DATE,,DATE)")
For i = 1 To lColumn
    If wb.Worksheets("Dates").Cells(i, 1).Value <> "" Then
        wb.Worksheets("Dates").Cells(i,2).value = "=FS(" & i & "1;"FI(DATE,,DATE)")"
    End If
Next i
带有浮动引用的修改公式(在循环内部):

=FS(B1;"FI(DATE,,DATE)")
For i = 1 To lColumn
    If wb.Worksheets("Dates").Cells(i, 1).Value <> "" Then
        wb.Worksheets("Dates").Cells(i,2).value = "=FS(" & i & "1;"FI(DATE,,DATE)")"
    End If
Next i

等等。但错误依然存在

问题:进行此操作的正确方法是什么

wb.Worksheets("Dates").Cells(i,2).formula = "=FS(" & Cells(1, i).Address(0,0) & ";""FI(DATE,,DATE)"")"
可能有更好的方法将列号转换为字母(这是您遇到的问题,还有双引号)


可能有更好的方法将列号转换为字母(这是您遇到的问题,还有双引号)

在VBA中使用公式有点棘手:

  • 要编写公式,请使用
    range.formula
    属性,而不是
    .value

  • 你必须像使用英语Excel一样编写公式。参数分隔符是逗号(不是分号)

  • 如果公式需要引号,请将其加倍,以便VBA编译器理解您需要字符串中的引号
  • 我发现在分配变量之前将公式写入变量是很有帮助的——您可以在调试器中检查它在分配变量之前是否正确
  • 要检查公式的外观,请将其写入单元格,切换到VBA编辑器,打开即时窗口并写入
    ?activecell.formula
Try(未经测试,因为您需要的公式对我们无效):


在VBA中使用公式有点棘手:

  • 要编写公式,请使用
    range.formula
    属性,而不是
    .value

  • 你必须像使用英语Excel一样编写公式。参数分隔符是逗号(不是分号)

  • 如果公式需要引号,请将其加倍,以便VBA编译器理解您需要字符串中的引号
  • 我发现在分配变量之前将公式写入变量是很有帮助的——您可以在调试器中检查它在分配变量之前是否正确
  • 要检查公式的外观,请将其写入单元格,切换到VBA编辑器,打开即时窗口并写入
    ?activecell.formula
Try(未经测试,因为您需要的公式对我们无效):


什么是浮动引用?@vityta“i”,因为它在循环中发生变化。你能看看这里并尝试执行这些步骤吗?什么是浮动引用?@vityta“i”,因为它在循环中发生变化。你能看看这里并尝试执行这些步骤吗?而不是使用replace,考虑使用<代码>地址>代码>返回一个相对引用(即没有代码> $>代码>)感谢@克里斯尼尔森,没有意识到这一点。将更新我的答案:0)不要将公式写入
.value
-使用
.formula
instead@FunThomas. 你说得很对。我太专注于右手了!而不是使用替换,考虑使用<代码>地址>代码>返回一个相对引用(即没有代码> $>代码>)感谢@克里斯尼尔森,没有意识到这一点。将更新我的答案:0)不要将公式写入
.value
-使用
.formula
instead@FunThomas. 你说得很对。我太专注于右手了!我认为应该是
adr=cells(1,I).address(false,false)
,因为改变的是列,而不是row@Pi:可能你是对的-从OP复制了这一部分。我认为应该是
adr=cells(1,I).address(false,false)
,因为它是正在更改的列,不是row@Pi:可能你是对的-从OP复制了此部分。
wb.Worksheets("Dates").Cells(i,2).formula = "=FS(" & Cells(1, i).Address(0,0) & ";""FI(DATE,,DATE)"")"
with wb.Worksheets("Dates")
  dim f as string, adr as string
  adr = cells(i, 1).address(false, false)   ' get rid of Dollar signs
  f = "=FS(" & adr & ",""FI(DATE,,DATE)"")"
  .Cells(i, 2).formula = f
end with