【问题标题】:Excel VBA Conditional, Dynamic Worksheet ReferenceExcel VBA 条件、动态工作表参考
【发布时间】:2019-04-29 09:35:49
【问题描述】:

我对 VBA 很陌生,并且正在编写代码以使用大量“if”语句插入带有公式的可变数量的新行。行插入工作正常,但我正在努力插入公式。我目前正在使用类似于下面的代码插入行:

Sub InsertRow()

'Establish variable for search range
Dim i As Range
Dim cell As Range
Set i = Range("B:B")
For Each cell In i.Cells

'Manual input for conductor count search and insert amount below
If cell.Value = "4-1/C" Then
cell.Offset(1).EntireRow.Resize(3).Insert
End If

Next

End Sub

我的问题:A 列中的值直接引用了我想要引用单元格的选项卡名称(例如,A1 将是“Sheet2”)。我想在 Sheet1 的 R 列中插入一个公式,以从 Sheet2 的单元格 A22 中提取值。对于其余插入的列,我想从 Sheet2 插入 A23,从 Sheet2 插入 A24 等。这是我正在尝试做的图像。我隐藏了不适用的列。 https://i.stack.imgur.com/pqiUy.jpg

我一直在尝试使用偏移量和 R[0]C[-2] 函数,但我承认我很迷茫。使用 excel 间接函数(不是 VBA),我可以使用 =INDIRECT("'"&$A$1&"'!A22") 提取这些值,但我无法在 VBA 中提取这些值。

提前感谢您的帮助

【问题讨论】:

  • 在 VBA 之外,你有公式工作吗?或者您是否在寻求有关公式的帮助,然后也在 VBA 中?
  • 谢天谢地,手动输入 excel 时间接引用工作正常,所以我只是在寻找 VBA 帮助。 VBA 的公式不同。我在 excel 中引用工作表的方式使用撇号 ('),但这会将 VBA 中的公式变成注释。到目前为止,我尝试过的所有其他事情都同样没有结果。
  • 您是否尝试打开宏记录器,输入您的公式,然后检查它生成的代码?另外,请发布适用于您的 OP 的公式。
  • 一个例子: Range("H404").Select ActiveCell.FormulaR1C1 = "=INDIRECT(""'""&R404C4&""'!A22"")" Range("H405").Select老实说,我什至不知道你可以录制宏。我猜这个行/列引用是静态的,它需要单元格处于活动状态。有什么建议吗?
  • 为清楚起见,上面的代码来自不同的、更混乱的工作簿,因此列引用略有不同。很抱歉有任何混淆。

标签: excel vba dynamic reference worksheet


【解决方案1】:

根据您的屏幕截图假设引用并对所有内容进行硬编码:

Range("R1").Formula = "=INDIRECT(""'""&A1&""'!A22"")"
Range("R1:R8").FillDown

【讨论】:

  • 当使用此方法更改 A 列中的值时,我仍然无法更新间接引用。例如,间接公式将需要引用第 5-8 行的单元格 A5。我知道我可以硬输入范围并重新输入您建议的代码,但是由于我要插入可变数量的行,因此我会以这种方式遇到问题。有没有更好的方法来引用公式插入中的相关单元格?
【解决方案2】:

我想通了。我试图使用 .Formula 而不是 .Value 我也不知道宏记录器。感谢布鲁斯为我指明了正确的方向。只需要为我的所有行插入“IF”语句循环生成的代码:

Sub test()
    Dim x As Long
    Dim firstRow As Long
    firstRow = 1
    Dim lastRow As Long
    With ActiveSheet
        lastRow = .Range("B2").End(xlDown).Row
        For x = lastRow To firstRow Step -1
            If .Range("B" & x).Value = "4-1/C" Then
                .Range("B" & x).Offset(0, 15).Value = "=INDIRECT(""'""&RC[-16]&""'!A22"")"
                .Range("B" & x).Offset(1, 15).Value = "=INDIRECT(""'""&R[-1]C[-16]&""'!A23"")"
                .Range("B" & x).Offset(2, 15).Value = "=INDIRECT(""'""&R[-2]C[-16]&""'!A24"")"
                .Range("B" & x).Offset(3, 15).Value = "=INDIRECT(""'""&R[-3]C[-16]&""'!A25"")"
                .Range("B" & x).Offset(0, 16).Value = "=INDIRECT(""'""&RC[-17]&""'!J22"")"
                .Range("B" & x).Offset(1, 16).Value = "=INDIRECT(""'""&R[-1]C[-17]&""'!J23"")"
                .Range("B" & x).Offset(2, 16).Value = "=INDIRECT(""'""&R[-2]C[-17]&""'!J24"")"
                .Range("B" & x).Offset(3, 16).Value = "=INDIRECT(""'""&R[-3]C[-17]&""'!J25"")"    
            End If
        Next
    End With
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多