首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VBA Selection.Find返回偏移量单元格

VBA Selection.Find返回偏移量单元格
EN

Stack Overflow用户
提问于 2020-09-29 14:45:39
回答 2查看 120关注 0票数 0

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

我使用的代码如下:

代码语言:javascript
复制
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

任何意见都将非常感谢,谢谢。

EN

回答 2

Stack Overflow用户

发布于 2020-09-29 15:31:10

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

代码语言:javascript
复制
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现在将比以前低一行。然而,我很多次都弄错了。因此,我总是测试哪一行是旧的,哪一行是新的。这并不难--而且总是一样的。

票数 0
EN

Stack Overflow用户

发布于 2020-09-29 17:15:48

我已经找到了解决方案。

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

感谢你们所有人的输入,并帮助我清理代码:)

令人惊讶的是,你怎么可以花几个小时看着某个东西,结果却发现答案就在你面前。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64114235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档