vba语言中find 的用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vba语言中find 的用法相关的知识,希望对你有一定的参考价值。

各位高手,在使用EXCEL中的VBA时,遇到了用find找不到的问题。程序如下:
明明刚从第19列中把一个值给了mytmpcell,但又从此列中找到与mytmpcell的value相同的单元格,就找不到了。
并且,刚开始调试的时候还能够找到的。请帮忙解决一下。有分送的哟!
For j = 5 To worksub.Columns(19).Rows.Count '开始填写对应的单元格
Set mytmpcell = .Cells(j, 19)
If mytmpcell.Value <> "" Then
.Cells(j, 21).Value = .Cells(j, 19).Value
.Columns(22).Value = .Columns(19).Value
Set mycell = worksub.Columns(19).Find(What:=mytmpcell.Value, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, MatchByte:=False, SearchFormat:=False)

If Not (mycell Is Nothing) Then
If mytmpcell.Row = mycell.Row Then

sht4.Cells(i, 17).Value = .Cells(mycell.Row, 19).Value
sht4.Cells(i, 4).Value = .Cells(mycell.Row, 14).Value
sht4.Cells(i, 5).Value = .Cells(mycell.Row, 15).Value
sht4.Cells(i, 6).Value = .Cells(mycell.Row, 13).Value
sht4.Cells(i, 8).Value = .Cells(mycell.Row, 2).Value
sht4.Cells(i, 9).Value = .Cells(mycell.Row, 4).Value
sht4.Cells(i, 10).Value = .Cells(mycell.Row, 3).Value
sht4.Cells(i, 11).Value = .Cells(mycell.Row, 20).Value
sht4.Cells(i, 2).Value = .Cells(mycell.Row, 16).Value
sht4.Cells(i, 3).Value = .Cells(mycell.Row, 17).Value
sht4.Cells(i, 7).Value = mygx
i = i + 1

End If

End If

End If
Set mycell = Nothing
Set mytmpcell = Nothing
Next j
刚开始以为Find中的默认值不对,但我把其他的参数都设置了,也找不到呀。运行时找到的结果为nothing.

你的算法有问题,不知道你要的目的是什么?
Set mycell = worksub.Columns(19).Find(mytmpcell.Value, , xlWhole)
一般只要整个匹配就行了,其它参数都可以省略。
如果全部是数字型 的,就可以写成
Set mycell = worksub.Columns(19).Find(mytmpcell.Value,xlValues)
建议你到论坛发帖:http://www.38duoffice.cn/bbs/
我在那等你,上传附件
参考技术A 办公软件程序设计 参考技术B 把表格发到yymhy@163.com看一下。

在 VBA 中使用 .Find 作为范围

【中文标题】在 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,这并不总是您想要的)。并使用 &amp; 进行字符串连接,而不是 +

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 的用法的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA中for循环语句的用法

Excel VBA中for循环语句的用法

vba中 find函数每个参数的详细解释

C语言再学习 -- Linux下find命令用法

关于VBA的Find函数

EXCEL VBA,为啥函数子过程中不能使用find方法。