识别两个工作表中的重复值

时间:2013-12-19 16:59:33

标签: excel vba excel-vba

我有两个工作表,一个包含历史数据,另一个包含我刚刚导入的数据。我想检查现有数据,看看新数据是否包含任何重复的引号(因此会被“转换”为订单)。

目前我正在使用A2中的报价编号,并使用以下代码将其与其他工作表中的报价编号进行比较:

Dim wb As Workbook
Set wb = ActiveWorkbook
Dim wS As Worksheet
Set wS = ActiveSheet
Dim importWS as worksheet
importWS = sheets.("NEWDATA")

select.importWS
Range("A1").Select
Do
    ActiveCell.Offset(1, 0).Select

'Set the current quote number as a value to be located
Dim valueToFind As Long
valueToFind = ActiveCell.Value
Dim checkRange As Range
Set checkRange = wS.Range("D1:D" & EntryRow)

'Check the existing worksheet to see if the quote already exists
Dim xlCell As Range
For Each xlCell In checkRange
    If xlCell.Value = valueToFind Then



problems:    

        Dim existQuote As range
        existQuote = xlCell.Address
        Dim existingRow As Integer
        existingRow = existingQuote.Row

        MsgBox valueToFind & "in row" & existingRow & "has been converted to an order"


    End If
Next xlCell


Loop Until ActiveCell.Value > 300000 Or ActiveCell.Value = ""

ActiveCell.Offset(-1, 0).Select
Dim DataPoints As Integer
DataPoints = ActiveCell.Row
ActiveCell.Offset(1, 0).Select

我在“问题:”中遇到if函数问题 代码成功识别出重复的报价编号,但我希望检查同一行中的另一个单元格是否为“销售订单”,然后根据此操作执行操作。

我想不出一种方法来获取我使用此代码的单元格的行号,以便我可以检查它并编辑条目。

编辑:.address函数返回string,而不是range。这就是它失败的原因。

2 个答案:

答案 0 :(得分:0)

我建议考虑开始一些一般性评论,尽管它们可能无法解决问题。我必须承认,如果您已经使用未发布的代码完成此操作,我没有下载您的工作簿。

一个。使用Option Explicit启动模块可能非常严格。从此处发布的代码中,您可能会在问题开始的位置引入一个非Dim ed变量transfer。您似乎也创建了一个变量EntryRow - 可能您的意思是EntireRow函数?这是一段代码,展示了对Option Explicit

的需求
Dim existingQuote As Variant      
    transfer = xlCell.Address
        Dim existQuote As
        existQuote = transfer
        Dim existingRow As Integer
        existingRow = existingQuote.Row

Dim修改了变体existingQuote,创建了一个非Dim ed变量transferDim ed existQuote,没有数据类型,然后尝试将变量existingRow的值分配给existingQuote.row,而不Set existingQuote变量数组变量应包含的内容。

湾为什么不直接去做?如果您想在importWS中选择单元格A2并对其执行某些操作/从中获取某些内容,那么

valueToFind = importWS.Range("A2").Value

这至少可能有助于使代码更容易阅读,虽然我有(可能是迷信的)感觉宏也看起来更快一点

℃。我还建议在子程序结束时销毁变量。

如果你清理你的代码,它也可以帮助论坛的boffins掌握你想要做的事情。

编辑 :(未经测试)

这个怎么样:

Dim xlCell As Excel.Range
Dim existQuote As Long
For Each xlCell In checkRange
    If xlCell.Value = valueToFind Then

        existQuote = xlCell.Row

        MsgBox (valueToFind & " in row " & existQuote & " has been converted to an order", "Order Conversion Alert: ")


    End If
Next xlCell


Loop Until ActiveCell.Value > 300000 Or ActiveCell.Value = ""

注意:只有在ActiveCell循环期间Do列遍历的数据填充单元格之间没有间隙时,此操作才有效。如果您有间隙,您可能希望从工作表的最后一行获取一个循环结束值,而不是数据。你可以这样做:

Dim wb As Workbook
Set wb = ActiveWorkbook
Dim wS As Worksheet
Set wS = ActiveSheet
Dim importWS as worksheet
Dim dataend As Long
Dim counter As Long
importWS = sheets.("NEWDATA")

select.importWS
dataend = Range("A65000").End(xlUp).Row
Range("A1").Select

Do
    ActiveCell.Offset(1, 0).Select
    If ActiveCell.Value = "" Then
       GoTo newloop

     Dim valueToFind As Long
     valueToFind = ActiveCell.Value
     Dim checkRange As Range
     Set checkRange = wS.Range("D1:D" & EntryRow)

    Dim xlCell As Excel.Range
    Dim existQuote As Long
    For Each xlCell In checkRange
        If xlCell.Value = valueToFind Then

            existQuote = xlCell.Row

            MsgBox (valueToFind & " in row " & existQuote & " has been converted to an order", "Order Conversion Alert: ")


        End If
    Next xlCell


newloop:
counter = counter + 1


Loop Until ActiveCell.Value > 300000 Or counter = dataend

ActiveCell.Offset(-1, 0).Select
Dim DataPoints As Integer
DataPoints = ActiveCell.Row
ActiveCell.Offset(1, 0).Select

答案 1 :(得分:0)

我实际上最终使用find函数以使用最少资源的方式执行此操作。