Excel 循环无法添加缺少的行
我的循环有点问题。下面的代码应遍历Excel 循环无法添加缺少的行,excel,excel-2010,vba,Excel,Excel 2010,Vba,我的循环有点问题。下面的代码应遍历wksSource的行,在wksData中查找匹配项,更新值,并将wksData中未列出的任何行添加到目标表的底部wksData 它没有添加缺少的行,但我看不出为什么不添加 Public strsourceColA As String Public strsourceColB As String Public strsourceColC As String Public strsourceColD As String 'strin
wksSource
的行,在wksData
中查找匹配项,更新值,并将wksData
中未列出的任何行添加到目标表的底部wksData
它没有添加缺少的行,但我看不出为什么不添加
Public strsourceColA As String
Public strsourceColB As String
Public strsourceColC As String
Public strsourceColD As String
'string variables for contents of database rows
Public foundValueInA As String
Public foundValueInB As String
Public foundValueInC As String
Public foundValueInD As String
'Ranges
Public myRange As Range
Public myCell As Range
Public checkCell As Range
Public rngInput As Range
Public rngStart As Range, rngSource As Range, rngDest As Range
'Workbooks and sheets
Public wkbNonconbook As Workbook
Public wksSource As Worksheet, wksData As Worksheet
'Long
Public cLastFundRow As Long
Public rowNum As Long
Public startRow As Long
Public endRow As Long
Public checkRow As Long
'Boolean
Public blnisNCRnoMatching As Boolean
Public blnisPartnoMatching As Boolean
Public blnisSerialNoMatching As Boolean
Public blnisWorkorderMatching As Boolean
Public blnisRowMatching As Boolean
Sub update_row()
' update_row Macro
' looks to see if a row is already included on the main database.
'
'set workbooks and worksheets
Set wkbNonconbook = Application.Workbooks("ncrcon_test.xlsm")
Set wksSource = wkbNonconbook.Sheets("080114")
Set wksData = wkbNonconbook.Sheets("Data_base")
startRow = 4
checkRow = startRow
endRow = wksSource.Range("A1").Offset(wksSource.Rows.Count - 1, 0).End(xlUp).Row
Set rngInput = wksSource.Range("A" & startRow & ":A" & endRow)
For Each checkCell In rngInput.Cells
' Initialize strings to with column contents to be matched from update/source sheet
strsourceColA = checkCell.Offset(0, 0).Value
strsourceColB = checkCell.Offset(0, 1).Value
strsourceColC = checkCell.Offset(0, 2).Value
strsourceColD = checkCell.Offset(0, 2).Value
cLastFundRow = wksData.Range("A1").Offset(wksData.Rows.Count - 1, 0).End(xlUp).Row
' Initialize search range
Set myRange = wksData.Range("A4:A" & cLastFundRow)
' Iterate over given Excel range in database
For Each myCell In myRange.Cells
foundValueInA = myCell.Offset(0, 0).Value
foundValueInB = myCell.Offset(0, 1).Value
foundValueInC = myCell.Offset(0, 2).Value
foundValueInD = myCell.Offset(0, 3).Value
blnisNCRnoMatching = (searchKeyA = foundValueInA)
blnisPartnoMatching = (searchKeyB = foundValueInB)
blnisSerialNoMatching = (searchKeyC = foundValueInC)
blnisWorkorderMatching = (searchKeyD = foundValueInD)
blnisRowMatching = blnisNCRnoMatching And blnisPartnoMatching And blnisSerialNoMatching And blnisWorkorderMatching
'check if row needs to be updated
If (blnisRowMatching) Then
checkRow = checkCell.Row
Set rngSource = wksSource.Range("A" & checkRow & ":AD" & checkRow)
rngSource.Copy
rowNum = myCell.Row
Set rngDest = wksData.Range("A" & rowNum & ":AD" & rowNum)
rngDest.PasteSpecial
Exit For
End If
Next myCell
'If row is missing from database then add it
If (blnisRowMatching = False) And (rowNum = cLastFundRow) Then
cLastFundRow = cLastFundRow + 1
Set myRange = wksData.Range("A4:AD" & cLastFundRow)
checkRow = myCell.Row
Set rngSource = wksSource.Range("A" & checkRow & ":AD" & checkRow)
rngSource.Copy
rowNum = myCell.Row + 1
Set rngDest = wksData.Range("A" & rowNum & ":AD" & rowNum)
rngDest.PasteSpecial
End If
Next checkCell
End Sub
请问我该怎么修 很高兴看到您能够纠正错误。为了提高速度,您将受到限制,而无需搜索唯一标识符。您应该能够使用Match或Find来匹配一个条件(例如NCRno或partno),然后只运行for循环,只检查这些行上的所有值。也来看看。关于加速VBA代码的一般步骤,有一些很好的信息,包括在代码运行时关闭屏幕更新和计算。任何列中是否有唯一标识符?如果可以对循环使用
Vlookup
而不是嵌套的,我建议这样做。如果你必须按照你列出的方式去做,你能描述一下会发生什么吗?是否有任何错误,或者根本没有发生任何事情?如果什么也没有发生,您应该尝试单步执行代码,并确保您的变量(尤其是布尔值)按预期设置。没有唯一标识符,因为将有多个序列号具有相同的NCRno、partno和workorder,并且序列号对于特定批次是唯一的。这些列的值的组合是唯一的标识符。我希望能够使用Vloopup,因为它会更容易。目前没有错误,但它没有将任何新行复制到wksData。。。运行时间超过20分钟。我将在早上用一个较小的数据集进行测试,看看它实际上在做什么。不过,一种避免for循环的方法会很好。今天早上刚刚使用一个样本数据集进行了测试。什么都不做。我已经完成了代码,它确实进入了循环,只是什么也没做。有没有一种简单的方法可以找到它将变量设置为什么?如果你将鼠标移到变量上,你应该能够在即时窗口中看到它的值。根据您使用的Excel版本的不同,这看起来有所不同,但请查看以了解更多信息。您还可以设置一个MsgBox弹出并显示变量的值。啊,太棒了。让宏处理测试数据,并根据需要添加行和更新。只是需要很长时间。使用数组存储、比较、更新和添加行值会更快吗?我目前正在使用for each循环来赋值。我可以连接4列值并将其用作唯一标识符吗?或者这是个坏主意?从我在stackoverflow上看到的情况来看,匹配或查找听起来更可靠。我已经发现了你的链接答案,并将继续研究。这是一个有趣的想法,也不是一个坏主意。但我不确定这能节省多少时间。您必须循环,连接这些值,然后查找新值。如果您能够将连接的值保留在一个新列中,这样就不必每次都创建它们,这可能会节省时间。