ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-5-25 14:54 | 显示全部楼层
我做一个吧,模糊查询。

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

提取文件内容.zip

34.7 KB, 下载次数: 31

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-5-25 16:15 | 显示全部楼层
经过多次调教智障AI,得出以下代码,可运行,但是速度喜人啊,求大神优化

TA的精华主题

TA的得分主题

发表于 2023-5-25 16:23 | 显示全部楼层
  1. Sub 汇总数据()
  2.     Dim 源目录1 As String
  3.     Dim 源目录2 As String
  4.     Dim 条件1 As String
  5.     Dim 条件2 As String
  6.     Dim 目标文件 As String
  7.     Dim 目标工作簿 As Workbook
  8.     Dim 目标工作表 As Worksheet
  9.     Dim 源工作簿 As Workbook
  10.     Dim 源工作表 As Worksheet
  11.     Dim 目标行 As Long
  12.     Dim 文件 As String
  13.     Dim 符合条件 As Boolean
  14.     Dim 单元格 As Range
  15.     Dim 值 As Variant
  16.    
  17.     ' 弹窗选择源目录
  18.     With Application.FileDialog(msoFileDialogFolderPicker)
  19.         .Title = "选择源目录1"
  20.         .AllowMultiSelect = False
  21.         If .Show = -1 Then
  22.             源目录1 = .SelectedItems(1) & ""
  23.         Else
  24.             MsgBox "未选择源目录1。"
  25.             Exit Sub
  26.         End If
  27.     End With
  28.    
  29.     With Application.FileDialog(msoFileDialogFolderPicker)
  30.         .Title = "选择源目录2"
  31.         .AllowMultiSelect = False
  32.         If .Show = -1 Then
  33.             源目录2 = .SelectedItems(1) & ""
  34.         Else
  35.             MsgBox "未选择源目录2。"
  36.             Exit Sub
  37.         End If
  38.     End With
  39.    
  40.     ' 设置条件
  41.     条件1 = InputBox("请输入条件1")
  42.     条件2 = InputBox("请输入条件2")
  43.     目标文件 = "d:\目标文件.xlsX"  ' 替换为您的目标文件路径
  44.    
  45.     ' 创建目标工作簿并获取目标工作表
  46.     Set 目标工作簿 = Workbooks.Add
  47.     Set 目标工作表 = 目标工作簿.Worksheets(1)
  48.     目标行 = 1
  49.    
  50.     ' 处理目录1下的文件
  51. If Dir(源目录1, vbDirectory) <> "" Then
  52.     文件 = Dir(源目录1 & "*.xls*")
  53.     Do While 文件 <> ""
  54.         Set 源工作簿 = Workbooks.Open(源目录1 & 文件)
  55.         For Each 源工作表 In 源工作簿.Worksheets
  56.             For Each 行号 In 源工作表.UsedRange.Rows
  57.                 符合条件 = False
  58.                 For Each 单元格 In 行号.Cells
  59.                     值 = 单元格.Value
  60.                     If (条件1 = "" Or InStr(1, 值, 条件1, vbTextCompare) > 0) Or (条件2 = "" Or InStr(1, 值, 条件2, vbTextCompare) > 0) Then
  61.                         符合条件 = True
  62.                         Exit For  ' 找到符合条件的单元格后退出当前循环
  63.                     End If
  64.                 Next 单元格
  65.                
  66.                 If 符合条件 Then
  67.                     行号.Copy  ' 复制整行数据
  68.                     目标工作表.Cells(目标行, 1).PasteSpecial xlPasteAll   ' 保留原格式粘贴
  69.                     目标工作表.Cells(目标行, 行号.Cells.Count + 1).Value = 文件 & " - " & 源目录1 & 源工作表.Name
  70.                     目标行 = 目标行 + 1
  71.                 End If
  72.             Next 行号
  73.         Next 源工作表
  74.         源工作簿.Close False
  75.         文件 = Dir
  76.     Loop
  77. End If

  78. ' 处理目录2下的文件
  79. If Dir(源目录2, vbDirectory) <> "" Then
  80.     文件 = Dir(源目录2 & "*.xls*")
  81.     Do While 文件 <> ""
  82.         Set 源工作簿 = Workbooks.Open(源目录2 & 文件)
  83.         For Each 源工作表 In 源工作簿.Worksheets
  84.             For Each 行号 In 源工作表.UsedRange.Rows
  85.                 符合条件 = False
  86.                 For Each 单元格 In 行号.Cells
  87.                     值 = 单元格.Value
  88.                     If (条件1 = "" Or InStr(1, 值, 条件1, vbTextCompare) > 0) Or (条件2 = "" Or InStr(1, 值, 条件2, vbTextCompare) > 0) Then
  89.                         符合条件 = True
  90.                         Exit For  ' 找到符合条件的单元格后退出当前循环
  91.                     End If
  92.                 Next 单元格
  93.                
  94.                 If 符合条件 Then
  95.                     行号.Copy  ' 复制整行数据
  96.                     目标工作表.Cells(目标行, 1).PasteSpecial xlPasteAll   ' 保留原格式粘贴
  97.                     目标工作表.Cells(目标行, 行号.Cells.Count + 1).Value = 文件 & " - " & 源目录2 & 源工作表.Name
  98.                     目标行 = 目标行 + 1
  99.                 End If
  100.             Next 行号
  101.         Next 源工作表
  102.         源工作簿.Close False
  103.         文件 = Dir
  104.     Loop
  105. End If

  106.    
  107.     ' 保存目标工作簿并关闭
  108.     Application.DisplayAlerts = False
  109.     目标工作簿.SaveAs 目标文件
  110.     Application.DisplayAlerts = True
  111.     目标工作簿.Close False
  112.    
  113.     MsgBox "汇总完成!"
  114. End Sub

复制代码

TA的精华主题

TA的得分主题

发表于 2023-5-25 19:57 | 显示全部楼层
Option Explicit
Sub test()
    Dim ar, br, i&, j&, r&, f As Object, ff As Object, p$, s
   
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    If Trim([E2].Value) <> "" Then s = [E2].Value Else Exit Sub
   
    With Sheets(2)
        With .[A1].CurrentRegion
        .Offset(1).Clear
        ar = .Resize(1000)
        r = 1
        End With
    End With
    p = ThisWorkbook.Path & "\"
    For Each ff In CreateObject("Scripting.FileSystemObject").GetFolder(p).subfolders
        For Each f In CreateObject("Scripting.FileSystemObject").GetFolder(ff.Path).Files
            If f.Name Like "*.csv" Then
                With GetObject(f)
                    br = .Sheets(1).[A1].CurrentRegion
                    For i = 2 To UBound(br)
                        If br(i, 5) = s Then
                            r = r + 1
                            For j = 1 To UBound(ar, 2)
                                ar(r, j) = br(i, j)
                            Next j
                        End If
                    Next i
                    .Close False
                End With
            End If
        Next
    Next
   
    With Sheets(2)
        With .[A1].Resize(r, UBound(ar, 2))
            .Value = ar
            .HorizontalAlignment = xlCenter
            .Borders.LineStyle = xlContinuous
        End With
        .Activate
    End With
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    Beep
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-5-25 20:00 | 显示全部楼层
参与一下。。。

提取文件内容.rar

32.94 KB, 下载次数: 12

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-5-25 20:50 | 显示全部楼层

你把ai写的代码套入楼主的附件中运行一下看看,你这个条件得手工输入的,总共有5个条件,而且,这5个条件允许有空。
我总得,对于复杂的题目,ai写的代码还无能为力。

TA的精华主题

TA的得分主题

发表于 2023-5-25 21:26 | 显示全部楼层
ykcbf1100 发表于 2023-5-25 20:50
你把ai写的代码套入楼主的附件中运行一下看看,你这个条件得手工输入的,总共有5个条件,而且,这5个条件 ...

我没看楼主的文件,我是从通用的角度去弄的,至于条件那更简单了,只要把设置条件那改一下就行,就是10个也没问题
If (条件1 = "" Or InStr(1, 值, 条件1, vbTextCompare) > 0) Or (条件2 = "" Or InStr(1, 值, 条件2, vbTextCompare) > 0) or (条件3 = "" Or InStr(1, 值, 条件3, vbTextCompare) > 0) Or (条件4 = "" Or InStr(1, 值, 条件4, vbTextCompare) > 0)Then

这只是思路问题,当然要有像您这样的牛人帮我的智障AI再优化一下,我觉得就更好了,以后可以当一个通用功能来用,爽啊

TA的精华主题

TA的得分主题

发表于 2023-5-25 21:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 ykcbf1100 于 2023-5-25 22:01 编辑
·遁去的一· 发表于 2023-5-25 21:26
我没看楼主的文件,我是从通用的角度去弄的,至于条件那更简单了,只要把设置条件那改一下就行,就是10个 ...

既然你觉得没问题,那你先用这个代码把楼主的问题先解决一下吧。
不要纸上谈兵。

TA的精华主题

TA的得分主题

发表于 2023-5-26 01:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
ykcbf1100 发表于 2023-5-25 21:59
既然你觉得没问题,那你先用这个代码把楼主的问题先解决一下吧。
不要纸上谈兵。

智障AI写的,把判断条件弄错了,我晕了,下面这个没问题,亲测,结果文件在D:\目标文件.xlsx
  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 String
  17.     Dim 符合条件 As Boolean
  18.     Dim 单元格 As Range
  19.     Dim 值 As Variant
  20.    
  21.     ' 弹窗选择源目录
  22.     With Application.FileDialog(msoFileDialogFolderPicker)
  23.         .Title = "选择源目录1"
  24.         .AllowMultiSelect = False
  25.         If .Show = -1 Then
  26.             源目录1 = .SelectedItems(1) & ""
  27.         Else
  28.             MsgBox "未选择源目录1。"
  29.             Exit Sub
  30.         End If
  31.     End With
  32.    
  33.     With Application.FileDialog(msoFileDialogFolderPicker)
  34.         .Title = "选择源目录2"
  35.         .AllowMultiSelect = False
  36.         If .Show = -1 Then
  37.             源目录2 = .SelectedItems(1) & ""
  38.         Else
  39.             MsgBox "未选择源目录2。"
  40.             Exit Sub
  41.         End If
  42.     End With
  43.    
  44.      With Application.FileDialog(msoFileDialogFolderPicker)
  45.         .Title = "选择源目录3"
  46.         .AllowMultiSelect = False
  47.         If .Show = -1 Then
  48.             源目录3 = .SelectedItems(1) & ""
  49.         Else
  50.             MsgBox "未选择源目录3。"
  51.             Exit Sub
  52.         End If
  53.     End With
  54.    
  55.    
  56.     ' 设置条件
  57.     条件1 = InputBox("请输入条件1")
  58.     条件2 = InputBox("请输入条件2")
  59.     条件3 = InputBox("请输入条件3")
  60.     条件4 = InputBox("请输入条件4")
  61.     条件5 = InputBox("请输入条件5")
  62.    
  63.     目标文件 = "d:\目标文件.xlsX"  ' 替换为您的目标文件路径
  64.    
  65.     ' 创建目标工作簿并获取目标工作表
  66.     Set 目标工作簿 = Workbooks.Add
  67.     Set 目标工作表 = 目标工作簿.Worksheets(1)
  68.     目标行 = 1
  69.    
  70.     ' 处理目录1下的文件
  71. If Dir(源目录1, vbDirectory) <> "" Then
  72.     文件 = Dir(源目录1 & "*.csv*")
  73.     Do While 文件 <> ""
  74.         Set 源工作簿 = Workbooks.Open(源目录1 & 文件)
  75.         For Each 源工作表 In 源工作簿.Worksheets
  76.             For Each 行号 In 源工作表.UsedRange.Rows
  77.                 符合条件 = False
  78.                 For Each 单元格 In 行号.Cells
  79.                     值 = 单元格.Value
  80.                     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
  81.                         符合条件 = True
  82.                         Exit For  ' 找到符合条件的单元格后退出当前循环
  83.                     End If
  84.                 Next 单元格
  85.                
  86.                 If 符合条件 Then
  87.                     行号.Copy  ' 复制整行数据
  88.                     目标工作表.Cells(目标行, 1).PasteSpecial xlPasteAll   ' 保留原格式粘贴
  89.                     目标工作表.Cells(目标行, 行号.Cells.Count + 1).Value = 源目录1 & " - " & 文件 & 源工作表.Name
  90.                     目标行 = 目标行 + 1
  91.                 End If
  92.             Next 行号
  93.         Next 源工作表
  94.         源工作簿.Close False
  95.         文件 = Dir
  96.     Loop
  97. End If

  98. ' 处理目录2下的文件
  99. If Dir(源目录2, vbDirectory) <> "" Then
  100.     文件 = Dir(源目录2 & "*.csv")
  101.     Do While 文件 <> ""
  102.         Set 源工作簿 = Workbooks.Open(源目录2 & 文件)
  103.         For Each 源工作表 In 源工作簿.Worksheets
  104.             For Each 行号 In 源工作表.UsedRange.Rows
  105.                 符合条件 = False
  106.                 For Each 单元格 In 行号.Cells
  107.                     值 = 单元格.Value
  108.                     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
  109.                         符合条件 = True
  110.                         Exit For  ' 找到符合条件的单元格后退出当前循环
  111.                     End If
  112.                 Next 单元格
  113.                
  114.                 If 符合条件 Then
  115.                     行号.Copy  ' 复制整行数据
  116.                     目标工作表.Cells(目标行, 1).PasteSpecial xlPasteAll   ' 保留原格式粘贴
  117.                     目标工作表.Cells(目标行, 行号.Cells.Count + 1).Value = 源目录2 & " - " & 文件 & 源工作表.Name
  118.                     目标行 = 目标行 + 1
  119.                 End If
  120.             Next 行号
  121.         Next 源工作表
  122.         源工作簿.Close False
  123.         文件 = Dir
  124.     Loop
  125. End If

  126.     ' 处理目录3下的文件
  127. If Dir(源目录3, vbDirectory) <> "" Then
  128.     文件 = Dir(源目录2 & "*.csv")
  129.     Do While 文件 <> ""
  130.         Set 源工作簿 = Workbooks.Open(源目录2 & 文件)
  131.         For Each 源工作表 In 源工作簿.Worksheets
  132.             For Each 行号 In 源工作表.UsedRange.Rows
  133.                 符合条件 = False
  134.                 For Each 单元格 In 行号.Cells
  135.                     值 = 单元格.Value
  136.                     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
  137.                         符合条件 = True
  138.                         Exit For  ' 找到符合条件的单元格后退出当前循环
  139.                     End If
  140.                 Next 单元格
  141.                
  142.                 If 符合条件 Then
  143.                     行号.Copy  ' 复制整行数据
  144.                     目标工作表.Cells(目标行, 1).PasteSpecial xlPasteAll   ' 保留原格式粘贴
  145.                     目标工作表.Cells(目标行, 行号.Cells.Count + 1).Value = 源目录3 & " - " & 文件 & 源工作表.Name
  146.                     目标行 = 目标行 + 1
  147.                 End If
  148.             Next 行号
  149.         Next 源工作表
  150.         源工作簿.Close False
  151.         文件 = Dir
  152.     Loop
  153. End If

  154.     ' 保存目标工作簿并关闭
  155.     Application.DisplayAlerts = False
  156.     目标工作簿.SaveAs 目标文件
  157.     Application.DisplayAlerts = True
  158.     目标工作簿.Close False
  159.    
  160.     MsgBox "汇总完成!"
  161. End Sub


复制代码


提取数据.7z

21.13 KB, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2023-5-26 09:07 | 显示全部楼层
·遁去的一· 发表于 2023-5-26 01:11
智障AI写的,把判断条件弄错了,我晕了,下面这个没问题,亲测,结果文件在D:\目标文件.xlsx

发现个问题,就是当文件格式为xlsx时会报错,应该是列字段数超范围了,还得再改一下
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-16 08:59 , Processed in 0.044115 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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