1

我的问题是:

如果单选按钮打开,我希望能够使用宏来复制和计算一系列单元格的公式。
但我不知道如何在公式中设置变量。下面的宏应将公式复制到显示的范围(I12:I252,K12:K252,M12:M252)。
公式本身包括 C12:C252 和 B12:B252 范围内的两个单元格的减法。我似乎无法引用这些单元格。我认为这就是问题所在...

无论如何,它不起作用。任何帮助将不胜感激。

谢谢!

Dim shp1 As Shape
Dim shp2 As Shape
Dim i As Long

On Error Resume Next
Set shp1 = Worksheets("Worksheet").Shapes("Button 1")
Set shp2 = Worksheets("Worksheet").Shapes("Button 2")

If shp1.ControlFormat.Value = xlOn Then
    MsgBox "Auto Calculating"
    For i = 12 To 252
        Range("I" & i).Formula = "=IFERROR(((C & i)-(B & i))*I6/(E7-E6);"")"
        Range("K" & i).Formula = "=IFERROR(((C & i)-(B & i))*J6/(E7-E6);"")"
        Range("M" & i).Formula = "=IFERROR(((C & i)-(B & i))*K6/(E7-E6);"")"
    Next i

Else

    If shp2.ControlFormat.Value = xlOn Then
        MsgBox "Manually insert calculation"

    End If
End If
4

1 回答 1

2

一些改进:

  1. ;将公式中的替换为,;是您的本地设置,但.Formula使用英语设置!
  2. 如果你想引用每一列,你需要把i引号放在外面,即而不是=IFERROR(((C & i)...=IFERROR(((C" & i & ")...
  3. 无需循环每个单元格并设置公式。如果您$在公式中正确使用,您可以用一个公式替换所有内容:=IFERROR(($C12-$B12)*I$6/($E$7-$E$6),"")
  4. 更好地使用.FormulaR1C1- 这样,当您将公式应用于其他范围时,您的公式也将起作用。要轻松转换公式,通常将其键入单元格并? Selection.FormulaR1C1在 VBA 即时窗口中运行。上式转化为=IFERROR((RC3-RC2)*R6C/(R7C5-R6C5),"")
  5. 不要硬编码单元格引用(在您的情况下I12:K252)。最好将此范围分配给命名范围并将其用作参考。这样,如果您稍后添加/删除行或列,您的代码也将起作用。
  6. 不要使用On Error Resume Next!这是一个监督应该修复的错误的邀请
  7. 可选:除了直接在 VBA 中访问控件之外,您还可以将每个控件分配给一个单元格,将该单元格命名为步骤 4 中的名称,并以此名称引用。使您的代码更灵活/更简单!

总而言之,我最终得到:

Public Sub YourSub()
    If Range("SwitchOne") Then
        Range("YourRange").FormulaR1C1 = _
            "=IFERROR((RC3-RC2)*R6C/(R7C5-R6C5),"""")"
    Else
        If Range("SwitchTwo") Then
            MsgBox "Manually insert calculation"
        End If
    End If
End Sub
于 2013-11-15T09:36:29.620 回答