ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 用VBA跨表提数据,跪求大神!在线等!急~

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-4-2 12:32 | 显示全部楼层 |阅读模式
求大神!帮我解决下这个提数据宏程序。现在有两个excel表,一个是“提数据”、一个是“资源”。需要把“资源”里首页和至尾页中间的所有sheet页内容提取到“提数据”表的内容sheet页中,对应字段的内容需要匹配上。想哭、、、跪求大神帮忙啊。

模版.zip

10.74 KB, 下载次数: 59

附件

TA的精华主题

TA的得分主题

发表于 2018-4-2 12:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
不难实现,需要时间而已。

TA的精华主题

TA的得分主题

发表于 2018-4-2 13:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Option Explicit

Sub a()
        Dim cnn As Object
        Dim rs As Object
        Dim n%, s$, arr(1 To 999), i%, SQL$, BRR
        Set cnn = CreateObject("ADODB.CONNECTION")
        Set rs = CreateObject("adodb.Recordset")
        cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & ThisWorkbook.Path & "\资源.xls"
        Set rs = cnn.OpenSchema(20)
        Do Until rs.EOF
            If rs.Fields("TABLE_TYPE") = "TABLE" Then
                s = rs("TABLE_NAME").Value
                If s Like "*$*" Then
                    If Not s Like "*页*" Then
                        n = n + 1
                        arr(n) = Mid(s, 2, Len(s) - 2)
                    End If
                End If
            End If
            rs.MoveNext
        Loop
        rs.Close
        Set rs = Nothing
        cnn.Close
        [A5:R17] = ""
        cnn.Open "Provider=Microsoft.Jet.OleDb.4.0;Extended Properties='Excel 8.0;HDR=NO'; Data Source=" & ThisWorkbook.Path & "\资源.xls"
        For i = 1 To n
            SQL = "select * from [" & arr(i) & "B30:B30]"
            [C4].Offset(i, 0) = cnn.Execute(SQL)(0)
            SQL = "select * from [" & arr(i) & "H33:H33]"
            [C4].Offset(i, -2) = cnn.Execute(SQL)(0)
            SQL = "select * from [" & arr(i) & "B33:B33]"
            [C4].Offset(i, -1) = cnn.Execute(SQL)(0)
            SQL = "select * from [" & arr(i) & "D35:D43] UNION ALL select * from [" & arr(i) & "I35:I36] "
            BRR = cnn.Execute(SQL).GETROWS
             [C4].Offset(i, 1).Resize(1, 11) = BRR
             SQL = "select * from [" & arr(i) & "F46:F48]"
             BRR = cnn.Execute(SQL).GETROWS
            [C4].Offset(i, 12).Resize(1, 3) = BRR
        Next
    cnn.Close
    Set cnn = Nothing
    End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-2 15:28 | 显示全部楼层

太厉害了,大神。万分感谢。~~还差一个备注字段,没有匹配上。

TA的精华主题

TA的得分主题

发表于 2018-4-2 15:42 | 显示全部楼层
菜鸟呆瓜求带 发表于 2018-4-2 15:28
太厉害了,大神。万分感谢。~~还差一个备注字段,没有匹配上。

Option Explicit

Sub a()
        Dim cnn As Object
        Dim rs As Object
        Dim n%, s$, arr(1 To 999), i%, SQL$, BRR
        Set cnn = CreateObject("ADODB.CONNECTION")
        Set rs = CreateObject("adodb.Recordset")
        cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & ThisWorkbook.Path & "\资源.xls"
        Set rs = cnn.OpenSchema(20)
        Do Until rs.EOF
            If rs.Fields("TABLE_TYPE") = "TABLE" Then
                s = rs("TABLE_NAME").Value
                If s Like "*$*" Then
                    If Not s Like "*页*" Then
                        n = n + 1
                        arr(n) = Mid(s, 2, Len(s) - 2)
                    End If
                End If
            End If
            rs.MoveNext
        Loop
        rs.Close
        Set rs = Nothing
        cnn.Close
        [A5:R17] = ""
        cnn.Open "Provider=Microsoft.Jet.OleDb.4.0;Extended Properties='Excel 8.0;HDR=NO'; Data Source=" & ThisWorkbook.Path & "\资源.xls"
        For i = 1 To n
            SQL = "select * from [" & arr(i) & "B30:B30]"
            [C4].Offset(i, 0) = cnn.Execute(SQL)(0)
            SQL = "select * from [" & arr(i) & "H33:H33]"
            [C4].Offset(i, -2) = cnn.Execute(SQL)(0)
            SQL = "select * from [" & arr(i) & "B33:B33]"
            [C4].Offset(i, -1) = cnn.Execute(SQL)(0)
            SQL = "select * from [" & arr(i) & "D35:D43] UNION ALL select * from [" & arr(i) & "I35:I36] "
            BRR = cnn.Execute(SQL).GETROWS
             [C4].Offset(i, 1).Resize(1, 11) = BRR
             SQL = "select * from [" & arr(i) & "F46:F48]"
             BRR = cnn.Execute(SQL).GETROWS
            [C4].Offset(i, 12).Resize(1, 3) = BRR
            SQL = "select * from [" & arr(i) & "d49:d49]"
             [C4].Offset(i, 15) = cnn.Execute(SQL)(0)
        Next
    cnn.Close
    Set cnn = Nothing
    End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-4-2 16:28 | 显示全部楼层
Sub test()

Dim mypath$, mywb$, wb As Object, sht As Worksheet, arr(1 To 18, 1 To 3), i&, n&, sj$

mypath = ThisWorkbook.Path & "\"
mywb = mypath & "资源.xls"
Set wb = GetObject(mywb)

For Each sht In wb.Sheets
    If sht.Name <> "首页" And sht.Name <> "尾页" Then
        With sht
            arr(1, i) = .[H33]
            arr(2, i) = .[B33]
            arr(3, i) = .[B30]
            arr(13, i) = .[I35]
            arr(14, i) = .[I36]
            arr(15, i) = .[F46]
            arr(16, i) = .[F47]
            arr(17, i) = .[F48]
            arr(18, i) = .[D49]
            For n = 4 To 12
                arr(n, i) = .Cells(31 + n, 4)
            Next n
        End With
    End If
    i = i + 1
Next
ThisWorkbook.Sheets("内容").Range("A5:R7") = WorksheetFunction.Transpose(arr)

   
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-4-2 17:28 | 显示全部楼层
附件供测试参考:


模版.rar

16.14 KB, 下载次数: 98

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-3-20 08:58 | 显示全部楼层
数据多超过65336,别用ADO,太坑了。

TA的精华主题

TA的得分主题

发表于 2019-3-20 10:18 | 显示全部楼层
Sub 从外部Excel取数()
Debug.Print s.getcell(s.exceltoqax(ThisWorkbook.Path & "\资源.xls", "1$A29:A30"), 0, 0)
End Sub

用sqlcel函数只需要这一句就可以取出资源表名为1的sheet的A30单元格的值,具体可查sqlcelfuncs
https://sqlcel.com/sqlcelfuncs/

TA的精华主题

TA的得分主题

发表于 2023-4-1 23:46 | 显示全部楼层
lsc900707 发表于 2018-4-2 17:28
附件供测试参考:

版主老师好,这个函数用了很多年都可以,最近突然不行了,只能当前表内用,公式在另外一个sheet就替换不到值,不知道是什么原因啊?

Function fml(cel As Range)
Application.Volatile
ShName = cel.Parent.Name
fmltext = Replace(cel.Formula, "$", "")
fmltext = Replace(fmltext, "=", "")
Set regExp = CreateObject("VBScript.RegExp")
regExp.Pattern = "[A-Z]{1,2}\d{1,}"
regExp.Global = True
     
For Each i In regExp.Execute(fmltext)
fmltext = Replace(fmltext, i, Worksheets(ShName).Range(i).Text)
Next

fml = fmltext
End Function
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-19 23:16 , Processed in 0.050001 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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