【问题标题】:Identifying duplicate values across two worksheets识别两个工作表中的重复值
【发布时间】:2014-01-08 08:39:27
【问题描述】:

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

目前我正在获取 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。这就是它失败的原因。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    我建议从几个通用的 cmets 开始考虑,尽管它们可能无法解决问题。我必须承认我还没有下载你的工作簿,如果你已经在一些你没有发布的代码中完成了这个,那么很抱歉。

    一个。以Option Explicit 开头的模块可能比较严谨。从此处发布的代码来看,您似乎在问题开始的地方引入了一个 un-Dimed 变量 transfer。您似乎还创建了一个变量 EntryRow - 可能您的意思是 EntireRow 函数?这是一段代码,展示了Option Explicit的必要性

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

    Dimed变量existingQuote,创建了一个un-Dimed变量transferDimedexistQuote没有数据类型,然后尝试赋值变量@987654333 @ 到 existingQuote.row 没有 Seting existingQuote 变体数组变量应该包含的内容。

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

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

    这至少可能有助于使代码更易于阅读,尽管我有(可能是迷信的)感觉宏似乎也快了一点

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

    如果你清理了你的代码,它还可以帮助论坛研究人员掌握你想要做的事情。

    编辑:(未经测试)

    这个怎么样:

    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 = ""
    

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

    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
    

    【讨论】:

    • a) 我现在已经澄清了我最初想要做的事情。我似乎无法将xlCell.address 放入变量中,这是我的主要问题。 b) 这个 sn-p 是一个循环的一部分,它将引号 (2*****) 与订单 (3*****) 分开,因此使用了偏移功能。我试图只包含相关代码,但似乎这可能混淆了我的代码。 c) 我的印象是变量在 sub 结束时会自动销毁,除非它们被声明为 public 或 global?
    • 好的,那么您是否收到一条错误消息?既然您已经将Dimed 存在引用为Range,那么您不需要将Set 它添加到数组中吗? .Address 到底是一个数组还是一个字符串?从帮助文件来看,.Address 返回一个字符串值。也尝试使用.Address(RowAbsolute)。你仍然有existingQuote 作为非set 变量。 VBA 如何知道existingQuote 的内容,而不是Dimed existQuote?顺便说一句,你对销毁变量的看法是对的,但我总是喜欢直观地看到命令,这对于其他语言来说是一个很好的做法。
    • 还有一件事-我想知道:如果您不需要在MsgBox 中向用户显示完整地址,为什么不直接使用Dim existQuote As Long, [linebreak] existQuote = xlCell.Row [linebreak] Debug.Print existQuote [linebreak] Exit Sub 看看这是否符合您的价值需要吗?
    • .address 正在返回一个字符串 - 我认为这是问题所在,因为它现在可以完美运行。谢谢。
    • 如果您的问题得到回答,打勾?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 2012-10-29
      • 2012-06-29
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多