ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 数组提取数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-4-29 07:39 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 张雄友 于 2015-4-29 07:43 编辑

数组提取数据,实现效果。

提取数据.rar

43.77 KB, 下载次数: 41

TA的精华主题

TA的得分主题

发表于 2015-4-29 08:55 | 显示全部楼层
        Do Until rs.EOF
                If rs.Fields("TABLE_TYPE") = "TABLE" Then
                    s = Replace(rs("TABLE_NAME").Value, "'", "")
                    If Right(s, 1) = "$" Then
                        SQL = "select 物品,型号,数量 from [" & s & "] where 物品 is not null"
                        
                        On Error Resume Next
                        Set rst = cnn.Execute(SQL)
                        If Err.Number = -2147217904 Then GoTo next0
                        On Error GoTo 0

                        
                        If Not rst.EOF Then
                        arr = rst.GetRows()
                        For i = 0 To UBound(arr, 2)
                         c = Split(Filepath(x), "\")
                                m = m + 1
                                For j = 1 To 3
                                    If Right(Filepath(x), 4) = ".xls" Then
                                              If InStr(Filepath(x), "\") Then
                                                  brr(m, -2) = c(0)
                                                 brr(m, -1) = Left(c(1), Len(c(1)) - 4)
                                                Else
                                                     brr(m, -2) = a(UBound(a))
                                                      brr(m, -1) = Left(Filepath(x), Len(Filepath(x)) - 4)
                                                 End If
                                    Else
                                               If InStr(Filepath(x), "\") Then
                                               brr(m, -2) = c(0)
                                                    brr(m, -1) = Left(c(1), Len(c(1)) - 5)
                                               Else
                                                      brr(m, -2) = a(UBound(a))
                                                        brr(m, -1) = Left(Filepath(x), Len(Filepath(x)) - 5)
                                                    End If
                                    End If
                                    brr(m, 0) = Replace(Replace(s, "$", ""), "'", "")
                                    brr(m, j) = arr(j - 1, i)
                               Next
                        Next
                    End If
                    End If
                End If
next0:
            rs.MoveNext
        Loop



加几行容错就可以了。

文件夹名,工作薄名,工作表名,都可以写进 Sql语句的。

比如:

SELECT Mypath AS 文件夹名,Filepath(x) AS 工作薄名, s AS 工作表名,* FROM [S$]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-4-29 12:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
marchwen01 发表于 2015-4-29 08:55
Do Until rs.EOF
                If rs.Fields("TABLE_TYPE") = "TABLE" Then
                 ...

解决了一个大问题:但是这种写法会出错,您看看。
SQL = "select Mypath AS 文件夹名,Filepath(x) AS 工作薄名, s AS 工作表名,物品,型号,数量 from [" & s & "] where 物品 is not null"



提取数据1.rar

47.09 KB, 下载次数: 31

TA的精华主题

TA的得分主题

发表于 2015-4-30 17:35 | 显示全部楼层
本帖最后由 marchwen01 于 2015-4-30 17:36 编辑
张雄友 发表于 2015-4-29 12:55
解决了一个大问题:但是这种写法会出错,您看看。
SQL = "select Mypath AS 文件夹名,Filepath(x) AS 工 ...


Mypath Filepath(x) 这些都是变量来的,你直接写肯定会出错了。

这所以要用一个容错语句,是因为有些工作簿里面有空的工作表,遍历到空的工作表时,取不到数据才出错的。

TA的精华主题

TA的得分主题

发表于 2015-4-30 17:36 | 显示全部楼层
做了一个,工作簿名和工作表名没加修整。

提取数据.rar

51.78 KB, 下载次数: 36

点评

这样是不对的,文件夹名怎么可能全部是:提取数据?有:14年,15年,提取数据才对。  发表于 2015-4-30 18:47

TA的精华主题

TA的得分主题

发表于 2015-4-30 19:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
又改了一下你的代码,实在是不敢再弄斧了。

提取数据.rar

60.79 KB, 下载次数: 29

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-4-30 21:44 | 显示全部楼层
marchwen01 发表于 2015-4-30 19:06
又改了一下你的代码,实在是不敢再弄斧了。

黄色单元格的文件夹名,是DD 才对。


提取数据22.rar

50.25 KB, 下载次数: 33

TA的精华主题

TA的得分主题

发表于 2015-5-2 08:58 | 显示全部楼层
本帖最后由 marchwen01 于 2015-5-2 09:02 编辑
张雄友 发表于 2015-4-30 21:44
黄色单元格的文件夹名,是DD 才对。


微调一下就可以了。

Sub GetData()
    Dim cnn As Object, rs As Object, SQL$, MyPath$, MyFile$, wb$, ws$, Folder$, x&, Filepath
    [A2:F65536].ClearContents
    With Application.FileDialog(msoFileDialogFolderPicker)
        .InitialFileName = ThisWorkbook.Path & "\"
        If .Show = False Then Exit Sub
        MyPath = .SelectedItems(1) & "\"
    End With
    Set cnn = CreateObject("ADODB.Connection")
    Folder = Split(MyPath, "\")(UBound(Split(MyPath, "\")) - 1)
    Filepath = GetName(MyPath)
   
    'cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & Filepath(x)
    Select Case Application.Version * 1
    Case Is <= 11
        strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;Imex=1;Hdr=Yes';Data source="
    Case Is >= 12
        strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;Imex=1;Hdr=Yes';Data Source="
    End Select


    For x = 0 To UBound(Filepath)
        cnn.Open strConn & Filepath(x)
        
        If InStr(Filepath(x), "\") > 0 Then Folder = Split(Filepath(x), "\")(UBound(Split(Filepath(x), "\")) - 1)        
        Set rs = cnn.OpenSchema(20)
        Do Until rs.EOF
            If rs.Fields("TABLE_TYPE") = "TABLE" Then
                wb = Replace(Filepath(x), ".xls", "")
                If InStr(wb, "\") > 0 Then wb = Split(wb, "\")(UBound(Split(wb, "\")))
                ws = Replace(rs("TABLE_NAME").Value, "'", "")
                SQL = "SELECT '" & Folder & "' AS 文件夹名,'" & wb & "' AS 工作簿名,'" & Replace(ws, "$", "") & "' AS 工作表名,物品,型号,数量 FROM [" & ws & "] "
               
                On Error Resume Next
                Set rst = cnn.Execute(SQL)
                If Err.Number = -2147217904 Then GoTo Next0
                Cells(Rows.Count, 1).End(3).Offset(1).CopyFromRecordset cnn.Execute(SQL)
            End If
Next0:
            On Error GoTo 0
            rs.movenext
        Loop
        cnn.Close
    Next
    [A1].CurrentRegion.Columns.AutoFit
    Set rs = Nothing
    Set cnn = Nothing
End Sub


select case 判断版本移出循环体外。(这个微调跟取错文件夹的错误没有关系)
截取文件夹名称的那个 If 前移了一下,在进入循环工作表之前运行就可以了。

TA的精华主题

TA的得分主题

发表于 2015-5-2 09:31 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请看附件,又改了一点点。

提取数据22.rar

50.71 KB, 下载次数: 34

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-8-24 10:34 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-12 18:59 , Processed in 0.027531 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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