比较VBA中的两个表并将数据粘贴到第三个表中

时间:2015-03-15 23:00:08

标签: vba excel-vba copy comparison excel

我在一个迷你项目上工作了两周,现在,我被困了。在来到这里之前我尝试了很多东西,我希望得到一些帮助。

我有两张桌子和3张床(" PT" = worhskeets1带有第一张桌子," PI" =工作表2带有第二张桌子,"比较& #34;,第三个工作表用于比较表1和表2中的数据。

首先,当我在第一个工作表中复制单元格(1," A")中的数据时,它会自动对值进行排序。在工作表2上相同。

为了帮助您理解,每张表都有"代码"除了金额之外的列中的金额(欧元,美元等金额)。 问题是代码可以在两个表的每列中重复。

在理想情况下,当两个表完全匹配(相同长度)时,我做了一个vlookup并且它没有工作。对于重复代码,只需要第一个"匹配"相应的金额。 然后我尝试使用组合INDEX&比赛。有效。 我还尝试通过查找"查找数组"变量:由于代码相同,我在每行上逐个进行了vlookup。不是很有效,但因为我不会有超过50行的工作。代码如下:

Dim wsi As Worksheet
Dim wst As Worksheet
Dim counter As Integer
Dim NonVideLondon As Integer
Set wsi = Worksheets("PI")
Set wst = Worksheets("PT")

NonVideLondon = wst.Range("A" & Rows.Count).End(xlUp).Row
counter = 1
For i = 1 To NonVideLondon
LookupCode = Cells(i, "C") 'The codes from Table2

Cellnum = Application.VLookup(LookupCode, wsi.Range("C" & counter & ":C" &NonVideLondon), 1, False)

If IsError(Cellnum) Then
    Cells(i, "B") = "" 'Compared to the codes of table2
Else
    Cells(i, "B") = Cellnum
    counter = counter +1 
End If

Next i

(我为代码的近似值道歉)

问题是表1的长度>表2长度和相反。 在这里,我真的不知道该怎么做。

在表格"比较"然后是4列:

CodePI (作品B) CodePT (作品C) AmountPI (作品D) AmountPT (上校E)

在Col A中,有一些按钮可以清除所有纸张,并且可以"验证"。如果表1> 1,它是用于检查表的长度并启动宏的模块。表2和表2中的另一表>表1。

当我在两个表匹配时逐行(再次,不是非常有效)进行vlookup时,这样可以正常完成比较。

我也尝试了.FindMethod:

StrFind = Cells(j, "B")
Set fRng = Worksheets("PI").Range("C2:C50").Cells(Worksheets("PI").Range("C2:C50").Cells.Count)

 For i = Application.CountIf(Worksheets("PI").Range("C2:C50"), StrFind) To 1 Step -1
     Set fRng = Worksheets("PI").Range("C2:C50").Cells.Find(What:=StrFind, _
                               LookIn:=xlValues, _
                               LookAt:=xlWhole, _
                               After:=fRng, _
                               MatchCase:=True)

       If Not fRng Is Nothing Then
          With Worksheets("Comparison")
              .Cells(fRng.Row, "S") = fRng.Value
          End With
      End If
    Next i



Next j

但是我总是没有找到一个正确的比较表&#34;对于所有情况(表1 =表2,新代码,表1&gt;表2和表2&gt;表1)。哦,我使用比较表的原因是数量可以完全匹配,有时会改变少量(<1)。然后我们不能简单地复制金额。

我已经制作了另外一些代码来查看差异&#34; (当两个表的长度相同时,它可以工作):

If Cells(i, "C") = Cells(i, "B").Value Then Cells(i, "B").Interior.Color = RGB(146, 208, 80) _
Else: Cells(i, "B").Interior.Color = RGB(226, 107, 10) 'FOR CODES

If Cells(i, "E").Value = Cells(i, "D").Value Then Cells(i, "D").Interior.Color = RGB(146, 208, 80) _
Else: If Cells(i, "E").Value < Cells(i, "D").Value + 1 And Cells(i, "E").Value > Cells(i, "D").Value - 1 Then _
    Cells(i, "D").Interior.Color = RGB(255, 226, 133) _
    Else: Cells(i, "D").Interior.Color = RGB(226, 107, 10) ' FOR AMOUNTS

现在我想:

如果table1&gt;然后,表2获取表1的代码和数量的数据,并将它们与table2进行比较。如果存在匹配(基于表的位置),那么在比较表中我们将在第一列中具有来自最长表的所有数据。金额相同(这里很简单,我们只需要从最长的表复制到比较)。

如果第二个表中的代码与第一个代码匹配,如何进行通信?我的意思是如果表1&gt;表2表1中的所有日期将被简单地复制&#34;但是对于表2中的匹配,如何在表1的相应行(在WS比较中)中,表2的正确值(代码和数量)?

我还考虑过每次代码不同时在短表中添加一个空行,以便在表长度中创建对应关系(因为当用户复制时,两个表按相应表中的值排序/粘贴数据)。它每次都失败了新代码&#34;检测到(或未找到或不存在):

Dim Arr() As Variant
ReDim Arr(1 To 30)

NonVideAddLondon = Worksheets("Paste Transcom").Range("A" & Rows.Count).End(xlUp).Row


For i = 2 To NonVideAddLondon

If Cells(i, "B") = "" Then
Arr(i) = Cells(i, "B").Row
Worksheets("Paste Investec").Rows(Arr(i)).Insert shift:=xlDown
Else
End If

Next i

1 个答案:

答案 0 :(得分:0)

我会尽快做到这一点。目前,我可以提供以下值:

第一个工作表中的表1: 仅仅是为了注意,在原始文件中,col&#34; Code&#34;在第二列和&#34;金额&#34;在第9列。代码源自&#34; LEFT()&#34;和一个对应表,就像表格下面的代码一样。

**Code**    **Amount**
Global               432,716.19
UMA     636,091.76
OMG     832,665.69
OOG     1,032,708.57
GRA       1,033,648.22
GOI        1,133,131.21
UOP       1,632,661.28
USB        3,033,309.01
LLI           3,332,737.06
LLB         3,332,826.35
GAO      3,533,775.81
UEB        5,734,412.75
UEN       5,832,700.11
UBT        5,945,724.80
Global               7,732,277.37
GVG      10,233,260.23
Global               11,048,022.73
Global               11,133,733.34
CRF        15,033,064.72
GCO       21,534,664.66
UTE        32,292,495.22
CBN       47,034,495.48
GDD/SAB    49,048,029.01
GDD/SAB    49,555,274.28
WTA      84,098,108.27
WTA      93,735,464.00
WTL       115,093,086.44

该代码来源于&#34; Select Case Fundcode&#34;如果是LEFT(columnA,&#34; 3&#34;)。

    Case "BAL"
    Cells(i, "B") = "Global"

    Case "ERR"
    Cells(i, "B") = "LOP"

    Case "MLE"
    Cells(i, "B") = "UEB"

    Case "114"
    Cells(i, "B") = "UTE"

    Case "UTT"
    Cells(i, "B") = "UBT"

    Case "AOO"
    Cells(i, "B") = "UEM"

    Case "AB1"
    Cells(i, "B") = "LLB"

    Case "CDD"
    Cells(i, "B") = "LLE"

    Case "FDD"
    Cells(i, "B") = "LLI"

    Case "130"
    Cells(i, "B") = "OOG"

    Case "IOF"
    Cells(i, "B") = "GAO"

    Case "119"
    Cells(i, "B") = "GDD/SAB"

    Case "GAC"
    Cells(i, "B") = "GVG"

    Case "IUN"
    Cells(i, "B") = "GOI"

    Case "H3D"
    Cells(i, "B") = "WTA"

    Case "LSF"
    Cells(i, "B") = "WTL"

    Case "132"
    Cells(i, "B") = "CBN"

    Case "129"
    Cells(i, "B") = "USB"

    Case "UMA"
    Cells(i, "B") = "UMA"

    Case "139"
    Cells(i, "B") = "UOP"

    Case "UHI"
    Cells(i, "B") = "UHI"

    Case "114"
    Cells(i, "B") = "UTE"

    Case "UTT"
    Cells(i, "B") = "UBT"

    Case "OMG"
    Cells(i, "B") = "OMG"

    Case "GRA"
    Cells(i, "B") = "GRA"

    Case "137"
    Cells(i, "B") = "UGB"

    Case "126"
    Cells(i, "B") = "UEN"

    Case "CRF"
    Cells(i, "B") = "CRF"

    Case "GCO"
    Cells(i, "B") = "GCO"


    Case Else
    Cells(i, "B") = "New"
    Cells(i, "B").Interior.Color = RGB(226, 107, 10)
    Cells(i, "B").Interior.Color = RGB(226, 107, 10)

结束选择

对于第二个工作表中的表2:

OMG    832,665.69
OOG     1,032,708.57
GRA      1,033,648.22
GOI       1,133,131.21
UOP      1,632,661.28
LLI          3,332,737.06
LLB        3,332,826.35
GAO     3,533,775.61
UEB       5,734,413.01
UEN      5,832,700.11
UBT       5,945,724.80
Global                  7,732,277.37
GVG     10,233,260.23
Global                  11,048,022.73
Global                  11,133,733.34
CRF    15,033,064.72
GCO   21,534,664.66
UTE       32,292,495.39
CBN      47,034,495.44
GDD/SAB            49,555,274.32
WTA                  84,098,108.27
WTA     93,735,464.00

正如我之前所说,当两个列大小都适合时,问题很容易解决。但是,就像在这种情况下,尺寸不同,我不知道如何处理它。

这里Table2有24个值而Table1有28个。正如你在两个表中看到的那样,有几次相同的代码有不同的数量。金额也可以稍微改变(从几美分)。

我们的想法是创建一个像这样的第三个表:

t1 =表1,t2 =表2

Code(t1) Code(t2) Amount(t1)   Amount(t2)
Global                          432,716.19
UMA                      636,091.76
OMG       OMG               832,665.69         832,665.69
OOG       OOG      1,032,708.57                  1,032,708.57
GRA         GRA        1,033,648.22       1,033,648.22
GOI          GOI        1,133,131.21       1,133,131.21
UOP         UOP        1,632,661.28        1,632,661.28
USB                         3,033,309.01
LLI             LLI    3,332,737.06                        3,332,737.06
LLB           LLB    3,332,826.35        3,332,826.35
GAO        GAO    3,533,775.81        3,533,775.61
UEB          UEB    5,734,412.75        5,734,413.01
UEN         UEN    5,832,700.11        5,832,700.11
UBT          UBT    5,945,724.80        5,945,724.80
Global    Global  7,732,277.37        7,732,277.37
GVG       GVG      10,233,260.23       10,233,260.23
Global    Global              11,048,022.73        11,048,022.73
Global    Global     11,133,733.34        11,133,733.34
CRF         CRF      15,033,064.72        15,033,064.72
GCO        GCO        21,534,664.66        21,534,664.66
UTE         UTE         32,292,495.22        32,292,495.39
CBN        CBN      47,034,495.48        47,034,495.44
GDD/SAB                   49,048,029.01
GDD/SAB    GDD/SAB 49,555,274.28        49,555,274.32
WTA      WTA        84,098,108.27        84,098,108.27
WTA      WTA        93,735,464.00        93,735,464.00
WTL       WTL        115,093,086.44        115,093,086.44

你可以看到第一个&#34;全球&#34;不在snd表中,但出现在第一个表中。因此,表1的尺寸>表2,它出现在col1(代码(t1))但不在代码(t2)中,因为在该表的这个位置,代码没有出现。金额相同。

之前的金额都已排序。所以&#34;通常&#34;如果机器人大小相同,则可以轻松地在表3中填写金额。

这个想法是创建一个VBA函数,填充表3,关于table1中行的位置(最长)与table2(最低行)的比较。它应该将table2中的值放在table1的相应行中的第三个表&#34;摘要&#34;中。

正如您在表2中所见,第一个&#34; GLOBAL&#34;,&#34; USB&#34;和第一个&#34; GDD SAB&#34;不在场。它不在表3中,但是其他全球和GDD / SAB都没有。这就是我试图实现的目标;根据可能会出现多次不同值的代码从其他表中检索数据。

可能不清楚......很难解释。