【发布时间】:2019-11-29 11:58:53
【问题描述】:
对于比我更了解 VBA 的人来说,这可能真的很容易。如果是将行复制到新工作表中的情况,我可以看到如何执行此操作,但是在复制满足条件的第一个行后,我还没有弄清楚如何让它移动到下一行。我知道我需要告诉它寻找下一行,但我找不到正确的命令。
我希望让宏循环遍历我指定的数据范围,并将一次满足条件的一行复制到一个新的唯一工作簿中。例如,我有 10 条符合条件的记录,我想要输出 10 个工作簿,每个工作簿有一行数据。
目前的代码是:
Sub DPD()
Dim Ws As Worksheet
Dim Items As Range
Dim Item As Range
Set Ws = Worksheets("Out")
Set Items = Ws.Range("MyRange")
For Each Item In Items
Application.DisplayAlerts = False
'If value in column C > 0, copy row to new workbook and save
If Item.Value > 0 Then
'Select row in active Sheet to copy
Item.EntireRow.Copy
'Paste row into new spreadsheet
Workbooks.Add
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
ChDir "C:\DPD"
ActiveWorkbook.SaveAs Filename:="C:\DPD\pf_" & Format(CStr(Now), "yyy_mm_dd_hh_mm") & ".csv", FileFormat:=xlCSV
ActiveWindow.Close
Application.DisplayAlerts = True
End If
Next Item
链接到示例sheet
【问题讨论】:
-
问题可能出在您的命名
...Format(CStr(Now), "yyy_mm_dd_hh_mm")...- 您每分钟只会获得一次新文件名,但宏运行得更快,因此您的每个具有唯一行的文件都会被简单地覆盖。尝试添加一些计数器:dim counter as long,然后在每次迭代中使用...Format(CStr(Now), "yyy_mm_dd_hh_mm") & counter...和counter = counter +1更新循环。 -
将您的
For Each Item In Items更改为For Each Item In Items.Rows。然后引用您的单元格(即:If Item.Cells(1,1).Value > 0 Then)