|
是的,使用VBA宏可以实现您的需求。以下是一个示例代码,它会让用户选择文件夹,然后读取该文件夹中所有xls和xlsx文件的数据(以只读方式打开,避免修改原始文件),并根据条件合并到新工作簿的“合并结果”工作表中。
代码思路:
- 使用文件对话框让用户选择文件夹。
- 创建新工作簿作为合并目标。
- 遍历文件夹中的xls和xlsx文件,以只读方式打开每个文件。
- 检查每个工作表中的数据,应用条件筛选(示例条件为第一列数值大于10)。
- 将符合条件的数据行复制到目标工作簿。
- 完成后提示用户。
示例代码:
- Sub MergeFilesFromFolder()
- Dim folderPath As String
- Dim file As String
- Dim wbSource As Workbook
- Dim wsSource As Worksheet
- Dim wbTarget As Workbook
- Dim wsTarget As Worksheet
- Dim lastRow As Long
- Dim i As Long
- Dim fDialog As FileDialog
-
- ' 让用户选择文件夹
- Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)
- fDialog.Title = "请选择包含Excel文件的文件夹"
- If fDialog.Show = -1 Then
- folderPath = fDialog.SelectedItems(1)
- Else
- MsgBox "未选择文件夹,操作取消。"
- Exit Sub
- End If
-
- ' 创建新工作簿作为目标
- Set wbTarget = Workbooks.Add
- Set wsTarget = wbTarget.Sheets(1)
- wsTarget.Name = "合并结果"
-
- ' 先处理xls文件
- file = Dir(folderPath & "\*.xls")
- Do While file <> ""
- Set wbSource = Workbooks.Open(folderPath & "" & file, ReadOnly:=True)
- For Each wsSource In wbSource.Sheets
- lastRow = wsSource.Cells(wsSource.Rows.Count, 1).End(xlUp).Row
- For i = 1 To lastRow
- ' 示例条件:第一列是数值且大于10(可根据需要修改)
- If IsNumeric(wsSource.Cells(i, 1).Value) And wsSource.Cells(i, 1).Value > 10 Then
- wsSource.Rows(i).Copy wsTarget.Cells(wsTarget.Rows.Count, 1).End(xlUp).Offset(1, 0)
- End If
- Next i
- Next wsSource
- wbSource.Close SaveChanges:=False ' 关闭而不保存
- file = Dir
- Loop
-
- ' 再处理xlsx文件
- file = Dir(folderPath & "\*.xlsx")
- Do While file <> ""
- Set wbSource = Workbooks.Open(folderPath & "" & file, ReadOnly:=True)
- For Each wsSource In wbSource.Sheets
- lastRow = wsSource.Cells(wsSource.Rows.Count, 1).End(xlUp).Row
- For i = 1 To lastRow
- If IsNumeric(wsSource.Cells(i, 1).Value) And wsSource.Cells(i, 1).Value > 10 Then
- wsSource.Rows(i).Copy wsTarget.Cells(wsTarget.Rows.Count, 1).End(xlUp).Offset(1, 0)
- End If
- Next i
- Next wsSource
- wbSource.Close SaveChanges:=False
- file = Dir
- Loop
-
- MsgBox "合并完成!结果已保存到新工作簿。"
- End Sub
复制代码
如何使用:
1. 在Excel中按Alt+F11打开VBA编辑器。
2. 插入新模块(通过菜单插入 -> 模块)。
3. 粘贴上述代码到模块中。
4. 按F5运行宏,根据提示选择文件夹。
自定义条件:
- 修改代码中的条件部分(If IsNumeric(wsSource.Cells(i, 1).Value) And wsSource.Cells(i, 1).Value > 10 Then)。
- 例如,多条件可改为:If wsSource.Cells(i, 1).Value = "A" And wsSource.Cells(i, 2).Value > 100 Then。
- 要合并特定列,可改用wsSource.Range("A:C")代替Rows(i)。
注意事项:
- 此代码不会修改原始文件,因为以只读方式打开。
- 合并结果保存在新创建的工作簿中,请及时保存。
- 如果数据量较大,运行时间可能较长。
如果您需要更复杂的条件(如基于多个工作表或动态范围),可以进一步调整代码。欢迎继续提问!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|