遍历工作簿中的所有 Sheet 并 Copy/Paste 匹配摘要 Sheet
Loop Through All Sheets In Workbook And Copy/Paste Match To Summary Sheet
我正在尝试开发一个 Excel VBA sheet,其中有一个摘要 sheet。该程序必须循环遍历所有活动的 sheet,其中标题为“修订”,并且能够复制和粘贴最新修订工作中的所有内容sheet 如果当前修订 sheet 中没有任何内容 sheet。但是,如果它确实从以前的修订 sheet 中找到了某些内容,则它必须在该行的摘要 sheet 上进行反击。
例如,在摘要页面上会是这样的:
修订标题
0 苹果
遍历所有 sheets
在修订版 1 上查找苹果 sheet
将苹果版本 1 粘贴到摘要中 sheet
修订标题
1 个苹果
到目前为止,我的代码是这样的,但我认为它不在正确的轨道上,其中“BOM”是上面示例中的摘要 sheet。该代码还必须遍历所有行,直到它检测到第一个空白行,然后移动到下一个 sheet,直到不再有名称为“revision”的 sheet。
Dim wkst As Worksheet
Dim row As Long 'if you ever exceed 32,000 this will fail as integer
row = 1
For Each wkst In ActiveWorkbook.Worksheets
' loop through the Open worksheets
If wkst.Name <> "Summary" Then
Sheets("BOM").Range("B2").Value = Worksheets(I + 1).Range("B2")
Sheets(I + 1).Range("B2").Copy
Sheets("BOM").Range("B5").PasteSpecial xlPasteValues
row = row + 1
End If
Next
End Sub
对不起,我很难理解你想要什么。
特别是你提到了一个名为“summary”的 sheet 和一个名为“BOM”的 sheet。
无论如何,下面是我对你想要什么的猜测
代码假设上图中A列的数据是sheet“rev1”A列的数据,C列是sheetA列的数据“rev2”和E列是sheet“rev3”的A列中的数据。
目标是计算名称包含“rev”的所有 sheet 上所有现有数据的出现次数。
因此,根据图中所示的示例,预期结果是图片中 G 列的结果,它将被放入 sheet 中,名称为“摘要”A 列。例如:标题“AA”出现两次 (2 AA),一次在 sheet“rev1”中,一次在 sheet“rev2”中......标题“G”出现是四次 (4 GG),在 sheet "rev1" 中是一次,在 sheet "rev2" 中是两次,在 sheet "rev3" 中是一次......等等在。其他“rev”上不存在的标题 sheet 是唯一的,前缀为“1”。
Sub test()
Dim arr As Object: Set arr = CreateObject("scripting.dictionary")
Dim el As Variant
Dim sh As Worksheet
Dim cnt As Integer
Dim c as Range
For Each sh In Worksheets
If InStr(sh.Name, "rev") Then _
For Each c In sh.Range("A2", sh.Range("A" & Rows.Count).End(xlUp)): arr(c.Value) = 1: Next
Next
For Each el In arr
For Each sh In Worksheets
If InStr(sh.Name, "rev") Then cnt = cnt + Application.CountIf(sh.Range("A:A"), el)
Next sh
Sheets("summary").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = CStr(cnt) & " " & el
cnt = 0
Next el
End Sub
代码的作用:
它收集名称包含“rev”的每个 sheet 上的所有唯一值,从单元格 A2 开始到最后一个值进入变量 arr 的任何行。
然后它循环到 arr 中的每个元素,以计算每个 sheet 中名称包含“rev”的元素出现的次数,并将其保存到变量 cnt 中。
然后最后它在sheet“摘要”列A中写入cnt值和元素名称。
我正在尝试开发一个 Excel VBA sheet,其中有一个摘要 sheet。该程序必须循环遍历所有活动的 sheet,其中标题为“修订”,并且能够复制和粘贴最新修订工作中的所有内容sheet 如果当前修订 sheet 中没有任何内容 sheet。但是,如果它确实从以前的修订 sheet 中找到了某些内容,则它必须在该行的摘要 sheet 上进行反击。
例如,在摘要页面上会是这样的:
修订标题
0 苹果
遍历所有 sheets
在修订版 1 上查找苹果 sheet
将苹果版本 1 粘贴到摘要中 sheet
修订标题
1 个苹果
到目前为止,我的代码是这样的,但我认为它不在正确的轨道上,其中“BOM”是上面示例中的摘要 sheet。该代码还必须遍历所有行,直到它检测到第一个空白行,然后移动到下一个 sheet,直到不再有名称为“revision”的 sheet。
Dim wkst As Worksheet
Dim row As Long 'if you ever exceed 32,000 this will fail as integer
row = 1
For Each wkst In ActiveWorkbook.Worksheets
' loop through the Open worksheets
If wkst.Name <> "Summary" Then
Sheets("BOM").Range("B2").Value = Worksheets(I + 1).Range("B2")
Sheets(I + 1).Range("B2").Copy
Sheets("BOM").Range("B5").PasteSpecial xlPasteValues
row = row + 1
End If
Next
End Sub
对不起,我很难理解你想要什么。
特别是你提到了一个名为“summary”的 sheet 和一个名为“BOM”的 sheet。
无论如何,下面是我对你想要什么的猜测
代码假设上图中A列的数据是sheet“rev1”A列的数据,C列是sheetA列的数据“rev2”和E列是sheet“rev3”的A列中的数据。
目标是计算名称包含“rev”的所有 sheet 上所有现有数据的出现次数。
因此,根据图中所示的示例,预期结果是图片中 G 列的结果,它将被放入 sheet 中,名称为“摘要”A 列。例如:标题“AA”出现两次 (2 AA),一次在 sheet“rev1”中,一次在 sheet“rev2”中......标题“G”出现是四次 (4 GG),在 sheet "rev1" 中是一次,在 sheet "rev2" 中是两次,在 sheet "rev3" 中是一次......等等在。其他“rev”上不存在的标题 sheet 是唯一的,前缀为“1”。
Sub test()
Dim arr As Object: Set arr = CreateObject("scripting.dictionary")
Dim el As Variant
Dim sh As Worksheet
Dim cnt As Integer
Dim c as Range
For Each sh In Worksheets
If InStr(sh.Name, "rev") Then _
For Each c In sh.Range("A2", sh.Range("A" & Rows.Count).End(xlUp)): arr(c.Value) = 1: Next
Next
For Each el In arr
For Each sh In Worksheets
If InStr(sh.Name, "rev") Then cnt = cnt + Application.CountIf(sh.Range("A:A"), el)
Next sh
Sheets("summary").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = CStr(cnt) & " " & el
cnt = 0
Next el
End Sub
代码的作用:
它收集名称包含“rev”的每个 sheet 上的所有唯一值,从单元格 A2 开始到最后一个值进入变量 arr 的任何行。
然后它循环到 arr 中的每个元素,以计算每个 sheet 中名称包含“rev”的元素出现的次数,并将其保存到变量 cnt 中。
然后最后它在sheet“摘要”列A中写入cnt值和元素名称。