ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
123
返回列表 发新帖
楼主: ⑧技术π⑧

[求助] 按条件遍寻文件内容提取数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-5-26 09:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
直接上代码,请大神给优化一下,智障AI写的,改了好多次了
  1. Sub 汇总数据()
  2.     Dim 源目录1 As String
  3.     Dim 源目录2 As String
  4.     Dim 源目录3 As String
  5.     Dim 条件1 As String
  6.     Dim 条件2 As String
  7.     Dim 条件3 As String
  8.     Dim 条件4 As String
  9.     Dim 条件5 As String
  10.     Dim 目标文件 As String
  11.     Dim 目标工作簿 As Workbook
  12.     Dim 目标工作表 As Worksheet
  13.     Dim 源工作簿 As Workbook
  14.     Dim 源工作表 As Worksheet
  15.     Dim 目标行 As Long
  16.     Dim 列号 As Long
  17.     Dim 文件 As String
  18.     Dim 符合条件 As Boolean
  19.     Dim 单元格 As Range
  20.     Dim 值 As Variant
  21.    
  22.     ' 弹窗选择源目录
  23.     With Application.FileDialog(msoFileDialogFolderPicker)
  24.         .Title = "选择源目录1"
  25.         .AllowMultiSelect = False
  26.         If .Show = -1 Then
  27.             源目录1 = .SelectedItems(1) & ""
  28.         Else
  29.             MsgBox "未选择源目录1。"
  30.             Exit Sub
  31.         End If
  32.     End With
  33.    
  34.     With Application.FileDialog(msoFileDialogFolderPicker)
  35.         .Title = "选择源目录2"
  36.         .AllowMultiSelect = False
  37.         If .Show = -1 Then
  38.             源目录2 = .SelectedItems(1) & ""
  39.         Else
  40.             MsgBox "未选择源目录2。"
  41.             Exit Sub
  42.         End If
  43.     End With
  44.    
  45.      With Application.FileDialog(msoFileDialogFolderPicker)
  46.         .Title = "选择源目录3"
  47.         .AllowMultiSelect = False
  48.         If .Show = -1 Then
  49.             源目录3 = .SelectedItems(1) & ""
  50.         Else
  51.             MsgBox "未选择源目录3。"
  52.             Exit Sub
  53.         End If
  54.     End With
  55.    
  56.    
  57.     ' 设置条件
  58.     条件1 = InputBox("请输入条件1")
  59.     条件2 = InputBox("请输入条件2")
  60.     条件3 = InputBox("请输入条件3")
  61.     条件4 = InputBox("请输入条件4")
  62.     条件5 = InputBox("请输入条件5")
  63.    
  64.     目标文件 = "d:\目标文件.xlsX"  ' 替换为您的目标文件路径
  65.    
  66.     ' 创建目标工作簿并获取目标工作表
  67.     Set 目标工作簿 = Workbooks.Add
  68.     Set 目标工作表 = 目标工作簿.Worksheets(1)
  69.     目标行 = 1
  70.    
  71.     ' 处理目录1下的文件
  72. If Dir(源目录1, vbDirectory) <> "" Then
  73.     文件 = Dir(源目录1 & "*.*")
  74.    
  75.     Do While 文件 <> ""
  76.        If 文件 Like "*.csv" Or 文件 Like "*.xls" Or 文件 Like "*.xlsx" Then
  77.         
  78.         Set 源工作簿 = Workbooks.Open(源目录1 & 文件)
  79.         For Each 源工作表 In 源工作簿.Worksheets
  80.             列号 = 源工作表.UsedRange.Columns.Count
  81.             For Each 行号 In 源工作表.UsedRange.Rows
  82.                 符合条件 = False
  83.                 For Each 单元格 In 行号.Cells
  84.                     值 = 单元格.Value
  85.                     If (条件1 <> "" And InStr(1, 值, 条件1, vbTextCompare) > 0) Or (条件2 <> "" And InStr(1, 值, 条件2, vbTextCompare) > 0) Or (条件3 <> "" And InStr(1, 值, 条件3, vbTextCompare) > 0) Or (条件4 <> "" And InStr(1, 值, 条件4, vbTextCompare) > 0) Or (条件5 <> "" And InStr(1, 值, 条件5, vbTextCompare) > 0) Then
  86.                         符合条件 = True
  87.                         Exit For  ' 找到符合条件的单元格后退出当前循环
  88.                     End If
  89.                 Next 单元格
  90.                
  91.                 If 符合条件 Then
  92.                     行号.Copy  ' 复制整行数据
  93.                     目标工作表.Cells(目标行, 1).PasteSpecial xlPasteAll   ' 保留原格式粘贴
  94.                     目标工作表.Cells(目标行, 列号 + 1).Value = 源目录1 & " - " & 文件 & 源工作表.Name
  95.                     目标行 = 目标行 + 1
  96.                 End If
  97.             Next 行号
  98.         Next 源工作表
  99.         源工作簿.Close False
  100.         End If
  101.         文件 = Dir
  102.     Loop
  103. End If

  104. ' 处理目录2下的文件
  105. If Dir(源目录2, vbDirectory) <> "" Then
  106.     文件 = Dir(源目录2 & "*.*")
  107.     Do While 文件 <> ""
  108.        If 文件 Like "*.csv" Or 文件 Like "*.xls" Or 文件 Like "*.xlsx" Then
  109.         Set 源工作簿 = Workbooks.Open(源目录2 & 文件)
  110.         For Each 源工作表 In 源工作簿.Worksheets
  111.         列号 = 源工作表.UsedRange.Columns.Count
  112.             For Each 行号 In 源工作表.UsedRange.Rows
  113.                 符合条件 = False
  114.                 For Each 单元格 In 行号.Cells
  115.                     值 = 单元格.Value
  116.                     If (条件1 <> "" And InStr(1, 值, 条件1, vbTextCompare) > 0) Or (条件2 <> "" And InStr(1, 值, 条件2, vbTextCompare) > 0) Or (条件3 <> "" And InStr(1, 值, 条件3, vbTextCompare) > 0) Or (条件4 <> "" And InStr(1, 值, 条件4, vbTextCompare) > 0) Or (条件5 <> "" And InStr(1, 值, 条件5, vbTextCompare) > 0) Then
  117.                         符合条件 = True
  118.                         Exit For  ' 找到符合条件的单元格后退出当前循环
  119.                     End If
  120.                 Next 单元格
  121.                
  122.                 If 符合条件 Then
  123.                     行号.Copy  ' 复制整行数据
  124.                     目标工作表.Cells(目标行, 1).PasteSpecial xlPasteAll   ' 保留原格式粘贴
  125.                     目标工作表.Cells(目标行, 列号 + 1).Value = 源目录2 & " - " & 文件 & 源工作表.Name
  126.                     目标行 = 目标行 + 1
  127.                 End If
  128.             Next 行号
  129.         Next 源工作表
  130.         源工作簿.Close False
  131.         End If
  132.         文件 = Dir
  133.     Loop
  134. End If

  135.     ' 处理目录3下的文件
  136. If Dir(源目录3, vbDirectory) <> "" Then
  137.     文件 = Dir(源目录3 & "*.*")
  138.     Do While 文件 <> ""
  139.        If 文件 Like "*.csv" Or 文件 Like "*.xls" Or 文件 Like "*.xlsx" Then
  140.         Set 源工作簿 = Workbooks.Open(源目录3 & 文件)
  141.         For Each 源工作表 In 源工作簿.Worksheets
  142.         列号 = 源工作表.UsedRange.Columns.Count
  143.             For Each 行号 In 源工作表.UsedRange.Rows
  144.                 符合条件 = False
  145.                 For Each 单元格 In 行号.Cells
  146.                     值 = 单元格.Value
  147.                     If (条件1 <> "" And InStr(1, 值, 条件1, vbTextCompare) > 0) Or (条件2 <> "" And InStr(1, 值, 条件2, vbTextCompare) > 0) Or (条件3 <> "" And InStr(1, 值, 条件3, vbTextCompare) > 0) Or (条件4 <> "" And InStr(1, 值, 条件4, vbTextCompare) > 0) Or (条件5 <> "" And InStr(1, 值, 条件5, vbTextCompare) > 0) Then
  148.                         符合条件 = True
  149.                         Exit For  ' 找到符合条件的单元格后退出当前循环
  150.                     End If
  151.                 Next 单元格
  152.                
  153.                 If 符合条件 Then
  154.                     行号.Copy  ' 复制整行数据
  155.                     目标工作表.Cells(目标行, 1).PasteSpecial xlPasteAll   ' 保留原格式粘贴
  156.                     目标工作表.Cells(目标行, 列号 + 1).Value = 源目录3 & " - " & 文件 & 源工作表.Name
  157.                     目标行 = 目标行 + 1
  158.                 End If
  159.             Next 行号
  160.         Next 源工作表
  161.         源工作簿.Close False
  162.         End If
  163.         
  164.         文件 = Dir
  165.     Loop
  166. End If

  167.     ' 保存目标工作簿并关闭
  168.     Application.DisplayAlerts = False
  169.     目标工作簿.SaveAs 目标文件
  170.     Application.DisplayAlerts = True
  171.     目标工作簿.Close False
  172.    
  173.     MsgBox "汇总完成!"
  174. End Sub


复制代码

TA的精华主题

TA的得分主题

发表于 2023-5-26 10:37 | 显示全部楼层
这个应该用数据库处理比较简单

TA的精华主题

TA的得分主题

发表于 2023-5-26 11:39 | 显示全部楼层
疑惑的是CSV文件必须打开才能提取。一般xls文件是无需打开的,可以直接用union all把语句串起来。
360截图20230526113638016.jpg

提取文件内容.rar

29.92 KB, 下载次数: 7

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-26 13:35 | 显示全部楼层
grf1973 发表于 2023-5-26 10:37
这个应该用数据库处理比较简单

我也想过数据库存储数据然后再读取,不知道有没有这方面的建议,怎么处理

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-27 16:33 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-27 16:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ykcbf1100 发表于 2023-5-25 14:54
我做一个吧,模糊查询。

这个题目有二个难点吧,一是多目录提取文件名,二是模糊查询

不错不错,优秀

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-27 17:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
gwjkkkkk 发表于 2023-5-25 19:57
Option Explicit
Sub test()
    Dim ar, br, i&, j&, r&, f As Object, ff As Object, p$, s

ar(r, j) = br(i, j)   提示下标越界
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-16 09:01 , Processed in 0.038402 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表