为什么Excel VBA Range.Find返回不正确的值?

为什么Excel VBA Range.Find返回不正确的值?,excel,vba,Excel,Vba,我在VBA中有一个子系统,它查看工作表中的一个关键列,并根据该列中的值从文本文件中提取一个值。列A有一系列从110到717的3位数字,总共80个值。我将Range设置为(“a:a”),然后使用Range.find搜索文本文件中的键值。范围中的第一个单元格为A1,值为110。Range.Find为此值返回A6。我不确定在一行或两行代码的空间中会发生什么,导致这种情况。知道我做错了什么吗 这是我的潜艇。这是我的全部代码 Sub DoTheWork() Dim wb As Workbook Dim w

我在VBA中有一个子系统,它查看工作表中的一个关键列,并根据该列中的值从文本文件中提取一个值。列A有一系列从110到717的3位数字,总共80个值。我将Range设置为(“a:a”),然后使用Range.find搜索文本文件中的键值。范围中的第一个单元格为A1,值为110。Range.Find为此值返回A6。我不确定在一行或两行代码的空间中会发生什么,导致这种情况。知道我做错了什么吗

这是我的潜艇。这是我的全部代码

Sub DoTheWork()
Dim wb As Workbook
Dim ws As Worksheet
Dim FSO As Object
Dim TF As Object
Dim TextFile
Dim TextLine
Dim TextLines As Variant
Dim x As Integer
Dim Code As String
Dim PurposeCode As Range
Dim SearchArea As Range
Dim CurrentRow As Integer
Dim KeyRow As Integer
Dim i As Integer


Set wb = Application.ActiveWorkbook
Set ws = ActiveWorkbook.Sheets(2)
TextFile = Application.GetOpenFilename("Text Files (*.txt), *.txt")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TF = FSO.OpenTextFile(TextFile, 1)
TextLine = TF.ReadAll
TF.Close
TextLines = Split(TextLine, vbCrLf)
Set PurposeCode = ws.Range("A:A")
For x = 0 To UBound(TextLines, 1)
    Code = Right(Left(TextLines(x), 4), 3)
    If IsNumeric(Code) Then
        Code = CInt(Code)
        Set SearchArea = PurposeCode.Find(Code, , xlValues, xlPart, xlByRows, xlNext)
        If Not SearchArea Is Nothing Then
            KeyRow = SearchArea.Row
            Cells(KeyRow, 2).Value = Code
        End If
    End If
Next
End Sub
样本输出:

谢谢

编辑以显示文本文件的内容:

 110     17     0.25
 111      1     0.01
 113      5     0.06
 115      3     0.03
 120    582     8.77
 121                
 140   3,053   45.02
因此,我打开文本文件,将所有行读入一个数组,然后取文件前4个字符中的三位数,并将其与sheet2电子表格中相同的三位数代码进行匹配。我只使用sheet2,所以在设置ws时指定了sheet2


我确实改成了
ws.Cells(KeyRow,2).Value=code
,这没有什么区别。

经过更多的研究,特别是创建了一个函数来返回我在评论中提到的工作表名称,我发现这个工作簿上有很多隐藏的工作表,sheet2是2004年的一张工作表,编号相同,但第一行有5个标题行,这导致我的搜索结果偏移了5。

我没有得到该输出,但得到了正确的输出。您的搜索代码正在查看第二张工作表,但您的结果放在列表(或其他列表)所在的另一张工作表上处于不同的位置。。。最好不要在没有合格工作表对象的情况下使用单元格/区域。例如,您应该使用
ws.Cells(KeyRow,2).Value=code
…至少这是我对问题的最佳猜测…我发现当我指定
ws=wb.Worksheets(“2018”)
而不是
Sheets(2)
Worksheets(2)
时,搜索工作正常。这不是非常有用,因为这意味着有人需要维护此表,并随着时间的推移进行更新。