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