微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

VBA选择查找返回偏移量单元格

如何解决VBA选择查找返回偏移量单元格

我的代码有问题。我试图通过使用find函数来标识正确的行号,将值插入“数据库”中。当我运行代码时,find函数返回下一个行号,即。 Serchname在第300行中,但数据插入在301行中。

我正在使用的代码如下:

For Each Cell In Workbooks(controlfile).Sheets("Lab").Range("B9:B56")
    If Cell.Value <> "" Then
        
'Range("N" & latestRow).Value = Right(DataArray(1),4) & Right(DataArray(2),4)
'Range("N" & latestRow).NumberFormat = "00000000"
        
        
        
        
        søgeOrd = Right(Cell.Value,4) & Right(Cell.Offset(0,1),4)
        Workbooks(controlfile).Sheets("Lab").Range("A1").Value = søgeOrd
        Workbooks(controlfile).Sheets("Lab").Range("A1").NumberFormat = "00000000"
        LinjeL = Cell.Row
        FGM = Workbooks(controlfile).Sheets("Lab").Range("F" & LinjeL).Value
        STA = Workbooks(controlfile).Sheets("Lab").Range("I" & LinjeL).Value
        BMK = Workbooks(controlfile).Sheets("Lab").Range("J" & LinjeL).Value
        VK = Workbooks(controlfile).Sheets("Lab").Range("L" & LinjeL).Value
        DP = Workbooks(controlfile).Sheets("Lab").Range("M" & LinjeL).Value
        SNB = Workbooks(controlfile).Sheets("Lab").Range("N" & LinjeL).Value
        Workbooks(controlfile).Sheets("Lab").Range("A1").ClearContents
        
        
        
        
        'find søgeord i database og indsæt de værdier som er fundet i lab
       
        Workbooks(FileName).Sheets("Database").Activate
        Columns("N:N").Select
        Set cellD = Selection.Find(What:=Workbooks(controlfile).Sheets("Lab").Range("A1").Value,After:=ActiveCell,LookIn:=xlFormulas,_
        LookAt:=xlWhole,SearchOrder:=xlByRows,SearchDirection:=xlNext,_
        MatchCase:=False,SearchFormat:=False)
        
        If Not cellD Is nothing Then LinjeD = cellD.Row
               
       
        If Range("E" & LinjeD).Value <> "" Then
        
        'kopier alle data til fejllog hvis der allerede er data
        Range("A" & LinjeD).Select
        ActiveCell.EntireRow.copy
        Workbooks(FileName).Worksheets("Fejllog").Activate
        LastLine = Workbooks(FileName).Sheets("Fejllog").Range("A" & Rows.Count).End(xlUp).Offset(1,0).Row
        Range("A" & LastLine).PasteSpecial
        
        Application.CutcopyMode = False
        
        
        Workbooks(FileName).Sheets("Database").Activate
        
        Range("E" & LinjeD).Value = FGM
        Range("H" & LinjeD).Value = STA
        Range("I" & LinjeD).Value = BMK
        Range("O" & LinjeD).Value = Format(Now,"dd.mm.yyyy")
        Range("P" & LinjeD).Value = VK
        Range("Q" & LinjeD).Value = DP
        Range("R" & LinjeD).Value = SNB
        
        Workbooks(controlfile).Sheets("Lab").Activate
        
        Else
        
        Range("E" & LinjeD).Value = FGM
        Range("H" & LinjeD).Value = STA
        Range("I" & LinjeD).Value = BMK
        Range("O" & LinjeD).Value = Format(Now,"dd.mm.yyyy")
        Range("P" & LinjeD).Value = VK
        Range("Q" & LinjeD).Value = DP
        Range("R" & LinjeD).Value = SNB
        
         Workbooks(controlfile).Sheets("Lab").Activate

        End If
        
    End If
Next Cell

非常感谢您的任何投入。

解决方法

我重新编写了您的代码,以消除对Selection对象的使用。

Private Sub Snippet()

    Dim WsDb        As Worksheet
    Dim ClmN        As Range
    Dim cellID      As Range
    Dim What        As Variant
    Dim LineID      As Long
    
    What = Workbooks(controlfile).Sheets("Lab").Range("A1").Value
    Set WsDb = Workbooks(Filename).Sheets("Database")
    Set ClmN = WsDb.Columns("N:N")
    Set cellD = ClmN.Find(What:=What,After:=ActiveCell,_
                          LookIn:=xlFormulas,LookAt:=xlWhole,_
                          SearchOrder:=xlByRows,SearchDirection:=xlNext,_
                          MatchCase:=False,SearchFormat:=False)
        
    If Not cellD Is Nothing Then LinjeD = cellD.Row
End Sub

观察现在如何通过声明变量来完成在其上进行搜索的工作表的定义。现在,该代码将在后台平稳运行,而不会出现屏幕闪烁。

现在,您可以怪我破坏对ActiveCell的引用。我真的吗激活 Database 标签时,代码中哪个单元格处于活动状态?可能是任何人或没有。现在,代码将崩溃,因为ActiveCell不在ClmN范围内。显然,您需要在该范围内指定一个单元格才能开始搜索。

cellID范围是否在找到What的地方以外的其他行开始?我对此表示怀疑,您也没有主张。您说在LineID以外的其他位置插入了一行。这是正常现象,与插入行的操作有关,与您发布的代码无关。从逻辑上讲,新行应代替您指定的行。因此,cellId.Row现在将比以前低一行。但是,我错了很多遍了。因此,我总是测试哪一行是旧的,哪一行是新的。这并不困难,而且总是一样。

,

我找到了解决方法。

在搜索开始之前,我错误地清除了用作搜索名称的单元格的内容。这导致搜索一个空单元格。

感谢大家进行输入,并帮助我清理代码:)

多么令人惊奇的是,您花几个小时去看某件事,却发现答案就在您眼前。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。