通过将其与另一个工作表进行比较来更新工作表

时间:2014-08-01 14:25:19

标签: excel vba excel-vba

我有一个excel工作表(" Sheet1"),我需要与另一个工作表进行比较(" Sheet2")。

两个工作表的格式完全相同。 (即列相同,标题相同)

将Sheet1与Sheet2进行比较时,我需要检查现有记录的更新。

同时检查Sheet2中不存在于Sheet1中的新记录,并将它们附加到Sheet1的底部。

工作表2中的某些列完全空白,不需要进行检查。

第2列将是" Key"

另请注意,每个工作表中有超过7000行。

更新#1:

使用字典对象,我想出了这个。但是,它似乎没有找到任何新条目。我做错了吗?

Sub createDictionary()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    Dim maxRows1, maxRows2 As Long
    Dim i, j As Integer
    Dim SheetOne, SheetTwo As Worksheet

    maxRows1 = Sheets("Sheet1").UsedRange.Rows.Count

    Set SheetOne = Sheet1
    Set SheetTwo = Sheet2

    For i = 2 To maxRows1

        If Not dict.exists(SheetOne.Cells(i, 2).Value + " " + SheetOne.Cells(i, 11).Value) Then
            dict.Add CStr(SheetOne.Cells(i, 2).Value) + " " + SheetOne.Cells(i, 11).Value, i
        End If

    Next i

    maxRows2 = Sheets("Sheet2").UsedRange.Rows.Count

    For j = 2 To maxRows2

        If Not dict.exists(Sheet2.Cells(j, 2).Value) Then
            SheetTwo.Range("A" & j & ":" & "Z" & j).Copy
            SheetOne.Range("A" & maxRows1 + 1).Insert Shift:=xlDown
            SheetOne.Range("A" & maxRows1 + 1).Interior.Color = RGB(200, 200, 200)
        End If

    Next j

    Set dict = Nothing
End Sub

2 个答案:

答案 0 :(得分:0)

尝试使用dictionary对象时,它没有限制它可容纳的数量(仅限于您的计算机)

我将循环遍历sheet1,将每个键添加到字典中并将其映射到存储rowIndex和从行值制作的散列的集合。然后遍历sheet2中的键,查看字典中是否存在每个键;如果没有,请将行复制到sheet1。如果密钥确实存在,则对sheet2中的行进行散列并与字典项进行比较,如果它们不同,则表示您需要更新该行。

要复制行并快速粘贴它,您只需访问ow的value2属性即可。在更新

时追加+时这将非常有用

这里有一些测试代码可以帮助您入门。

Sub loopCellInColumn()
    Dim cell As Object
    Dim sheet As Worksheet
    Dim rng As Range
    Set sheet = ActiveSheet
    Set rng = sheet.UsedRange.Columns("A").Cells

    For Each cell In rng
        Row = cell.Row
        cell.Value = "Hello World" & Row
    Next cell
End Sub

并使用字典:

Sub createDictionary()
    Dim dict As Object
    Dim value As Collection
    Set dict = CreateObject("Scripting.Dictionary")

    Key = "hello"
    Set value = New Collection
    value.Add 100, "row"
    value.Add "A2D121E4", "hash"
    dict.Add Key, value

    MsgBox "key exists: " & dict.exists(Key) & vbNewLine & "value: " & dict(Key).Item("hash")
End Sub

使用value2复制+粘贴:

Sub test()
    ActiveSheet.Rows(1).Value2 = ActiveSheet.Rows(2).Value2
End Sub

以字符串形式获取行:

Sub getRowAsString()
    Dim cell As Object
    Dim sheet As Worksheet
    Dim str As String
    Dim arr() As Variant
    Dim arr2() As Variant
    Dim printCol As Integer

    Set sheet = ActiveSheet
    printCol = sheet.UsedRange.Columns.Count + 1

    For Each cell In sheet.UsedRange.Rows
        arr = cell.Value2
        ReDim arr2(LBound(arr, 2) To UBound(arr, 2))

        For i = LBound(arr, 2) To UBound(arr, 2)
            arr2(i) = arr(1, i)
        Next i

        str = Join(arr2, ", ")
        ActiveSheet.Cells(cell.Row, printCol).Value = str
    Next cell
End Sub

Here是从字符串中获取哈希值的帖子,包括vba代码:

我列出的所有步骤都有很多支持它们的帖子,所以资源不会成为问题

答案 1 :(得分:0)

我经常在这个论坛上重复这个:),但是,这样的操作使用SQL更容易处理。

我要么使用Microsof Query(Excel数据 - >获取外部数据 - >来自其他来源 - >来自Microsoft Query)或者我建议使用我的SQL加载项到Excel:http://blog.tkacprow.pl/?page_id=130

似乎您需要使用JOIN运算符来查找表单1和表单2之间的更改。然后使用UNION运算符连接第二个SELECT和LEFT OUTER JOIN以添加其他新行。