在Excel的使用过程中,经常需要引用其他工作簿的数据,而用户往往希望能在不打开工作簿或看似不打开工作簿的情况下取得其他工作簿中的数据,有以下几种方法可以实现。

1、使用公式

如果需要引用的数据不是太多,可以使用公式取得引用工作簿中的工作表数据,如下面的代码所示。

Sub CopyData_1()Dim Temp As StringTemp = "'" & ThisWorkbook.Path & "\[数据表.xls]Sheet1'!"With Sheet1.Range("A1:F22").FormulaR1C1 = "=" & Temp & "RC".Value = .ValueEnd With
End Sub

复制代码
代码解析:
CopyData_1过程在工作表中写入公式引用“数据表”中同一位置单元格中的数据。
第3行代码将引用工作簿的路径赋给变量Temp。
第5行代码在作表中写入公式引用数据。
第6行代码将公式转换为数值。

2、使用GetObject函数

使用GetObject函数来获取对指定的Excel工作表的引用,如下面的代码所示。

Sub CopyData_2()Dim Wb As WorkbookDim Temp As StringApplication.ScreenUpdating = FalseTemp = ThisWorkbook.Path & "\数据表.xls"Set Wb = GetObject(Temp)With Wb.Sheets(1).Range("A1").CurrentRegionRange("A1").Resize(.Rows.Count, .Columns.Count) = .ValueWb.Close FalseEnd WithSet Wb = NothingApplication.ScreenUpdating = True
End Sub

复制代码
代码解析:
CopyData_2过程使用GetObject函数来获取“数据表”工作簿中的数据。
第4行代码关闭屏幕更新加快运行速度。
第5行代码将引用工作簿的路径赋给变量Temp。
第6行代码使用Set语句将GetObject函数返回的对象赋给对象变量Wb。
GetObject函数返回文件中的ActiveX对象的引用,语法如下:
GetObject([pathname] [, class])
参数pathname是可选的,包含待检索对象的文件的全路径和名称。如果省略,则class参数是必需的。
参数class是可选的,代表该对象的类的字符串。
Class参数的格式为appname.objecttype,语法的各个部分如表格 1所示。
部分    描述
appname    必需的,提供该对象的应用程序名称。
objecttype    必需的,待创建对象的类型或类。

表格 1 Class参数语法的各个部分
第7行到第10行代码,当GetObject函数指定的对象被激活之后,就可以在代码中使用对象变量Wb来访问这个对象的属性和方法。
其中第7、8行代码将“数据表”工作簿中的第1张工作表已使用区域的数据赋给本工作表的单元格,第9行代码关闭“数据表”工作簿,使用GetObject函数返回对象的引用时,虽然在窗口中看不到对象的实例,但实际上是打开的,所以需用Close语句将其关闭。
第12行代码开启屏幕更新。

3、隐藏Application对象

通过隐藏Application对象来模拟不打开工作簿取数,如下面的代码所示。

Sub CopyData_3()Dim myApp As New ApplicationDim Sh As WorksheetDim Temp As StringTemp = ThisWorkbook.Path & "\数据表.xls"myApp.Visible = FalseSet Sh = myApp.Workbooks.Open(Temp).Sheets(1)With Sh.Range("A1").CurrentRegionRange("A1").Resize(.Rows.Count, .Columns.Count) = .ValueEnd WithmyApp.QuitSet Sh = NothingSet myApp = Nothing
End Sub
复制代码

代码解析:
CopyData_3过程隐藏Application对象来模拟不打开工作簿取数。
第2行代码使用New关键字隐式地创建一个Application对象。
第6行代码将新创建的Application对象的Visible属性设置为False,使之隐藏。
第7行代码使用Open方法打开“数据表”工作簿(关于Open方法请参阅技巧42 ,因为工作簿是使用新创建的、隐藏的Application对象打开的,所以在窗口中是不可视的。
第8行到第10行代码将“数据表”工作簿中的第1张工作表已使用区域的数据赋给本工作表的单元格。
第11行代码使用Quit方法退出新打开的Excel程序。

4、使用ExecuteExcel4Macro方法

使用ExecuteExcel4Macro方法可以做到不打开工作簿的情况下获取其他工作薄中指定工作表的数据,如下面的代码所示。

Sub CopyData_4()Dim RCount As LongDim CCount As LongDim Temp As StringDim Temp1 As StringDim Temp2 As StringDim Temp3 As StringDim R As LongDim C As LongDim arr() As VariantTemp = "'" & ThisWorkbook.Path & "\[数据表.xls]Sheet1'!"Temp1 = Temp & Rows(1).Address(, , xlR1C1)Temp1 = "Counta(" & Temp1 & ")"CCount = Application.ExecuteExcel4Macro(Temp1)Temp2 = Temp & Columns("A").Address(, , xlR1C1)Temp2 = "Counta(" & Temp2 & ")"RCount = Application.ExecuteExcel4Macro(Temp2)ReDim arr(1 To RCount, 1 To CCount)For R = 1 To RCountFor C = 1 To CCountTemp3 = Temp & Cells(R, C).Address(, , xlR1C1)arr(R, C) = Application.ExecuteExcel4Macro(Temp3)NextNextRange("A1").Resize(RCount, CCount).Value = arr
End Sub

复制代码
代码解析:
CopyData_4过程使用ExecuteExcel4Macro方法获取“数据表”工作薄中指定工作表的数据。
第14、16行代码使用ExecuteExcel4Macro方法执行Counta函数取得“数据表”工作薄中指定工作表的行数和列数合计。
ExecuteExcel4Macro方法执行一个Microsoft Excel 4.0宏函数,然后返回此函数的结果,语法如下:
expression.ExecuteExcel4Macro(String)
参数expression是可选的,返回一个Application对象。
参数String是必需的,一个不带等号的Microsoft Excel 4.0宏语言函数,所有引用必须是像R1C1这样的字符串。
因为Microsoft Excel 4.0 宏不在当前工作簿或工作表的环境中求值,所有的引用都是外部引用,所以无需打开引用工作簿但是需要明确指定工作簿名称。
第18行代码使用ReDim语句为动态数组arr重新分配存储空间。
第19行到第24行代码循环取值,将“数据表”工作薄中指定工作表的数据赋给动态数组arr。
第25行代码将动态数组arr的值赋给工作表的单元格。

5、使用SQL连接

使用SQL建立与工作簿的连接,查询数据记录后复制到当前工作表中,如下面的代码所示。

Sub CopyData_5()Dim Sql As StringDim j As IntegerDim R As IntegerDim Cnn As ADODB.ConnectionDim rs As ADODB.RecordsetWith Sheet5.Cells.ClearSet Cnn = New ADODB.ConnectionWith Cnn.Provider = "microsoft.jet.oledb.4.0".ConnectionString = "Extended Properties=Excel 8.0;" _& "Data Source=" & ThisWorkbook.Path & "\数据表".OpenEnd WithSet rs = New ADODB.RecordsetSql = "select * from [Sheet1$]"rs.Open Sql, Cnn, adOpenKeyset, adLockOptimisticFor j = 0 To rs.Fields.Count - 1.Cells(1, j + 1) = rs.Fields(j).NameNextR = .Range("A65536").End(xlUp).Row.Range("A" & R + 1).CopyFromRecordset rsEnd Withrs.CloseCnn.CloseSet rs = NothingSet Cnn = Nothing
End Sub

复制代码
代码解析:
CopyData_5过程使建立与“数据表”工作簿的连接,查询数据记录后复制到当前工作表中。
第8行代码删除当前工作表的所有数据。
第9行到第15行代码建立与“数据表”工作簿的连接。
第16行到第24行代码查询“数据表”工作簿的全部数据,并复制到工作表中。其中第20行代码将字段名称(标题行)复制到工作表中,第23行代码将查询到的数据记录复制到工作表。

Excel VBA实例教程 #051:不打开工作簿取得其他工作簿数据相关推荐

  1. EXCEL VBA案例教程-李立宗-专题视频课程

    EXCEL VBA案例教程-645人已学习 课程介绍         该课程实现了一个人事管理系统. 该系统能够实现对数据的增加.删除.修改.查找等. 课程收益     通过学习该课程系统掌握VBA开 ...

  2. excel不同文件表格批量加表头vba_对多个Excel工作簿进行批量操作 | VBA实例教程...

    之前讲过怎样利用OPEN方法从多个Excel中获得数据,今天我们再来看一个类似的例子,这次我们不是从Excel中取数据,而是要对Excel进行一系列的操作,例如我们要对文件夹中的所有Excel的She ...

  3. Excel VBA基础教程

    1 VBA是什么 直到90年代早期,使应用程序自动化还是充满挑战性的领域.对每个需要自动化的应用程序,人们不得不学习一种不同的自动化语言.例如:可以用EXCEL的宏语言来使EXCEL自动化,使用WOR ...

  4. Excel VBA 实例

    创建一个新工作簿 Sub WbAdd()Dim Wb As Workbook, sht As WorksheetSet Wb = Workbooks.AddSet sht = Wb.Worksheet ...

  5. vba中dir用法_利用Dir函数遍历某文件夹下的所有文件 | VBA实例教程

    今天介绍利用Excel VBA的Dir方法来遍历某文件夹下的所有excel文件.还是直接来看例子,假设在D盘有一个叫工作日志的文件夹,里面放着每日的工作记录,都是excel 2007表格,现在由于工作 ...

  6. Excel VBA实例

    一直知道excel里面也可以做窗体,前段时间有个要在excel里生成随机数的劳务,于是研究了一下,记录一下 首先我用的是excel2007版,这个版本跟2003有些差异,开发工具并没有在正常视图里 调 ...

  7. Excel - VBA实例: 遍历若干cell的值

    在VBA里输入代码并运行以下的例子. 设置某个单元格的值为数值或字符串: Worksheets("Sheet1").Range("A1").Value = 3. ...

  8. python办公自动化(Excel)的实例教程

    这里写目录标题 一.读取Excel中的数据 二.新建Excel,写入数据 补充:Excel文件批量合并 一.读取Excel中的数据 安装 xlrd 只能读取Excel内容 pip install xl ...

  9. Excel VBA实例39 - 一键批量查询基金信息、基金净值

    大家好,我是永恒君! 最近和朋友交流了一下投资理财的信息,都谈到会想要配置部分基金,那首先自然是要了解一下基金的基本情况. 大部分的朋友查询基金的信息,都会在东方财富网上面进行查看,信息非常的全面. ...

最新文章

  1. keras 的 example 文件 mnist_swwae.py 解析
  2. 股市币市:数据分析与交易所最新公告(20190228)
  3. 带你「周游世界」的 MODNet 算法
  4. pandas dropna
  5. java B2B2C源码电子商城系统:服务消费(基础)
  6. 电路非门_【连载】电路和维修基础之门电路、转换器
  7. servlet设置session追踪模式
  8. css3 animatehue属性
  9. js 获取样式兼容方法
  10. 服务端构架干货:快节奏多人游戏的技术实现
  11. 一次 MySQL 索引面试,被面试官怼的体无完肤!
  12. 《深入浅出通信原理》连载1-562合集
  13. java爬虫 webcollector_Java爬虫-WebCollector | 学步园
  14. pytorch accuracy和Loss 的计算
  15. 模模搭古城搭建学习笔记2:基础设施篇
  16. 第 4 代 4 端口 HDMI/DVI 分配器龙迅LT86104SXE
  17. 参考三:容易误解读的量子擦除实验
  18. 继续教育公需课——人工智能技术及其发展趋势答案
  19. SpringBoot集成微信支付V3
  20. Win 10 企业版发大招 招招吸引SMB用户

热门文章

  1. Mybatis实现简单的数据库增删改查操作
  2. 数字孪生 3D 风电场,智慧风电之陆上风电
  3. Bentley 软件公司将基础设施数字孪生引入 NVIDIA Omniverse
  4. origin作图软件对已知坐标图形数据的提取
  5. 自闭症是什么吗?新手家长必读
  6. 使用jbox2d物理引擎打造摩拜单车贴纸动画效果
  7. 【Excel知识秒懂】$引用使用方法
  8. 鸿蒙os3月31号更新,华为鸿蒙OS最新Beta3月31日推送 商用最快4月启动
  9. Uniapp+SpringBoot即时通讯聊天安卓APP源码
  10. VUE3项目-飞机大战3