【发布时间】:2018-06-19 00:04:32
【问题描述】:
我不确定我是否最有效地执行此操作,但如果它们是相同的产品,我会尝试将产品复制到新创建的工作表中。
例如,如果有 4 个产品是 "Apples",两个是 "Oranges"。然后我想为每个产品创建一个新工作表,以所述产品重命名新工作表,并将包含所述产品的每一行放入每个新工作表中。
目前,我的程序正在通过双循环运行。第一个循环遍历第一个工作表中的每一行,第二个循环遍历工作表名称。
我遇到的问题是第一个循环:代码为列表中的第一个产品创建了一个新工作表,这很好。但是列表中的下一个产品是相同的产品,因此应该将其放入新创建的工作表中。但是,我的代码创建了另一个新工作表,尝试在列表中的下一个产品之后重命名它,然后出错并说
“您不能以同名工作表命名工作表”。
现在这是一个 Catch-22,因为我的 if 语句应该捕获它,但它没有。
我正在运行这是一个外部工作簿,程序运行后,我会将其保存为不同的文件名,因此我不希望将日期粘贴到宏文件中,而是将其保存为单独的文件。
代码:
Dim fd As FileDialog
Dim tempWB As Workbook
Dim i As Integer
Dim rwCnt As Long
Dim rngSrt As Range
Dim shRwCnt As Long
Set fd = Application.FileDialog(msoFileDialogFilePicker)
For i = 1 To fd.SelectedItems.Count
Set tempWB = Workbooks.Open(fd.SelectedItems(i))
With tempWB.Worksheets(1)
For y = 3 To rwCnt
For Z = 1 To tempWB.Sheets.Count
If .Cells(y, 2).Value = tempWB.Sheets(Z).Name Then
.Rows(y).Copy
shRwCnt = tempWB.Worksheets(Z).Cells(Rows.Count, 1).End(xlUp).Row
tempWB.Worksheets(Sheets.Count).Range("A" & shRwCnt).PasteSpecial Paste:=xlPasteAllUsingSourceTheme, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
ElseIf tempWB.Sheets(Z).Name <> .Range("B" & y).Value Then
If Z = tempWB.Sheets.Count Then
.Range("A1:AQ2").Copy
tempWB.Worksheets.Add after:=tempWB.Worksheets(Sheets.Count)
tempWB.Worksheets(Sheets.Count).Name = .Cells(y, 2).Value
tempWB.Worksheets(Sheets.Count).Range("A1").PasteSpecial Paste:=xlPasteAllUsingSourceTheme, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
.Rows(y).Copy
tempWB.Worksheets(Sheets.Count).Range("A3").PasteSpecial Paste:=xlPasteAllUsingSourceTheme, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End If
End If
Next Z
Next y
End With
Next i
【问题讨论】:
-
您需要 1 个循环来遍历要扫描的工作表的所有行。在此循环中,检查是否存在具有产品名称的工作表。如果存在,则在其中找到下一个空闲行并过去您的数据。如果不存在,则添加具有该产品名称的工作表并粘贴到第 1 行。下一个循环。这就是所有的魔法。
标签: vba excel excel-2013