Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Excel 从多张图纸更新母版图纸_Excel_Vba_Updating_Data Extraction - Fatal编程技术网

Excel 从多张图纸更新母版图纸

Excel 从多张图纸更新母版图纸,excel,vba,updating,data-extraction,Excel,Vba,Updating,Data Extraction,您好,我正在尝试创建一个宏,将数据从源工作表提取到主工作表中,它将检查主工作表中是否有任何现有记录,如果有,它将使用源工作表中的最新数据更新主工作表中的记录,如果没有,它会将源工作表中的数据添加到主工作表中。我设法拼凑了下面的代码,它能够为一个客户(单页)做到这一点,谁能建议如何修改它以允许更新多页。我知道我需要循环工作表来做这件事,但到目前为止我遇到了错误。非常感谢您的帮助 Sub Update() Dim wsSrc As Worksheet, wsDest As Worksheet, i

您好,我正在尝试创建一个宏,将数据从源工作表提取到主工作表中,它将检查主工作表中是否有任何现有记录,如果有,它将使用源工作表中的最新数据更新主工作表中的记录,如果没有,它会将源工作表中的数据添加到主工作表中。我设法拼凑了下面的代码,它能够为一个客户(单页)做到这一点,谁能建议如何修改它以允许更新多页。我知道我需要循环工作表来做这件事,但到目前为止我遇到了错误。非常感谢您的帮助

Sub Update()
Dim wsSrc As Worksheet, wsDest As Worksheet, i As Integer, j As Integer, k As Integer, srcLastRow As Long, destLastRow As Long, srcFndVal As String, destFndCell As Range, srcValRow As Long, destValRow As Long, destFndVal As String, srcFndCell As Range
Application.ScreenUpdating = False
Set wsSrc = Worksheets("Cust A")
Set wsDest = Worksheets("Master")
srcLastRow = wsSrc.Cells(Rows.Count, "BA").End(xlUp).Row
destLastRow = wsDest.Cells(Rows.Count, "A").End(xlUp).Row
j = wsDest.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Row
    With wsDest
        For i = 4 To srcLastRow
        srcFndVal = wsSrc.Cells(i, "AA")
        Set destFndCell = .Range("A:A").Find(srcFndVal, LookIn:=xlValues)
            If destFndCell Is Nothing And wsSrc.Cells(i, "AA").Value <> "" Then
                .Range("A" & j & ":F" & j).Value = wsSrc.Range("AA" & i & ":AF" & i).Value
                .Range("J" & j & ":K" & j).Value = wsSrc.Range("AG" & i & ":AH" & i).Value
                .Range("G" & j & ":H" & j).Value = wsSrc.Range("AE" & i & ":AF" & i).Value
                j = j + 1
            Else
        srcValRow = wsSrc.Range("AA:AA").Find(what:=srcFndVal, after:=wsSrc.Range("AA4"), LookIn:=xlValues).Row
        destValRow = wsDest.Range("A:A").Find(what:=srcFndVal, after:=wsDest.Range("A4"), LookIn:=xlValues).Row
                .Range("B" & destValRow & ":F" & destValRow).Value = wsSrc.Range("AB" & srcValRow & ":AF" & srcValRow).Value
                .Range("J" & destValRow & ":K" & destValRow).Value = wsSrc.Range("AG" & srcValRow & ":AH" & srcValRow).Value
            End If
        Next
        For k = 4 To destLastRow
        destFndVal = wsDest.Cells(k, "A")
        Set srcFndCell = wsSrc.Range("AA:AA").Find(destFndVal, LookIn:=xlValues)
            If srcFndCell Is Nothing And wsDest.Cells(k, "A").Value <> "" Then
                .Range("B" & k & ":F" & k).Value = vbNullString
            End If
        Next
    End With
Application.ScreenUpdating = True
End Sub
子更新()
将wsSrc设置为工作表、wsDest设置为工作表、i设置为整数、j设置为整数、k设置为整数、srcLastRow设置为长、destLastRow设置为长、srcFndVal设置为字符串、destFndCell设置为范围、srcValRow设置为长、destFndVal设置为字符串、srcFndCell设置为范围
Application.ScreenUpdating=False
设置wsSrc=工作表(“客户A”)
设置wsDest=工作表(“主工作表”)
srcLastRow=wsSrc.Cells(Rows.Count,“BA”).End(xlUp).Row
destLastRow=wsDest.Cells(Rows.Count,“A”).End(xlUp).Row
j=wsDest.Cells(Rows.Count,“A”).End(xlUp).偏移量(1,0).行
用wsDest
对于i=4到srcLastRow
srcFndVal=wsSrc.Cells(i,“AA”)
设置destFndCell=.Range(“A:A”).Find(srcFndVal,LookIn:=xlValues)
如果destFndCell为Nothing且wsSrc.Cells(i,“AA”).Value为“”,则
.Range(“A”&j&“:F”&j).Value=wsSrc.Range(“AA”&i&“:AF”&i).Value
.Range(“J”&J&“:K”&J).Value=wsSrc.Range(“AG”&i&“:AH”&i).Value
.Range(“G”&j&“:H”&j).Value=wsSrc.Range(“AE”&i&“:AF”&i).Value
j=j+1
其他的
srcValRow=wsSrc.Range(“AA:AA”).Find(what:=srcFndVal,after:=wsSrc.Range(“AA4”),LookIn:=xlValues)。行
destValRow=wsDest.Range(“A:A”).Find(what:=srcFndVal,after:=wsDest.Range(“A4”),LookIn:=xlValues)。行
.Range(“B”&destValRow&“:F”&destValRow).Value=wsSrc.Range(“AB”&srcValRow&“:AF”&srcValRow).Value
.Range(“J”&destValRow&“:K”&destValRow).Value=wsSrc.Range(“AG”&srcValRow&“:AH”&srcValRow).Value
如果结束
下一个
对于k=4,删除最后一行
destFndVal=wsDest.Cells(k,“A”)
设置srcFndCell=wsSrc.Range(“AA:AA”).Find(destFndVal,LookIn:=xlValues)
如果srcFndCell为Nothing且wsDest.Cells(k,“A”).Value为“”,则
.Range(“B”&k&“:F”&k)。值=vbNullString
如果结束
下一个
以
Application.ScreenUpdating=True
端接头
我修改了代码以循环数组中的工作表,但是在获取wsSrc的最后一行时存在问题,需要运行时错误424对象。下面一行突出显示,有人能建议如何解决这个问题吗?对不起,我是VBA新手,非常感谢您的帮助

srcLastRow=wsSrc.Cells(Rows.Count,“AA”).End(xlUp).Row

子更新()
将wsSrc设置为变量,将srcList设置为变量,将wsDest设置为工作表,将i设置为整数,将j设置为整数,将k设置为整数,将srcLastRow设置为长,将destLastRow设置为长,将srcFndVal设置为字符串,将srcFndCell设置为范围,将srcValRow设置为长,将destFndVal设置为字符串,将srcFndCell设置为范围
Application.ScreenUpdating=False
srcList=数组(“客户A”、“客户B”、“客户C”、“客户D”、“客户E”、“客户F”、“客户G”)
设置wsDest=工作表(“主工作表”)
srcLastRow=wsSrc.Cells(Rows.Count,“AA”).End(xlUp).Row
destLastRow=wsDest.Cells(Rows.Count,“A”).End(xlUp).Row
j=wsDest.Cells(Rows.Count,“A”).End(xlUp).偏移量(1,0).行
对于srcList中的每个wsSrc
用wsDest
对于i=4到srcLastRow
srcFndVal=wsSrc.Cells(i,“AA”)
设置destFndCell=.Range(“A:A”).Find(srcFndVal,LookIn:=xlValues)
如果destFndCell为Nothing且wsSrc.Cells(i,“AA”).Value为“”,则
.Range(“A”&j&“:F”&j).Value=wsSrc.Range(“AA”&i&“:AF”&i).Value
.Range(“J”&J&“:K”&J).Value=wsSrc.Range(“AG”&i&“:AH”&i).Value
.Range(“G”&j&“:H”&j).Value=wsSrc.Range(“AE”&i&“:AF”&i).Value
j=j+1
其他的
srcValRow=wsSrc.Range(“AA:AA”).Find(what:=srcFndVal,after:=wsSrc.Range(“AA4”),LookIn:=xlValues)。行
destValRow=wsDest.Range(“A:A”).Find(what:=srcFndVal,after:=wsDest.Range(“A4”),LookIn:=xlValues)。行
.Range(“B”&destValRow&“:F”&destValRow).Value=wsSrc.Range(“AB”&srcValRow&“:AF”&srcValRow).Value
.Range(“J”&destValRow&“:K”&destValRow).Value=wsSrc.Range(“AG”&srcValRow&“:AH”&srcValRow).Value
如果结束
下一个
对于k=4,删除最后一行
destFndVal=wsDest.Cells(k,“A”)
设置srcFndCell=wsSrc.Range(“AA:AA”).Find(destFndVal,LookIn:=xlValues)
如果srcFndCell为Nothing且wsDest.Cells(k,“A”).Value为“”,则
.Range(“B”&k&“:F”&k)。值=vbNullString
如果结束
下一个
以
下一个wsSrc
Application.ScreenUpdating=True
端接头
试试这个

Sub Update()
    Dim wsSrc  As Worksheet
    For Each wsSrc In ThisWorkbook.Worksheets
        If wsSrc.Name <> "Master" Then
            'Do bla bla...
        End If
    Next
End Sub
子更新()
将wsSrc设置为工作表
用于此工作簿中的每个wsSrc。工作表
如果wsSrc.Name为“Master”,则
“等等。。。
如果结束
下一个
端接头
试试这个

Sub Update()
    Dim wsSrc  As Worksheet
    For Each wsSrc In ThisWorkbook.Worksheets
        If wsSrc.Name <> "Master" Then
            'Do bla bla...
        End If
    Next
End Sub
子更新()
将wsSrc设置为工作表
用于此工作簿中的每个wsSrc。工作表
如果wsSrc.Name为“Master”,则
“等等。。。
如果结束
下一个
端接头

我已经修复了你的代码。试试这个。 您的问题是wsSrc是一个工作表对象,但srcList是一个字符串数组。他们彼此不匹配。 我使用的条件是wsSrc名称以“Cust”开头。告诉我这是否解决了你的问题

Sub Update()
    Dim wsSrc, wsDest As Worksheet
    Dim i, j, k As Integer
    Dim srcLastRow, destLastRow, srcValRow, destValRow As Long
    Dim srcFndVal, destFndVal As String
    Dim destFndCell, srcFndCell As Range
    
    Application.ScreenUpdating = False
    Set wsDest = Worksheets("Master")
    For Each wsSrc In ThisWorkbook.Worksheets
        If Left(wsSrc.Name, 4) = "Cust" Then
            srcLastRow = wsSrc.Cells(Rows.Count, "BA").End(xlUp).Row
            destLastRow = wsDest.Cells(Rows.Count, "A").End(xlUp).Row
            j = wsDest.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Row
            With wsDest
                For i = 4 To srcLastRow
                    srcFndVal = wsSrc.Cells(i, "AA")
                    Set destFndCell = .Range("A:A").Find(srcFndVal, LookIn:=xlValues)
                    If destFndCell Is Nothing And wsSrc.Cells(i, "AA").Value <> "" Then
                        .Range("A" & j & ":F" & j).Value = wsSrc.Range("AA" & i & ":AF" & i).Value
                        .Range("J" & j & ":K" & j).Value = wsSrc.Range("AG" & i & ":AH" & i).Value
                        .Range("G" & j & ":H" & j).Value = wsSrc.Range("AE" & i & ":AF" & i).Value
                        j = j + 1
                    Else
                        srcValRow = wsSrc.Range("AA:AA").Find(what:=srcFndVal, after:=wsSrc.Range("AA4"), LookIn:=xlValues).Row
                        destValRow = wsDest.Range("A:A").Find(what:=srcFndVal, after:=wsDest.Range("A4"), LookIn:=xlValues).Row
                        .Range("B" & destValRow & ":F" & destValRow).Value = wsSrc.Range("AB" & srcValRow & ":AF" & srcValRow).Value
                        .Range("J" & destValRow & ":K" & destValRow).Value = wsSrc.Range("AG" & srcValRow & ":AH" & srcValRow).Value
                    End If
                Next
                For k = 4 To destLastRow
                    destFndVal = wsDest.Cells(k, "A")
                    Set srcFndCell = wsSrc.Range("AA:AA").Find(destFndVal, LookIn:=xlValues)
                    If srcFndCell Is Nothing And wsDest.Cells(k, "A").Value <> "" Then .Range("B" & k & ":F" & k).Value = vbNullString
                Next
            End With
        End If
    Next
    Application.ScreenUpdating = True
End Sub
子更新()
将wsSrc、wsDest设置为工作表
尺寸i,j,k为整数
将srcLastRow、destLastRow、srcValRow、destValRow的尺寸标注为长度
尺寸srcFndVal,de