我的代码有问题。我试图通过使用find函数来识别正确的行号来将值插入到“数据库”中。当我运行代码时,find函数返回下一个行号ie。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任何意见都将非常感谢,谢谢。
发布于 2020-09-29 15:31:10
我重写了您的代码,以消除对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现在将比以前低一行。然而,我很多次都弄错了。因此,我总是测试哪一行是旧的,哪一行是新的。这并不难--而且总是一样的。
发布于 2020-09-29 17:15:48
我已经找到了解决方案。
在搜索开始之前,我错误地清除了用作搜索名称的单元格的内容。这将导致搜索空单元格。
感谢你们所有人的输入,并帮助我清理代码:)
令人惊讶的是,你怎么可以花几个小时看着某个东西,结果却发现答案就在你面前。
https://stackoverflow.com/questions/64114235
复制相似问题