在 VBA 中使用 .Find 作为范围

Posted

技术标签:

【中文标题】在 VBA 中使用 .Find 作为范围【英文标题】:Using .Find as a range in VBA 【发布时间】:2022-01-11 16:53:38 【问题描述】:

我想沿着一行搜索以找到一个字符串单元格条目“Category 1”并从这一点插入一定数量的列(基于另一个单元格值)。然后,新列应具有“Category 2”、“Category 3”等标签。

到目前为止,我已经设法根据特定的列索引(而不是字符串单元格条目)对其进行编码,以便能够执行上述操作。但是,我一直在尝试对其进行修改,以便可以使用“Category 1”作为列插入的参考点。我下面的代码是我对此的尝试,但出现了“对象不支持此属性或方法”。在 .Find 函数上查看微软的建议页面时,它的代码与我使用的代码非常相似,所以我真的很难理解出了什么问题。

任何帮助将不胜感激!

Sub Add_Column()

    Dim aCount As Integer
    Dim a As Integer
    Dim bCol As Long
    Dim b As Long
    Dim c As Range

    aCount = Range("B12").Value
    bCol = Cells(15, Columns.Count).End(xlToLeft).Column

    With Worksheets(3)
        Set c = .Find("Category 1", LookIn:=xlValues)

        For a = 1 To aCount - 1
            For b = 1 To bCol
                c.Offset(0, 1).Insert Shift:=xlToRight
                Range("G15").Value = "Category" + Str(aCount - a + 1)
            Next b
        Next a
    End With

End Sub

【问题讨论】:

哪一行显示错误? 【参考方案1】:

工作表没有Find-方法,范围有。 所以命令应该是这样的:

Set c = .Cells.Find("Category 1", LookIn:=xlValues)

Cells 是一个 Range,包含工作表的所有个单元格)

我不了解您的代码逻辑的所有细节,但我假设Range("B12")Range("G15")Worksheets(3) 上?您应该限定所有范围(告诉 Excel 您指的是哪个工作表(否则使用 ActiveSheet,这并不总是您想要的)。并使用 & 进行字符串连接,而不是 +

With Worksheets(3)
    aCount = .Range("B12").Value
    bCol = .Cells(15, .Columns.Count).End(xlToLeft).Column

    Set c = .Cells.Find("Category 1", LookIn:=xlValues)

    For a = 1 To aCount - 1
        For b = 1 To bCol
            c.Offset(0, 1).Insert Shift:=xlToRight
            .Range("G15").Value = "Category" & Str(aCount - a + 1)
        Next b
    Next a
End With

【讨论】:

感谢托马斯的快速回复!用您的建议修改我的代码后,没有错误。不幸的是,当我在 B12 中输入我想要的列数量并运行宏时,代码实际上并没有做任何事情 - 有什么建议吗? 正如我所说,我不明白你的代码的逻辑。使用调试器并单步执行代码,检查 aCountbCol 的值以及代码的具体作用(以及与您期望的不同之处)。 所以你在 b12 中输入了一个 aCount 拾取的值。然后我们要循环遍历该值中的每个数字(从 1 到 aCount)并为每个数字创建一个新列。为此,我使用 c = .Find 查找“Category 1”并从那里偏移列以插入新列。即我找到了带有 c 对象的类别 1,然后在 for 循环中从该参考点偏移。 G15 只是标记新列的单元格引用。我猜代码的 b 部分实际上并不需要,但即使我删除了这些代码,代码仍然一无所获。 我应该使用 c.Address 来偏移范围吗? 现在试试,因为.Cells 被遗漏了,所以有一个错字。我怀疑它是否会起作用,因为您始终引用 G15。实际上b 循环看起来是多余的?【参考方案2】:

也许这行得通。

Sub x()

Dim aCount, bCol As Long, c As Range, a As Long

With Worksheets(3)
    aCount = .Range("B12").Value
    If Not IsNumeric(aCount) Then Exit Sub
    
    bCol = .Cells(15, .Columns.Count).End(xlToLeft).Column

    Set c = .Cells.Find("Category 1", LookIn:=xlValues)
    If c Is Nothing Then Exit Sub
    
    For a = 1 To aCount - 1
        c.Offset(0, a).Insert Shift:=xlToRight
        c.Offset(0, a).Value = "Category " & a + 1
    Next a
End With

End Sub

【讨论】:

我刚用过这个,什么也没发生。但是,当我取出 with Worksheets(3) 和 End With 时,代码有效,但仅适用于“类别 1”所在的行,而不适用于整个列 那么您可能引用了错误的表格。无论如何,使用名称而不是索引通常更安全。 啊,我之前一直在搞乱不同的工作表编号,但输入名称更有意义且有效!我现在使用 'y = c.Column' 来获取列索引,但你知道我如何在偏移函数的范围内使用它吗? c.Offset(0, a).entirecolumn.Insert Shift:=xlToRight

以上是关于在 VBA 中使用 .Find 作为范围的主要内容,如果未能解决你的问题,请参考以下文章

VBA - 创建“颜色检查范围”以反转循环

Excel公式中的VBA命名范围

如何使用 vba 选择粘贴范围

Excel VBA删除范围内的空白行

动态循环范围,VBA

在 VBA 中创建范围