【问题标题】:Referencing cells with index使用索引引用单元格
【发布时间】:2020-05-05 17:21:41
【问题描述】:

我正在努力解决可能是一个简单的问题,但谷歌并没有帮助我。

    With Worksheets("Fake").Range("A5:BE5")
    Set GrandTotal = .Find("Grand Total", LookIn:=xlValues)
    If Not GrandTotal Is Nothing Then
        GrandTotal = GrandTotal.Address
        GrandTotalColumn = Range(GrandTotal).Column
        GrandTotalColumnLetter = Split(Cells(1, GrandTotalColumn + 1).Address, "$")(1)
        Debug.Print GrandTotal
        Debug.Print GrandTotalColumn
        Debug.Print GrandTotalColumnLetter
    End If
    End With


    Cells(9, GrandTotalColumn + 1).Select
    ActiveCell.FormulaR1C1 = _
        "=IF(RC[-21]="""","""",IF(ISNUMBER(SEARCH(""total"",RC[-21])),"""",RC[-22]))"

    Cells(9, GrandTotalColumn + 1).Select
    Selection.Copy
    Debug.Print GrandTotalColumnLetter
    With Worksheets("Fake")
    .Range(.Cells(9, GrandTotalColumn + 1), .Cells(10000, GrandTotalColumn + 1)).Select
'ERROR HERE
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False

    .Range(.Cells(9, GrandTotalColumn + 1), .Cells(10000, GrandTotalColumn + 1)).Select
    Application.CutCopyMode = False
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    End With

但显然它不起作用...我如何引用这个..? 我也尝试过获取“GrandTotalColumnLetter”,但我仍然不知道如何将其插入到要选择的范围中,即使我知道如何获取列号和字母..

【问题讨论】:

  • (不是我的 DV)但我真的建议你阅读如何做 RangeCell 参考。 Cells 中有 3 个参数。
  • 使用offset ...
  • GrandTotal = GrandTotal.Address 没有意义,因为一个是范围,另一个是字符串,而且这一行是不必要的。
  • 我只是不太确定用谷歌搜索的正确方法是什么。我拥有的是一个动态列和一组静态行。因此,我尝试定位动态列,但现在我已经找到它,我似乎无法找出如何将我的列索引号与多行一起使用..
  • 这似乎是一个 X-Y 问题。您不需要复制/粘贴特殊。只需一步将公式写入整个范围。然后您可以在同一范围内调用.Value = .Value

标签: vba reference


【解决方案1】:

试试这个。它找到“Grant Total”所在的范围对象,然后使用列属性选择它旁边的范围(右侧的 1 列)。我将 GrandTotal 保留为一个范围,因此您的测试仍然以相同的方式工作。

好的,我对其进行了编辑以包含您的新代码。 这可以将 fromula 放入第 9 行到第 10,000 行的列中 你真的不需要像那样做所有的选择、复制和粘贴,但这是你的代码。 问题是您在选择第 1 行到第 10,000 行的范围后将公式放入“活动单元格”中,它只将公式放入第 1 行,而不是第 9 行。

With Worksheets("Fake")
    Set GrandTotal = .Range("A5:BE5").Find("Grand Total", LookIn:=xlValues)
    If Not GrandTotal Is Nothing Then
        .Range(.Cells(1, GrandTotal.Column + 1), .Cells(10000, GrandTotal.Column + 1)).Select

    End If
End With


    Cells(9, GrandTotal.Column + 1).FormulaR1C1 = _
        "=IF(RC[-21]="""","""",IF(ISNUMBER(SEARCH(""total"",RC[-21])),"""",RC[-22]))"

    Cells(9, GrandTotal.Column + 1).Select
    Selection.Copy
    Debug.Print GrandTotalColumnLetter
    With Worksheets("Fake")
    .Range(.Cells(1, GrandTotal.Column + 1), .Cells(10000, GrandTotal.Column + 1)).Select
'ERROR HERE
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False

    .Range(.Cells(9, GrandTotal.Column + 1), .Cells(10000, GrandTotal.Column + 1)).Select
    Application.CutCopyMode = False
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    End With

【讨论】:

  • 嗨,我更新了整个代码部分。我使用了你上面所做的,但我得到了运行时错误 1004,范围类的选择方法失败。基本上我有和你一样的变量,我在 With - End With 里面做了,但仍然不起作用
  • 只有在工作表处于活动状态时才能选择范围(而不是您可能需要选择它)。
  • 工作表处于活动状态,因为 Cells(9, GrandTotalColumn + 1).Select 实际上选择了正确工作表的单元格。
  • 我没有重写你所有的代码,但是这可以用几行代码完成。如果未找到总计,则会弹出很多错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多