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上看到的情况来看,匹配或查找听起来更可靠。我已经发现了你的链接答案,并将继续研究。这是一个有趣的想法,也不是一个坏主意。但我不确定这能节省多少时间。您必须循环,连接这些值,然后
查找新值。如果您能够将连接的值保留在一个新列中,这样就不必每次都创建它们,这可能会节省时间。