【问题标题】:Using .Find as a range in VBA在 VBA 中使用 .Find 作为范围
【发布时间】:2023-04-07 21:56:01
【问题描述】:

我想沿着一行搜索以找到一个字符串单元格条目“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

【问题讨论】:

  • 哪一行显示错误?

标签: excel vba find range


【解决方案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 中输入我想要的列数量并运行宏时,代码实际上并没有做任何事情 - 有什么建议吗?
  • 正如我所说,我不明白你的代码的逻辑。使用调试器并单步执行代码,检查 aCount 和 bCol 的值以及代码的具体作用(以及与您期望的不同之处)。
  • 所以你在 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
猜你喜欢
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多