Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 使用满足4个条件的第二张图纸中的数据覆盖一张图纸中的行数据_Vba_Excel - Fatal编程技术网

Vba 使用满足4个条件的第二张图纸中的数据覆盖一张图纸中的行数据

Vba 使用满足4个条件的第二张图纸中的数据覆盖一张图纸中的行数据,vba,excel,Vba,Excel,我看过几个线程,其中一些涉及到我的问题,但是,我从未使用过VBA,也不知道如何更改编码以适应我的问题 如果A、B、C和D列(从第2行开始的实时数据)中的数据在第1和第2页上都匹配,我想从第1页覆盖第2页上的数据行 实际上,表2是我的数据存储,表1是表2的模板。表2中已经存在前四列中所有可能的数据组合,行中剩余的数据未知。所以当我得到未知数据时,我想覆盖第2页的那一行 很多人都会在某个列中搜索某个特定术语的位置复制行,然而,我会搜索许多不同的术语,但正如我所说的,它们需要在两个表上都匹配 希望我有

我看过几个线程,其中一些涉及到我的问题,但是,我从未使用过VBA,也不知道如何更改编码以适应我的问题

如果A、B、C和D列(从第2行开始的实时数据)中的数据在第1和第2页上都匹配,我想从第1页覆盖第2页上的数据行

实际上,表2是我的数据存储,表1是表2的模板。表2中已经存在前四列中所有可能的数据组合,行中剩余的数据未知。所以当我得到未知数据时,我想覆盖第2页的那一行

很多人都会在某个列中搜索某个特定术语的位置复制行,然而,我会搜索许多不同的术语,但正如我所说的,它们需要在两个表上都匹配


希望我有道理!请帮忙

您可以使用公式而不是VBA来实现这一点

如果没有标题,请将此公式粘贴到sheet1的单元格E1中:

=IF(AND(A1=INDEX(Sheet2!A:A,MATCH(A1,Sheet2!A:A,FALSE)),B1=INDEX(Sheet2!B:B,MATCH(B1,Sheet2!B:B,FALSE)), C1=INDEX(Sheet2!C:C,MATCH(C1,Sheet2!C:C,FALSE)),D1=INDEX(Sheet2!D:D,MATCH(D1,Sheet2!D:D,FALSE))),INDEX(Sheet2!E:E,MATCH(A1,Sheet2!A:A,FALSE)),"NO")
或者,如果您有标题行,则将此项添加到E2中:

=IF(AND(A2=INDEX(Sheet2!A:A,MATCH(A2,Sheet2!A:A,FALSE)),B2=INDEX(Sheet2!B:B,MATCH(B2,Sheet2!B:B,FALSE)), C2=INDEX(Sheet2!C:C,MATCH(C2,Sheet2!C:C,FALSE)),D2=INDEX(Sheet2!D:D,MATCH(D2,Sheet2!D:D,FALSE))),INDEX(Sheet2!E:E,MATCH(A2,Sheet2!A:A,FALSE)),"NO")
然后使用单元格右下角的小切换将其拖动到sheet1上,直到您希望列从sheet2进入为止

然后高亮显示刚刚创建的整行,并将右下角的小切换拖动到工作表的最下方(或者尝试双击切换以自动填充)

我在一个小数据集上尝试了这个方法,它似乎有效,因此它应该适用于更大的数据集,只要sheet1上4列的所有可能变化都在sheet2上可用,并在以下列中提供相关数据

如果任何单元格中的结果为“否”,则Excel无法在sheet2中找到与sheet1中的行完全匹配的行

编辑-更新以下答案

试试这个,它更适合你

Sub CopyItOver()

Dim sh1 As Worksheet, sh2 As Worksheet
Set sh1 = Sheets("Sheet1")
Set sh2 = Sheets("Sheet2")

    For Each c1 In sh1.Range("A1", sh1.Range("A1").End(xlDown))
        For Each c2 In sh2.Range("A1", sh2.Range("A1").End(xlDown))
            If c2.Value = c1.Value Then
                If c2.Offset(0, 1).Value = c1.Offset(0, 1).Value Then
                    If c2.Offset(0, 2).Value = c1.Offset(0, 2).Value Then
                        If c2.Offset(0, 3).Value = c1.Offset(0, 3).Value Then
                            c1.EntireRow.Value = c2.EntireRow.Value
                        End If
                    End If
                End If
            End If
        Next c2
    Next c1

End Sub

如果你不知道VBA,我认为最好是去自由职业者的网站,把它作为一个工作,你会很快完成它与花费少量的钱。否则,请提供您尝试过的方法以及您遇到的困难。不幸的是,我无法使此方法起作用。我在第1页的E列中为这个公式创建了一个额外的列,将其余的列(F到AA)推出。我在第2页中也做了同样的操作,以避免数据被覆盖到错误的单元格中。当公式运行时,它会提示我打开一个文件(我假设有一个要更新的目标?)我单击了工作簿中的相关工作表,但它似乎不喜欢它,当我尝试沿或向下拖动单元格时,它会做同样的事情。之后,我从excel收到一条错误消息,告诉我使用插入功能选项。您的工作表名为Sheet1和Sheet2还是其他?更新-我在更改工作表的“Sheet2”名称时出错,我忘记了工作表名称周围的逗号。当我拖动单元格时,我还在索引数组周围添加了美元符号,因为它们在变化。不幸的是,虽然仍然不起作用,但现在没有文件提示,但所有单元格都只是读取N/a pologies,这个匆忙编写的函数很可能不起作用,因为它独立地将每个索引/匹配评估为真/假,因此它会给您一些奇怪的结果。我已经用一段VBA代码更新了我的答案,希望它能给你你想要的结果。VBA工作起来就像一场梦,比我想象的要短得多。谢谢你,哈利!