问题描述
我的代码有问题。我试图通过使用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现在将比以前低一行。但是,我错了很多遍了。因此,我总是测试哪一行是旧的,哪一行是新的。这并不困难,而且总是一样。
我找到了解决方法。
在搜索开始之前,我错误地清除了用作搜索名称的单元格的内容。这导致搜索一个空单元格。
感谢大家进行输入,并帮助我清理代码:)
多么令人惊奇的是,您花几个小时去看某件事,却发现答案就在您眼前。