新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

《新大榭》- 创大榭地方网络社区先锋品牌 新大榭始终专注于地方网络社区平台的建设 关于我们- [大记事]- 留言建议- [新手报道]

发布 .新大榭软件管家(Excel版) V6.0版 财务/仓库/生产/销售/采购/行政/人事/校园 .公告 - 客户 - 打赏 - 职场 - Excel - Python.

新大榭镜像-音乐-法律-图书-高中课堂-实验 广告是为了能更好的发展 [欢迎商家支持本站互利共赢] 广告位招租.首页黄金广告位等您来!联系 13566035181

查看: 864|回复: 4

[Excel课程] 不打开工作簿取得其他工作簿数据

[复制链接]
发表于 2020-4-5 20:45:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!

您需要 登录 才可以下载或查看,没有账号?注册

x
51-1        使用公式
  1. Sub CopyData_1()1 B% l0 c- S) W" H% {/ W$ H' ]& O
  2.       Dim Temp As String
    5 b# K7 H) L+ h1 [; z% ~4 R6 n
  3.       Temp = "'" & ThisWorkbook.Path & "\[数据表.xls]Sheet1'!"
    1 L3 X, n) u- A% ?1 M6 B. f, B8 q1 b
  4.       With Sheet1.Range("A1:F22")# Y: b2 N% \* E$ u8 y; j5 u
  5.           .FormulaR1C1 = "=" & Temp & "RC"
    % e- U3 q% P9 f: o. w6 d
  6.           .Value = .Value
    # P( D0 I7 ^; }. v! g
  7.       End With
    ) n! r5 l6 {4 Q) S
  8.   End Sub
复制代码

& A; n( \( V2 w5 F代码解析
6 B9 S7 }6 s" a; q3 |CopyData_1过程在工作表中写入公式引用“数据表”中同一位置单元格中的数据。; x4 Z8 l2 z3 C5 M( V
第3行代码将引用工作簿的路径赋给变量Temp。+ b+ Z+ O: t7 S' F+ }% V
第5行代码在作表中写入公式引用数据。/ W& @( v) {/ g
第6行代码将公式转换为数值。
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
Q群推荐 大榭本地求职招聘QQ群,欢迎转发分享本地招聘信息资讯! 官方招聘1群(已满);官方招聘2群:315816937 *
 楼主| 发表于 2020-4-5 21:46:28 | 显示全部楼层
51-2        使用GetObject函数
) C# o+ l# Z' C! b9 r
2 z1 a# @2 J# X0 I8 S
  1. Sub CopyData_2()
    4 c' M/ m4 {0 Q# c
  2.       Dim Wb As Workbook2 {5 m6 h9 _9 g3 N, X
  3.       Dim Temp As String7 c3 @0 O& {( y% x5 y
  4.       Application.ScreenUpdating = False. R& E' a4 l( J4 H( k
  5.       Temp = ThisWorkbook.Path & "\数据表.xls"
    0 I3 G: q# R/ K& E( k; C1 c
  6.       Set Wb = GetObject(Temp)
    * }% v. r. k7 s3 J2 \$ W8 t9 j5 y
  7.           With Wb.Sheets(1).Range("A1").CurrentRegion
    $ \2 b4 T% c- g2 C# I' S" D
  8.               Range("A1").Resize(.Rows.Count, .Columns.Count) = .Value% L; I% `$ @, s
  9.               Wb.Close False
    0 J$ x  f% W9 O1 X
  10.           End With' i; s) X: V$ j( @9 o" S* S
  11.       Set Wb = Nothing6 b: K# i' H" U; ?! p# f2 j
  12.       Application.ScreenUpdating = True
    " z( p& L7 K- [5 n
  13.   End Sub
复制代码
" k4 }2 d3 t) j  T0 J! w; H

: |6 R( d" n) a- E9 j# P' l代码解析% t& _1 Y. ~$ q, J# T) R" v. d
CopyData_2过程使用GetObject函数来获取“数据表”工作簿中的数据。
6 Y' D& y7 ~( i% w0 v. R第4行代码关闭屏幕更新加快运行速度。
/ W' K( u- Y5 `$ b2 Q第5行代码将引用工作簿的路径赋给变量Temp。
% g8 I! K8 w. L第6行代码使用Set语句将GetObject函数返回的对象赋给对象变量Wb。
4 j. f, w5 e  o, Z) N% A5 A0 MGetObject函数返回文件中的ActiveX对象的引用. J4 W6 U% R: q
参数pathname是可选的,包含待检索对象的文件的全路径和名称。如果省略,则class参数是必需的。
: d2 h: a: `) H参数class是可选的,代表该对象的类的字符串。# w# H3 d7 E) b6 }' o$ k
第7行到第10行代码,当GetObject函数指定的对象被激活之后,就可以在代码中使用对象变量Wb来访问这个对象的属性和方法。
9 h. T* e+ d/ i6 j其中第7、8行代码将“数据表”工作簿中的第1张工作表已使用区域的数据赋给本工作表的单元格,第9行代码关闭“数据表”工作簿,使用GetObject函数返回对象的引用时,虽然在窗口中看不到对象的实例,但实际上是打开的,所以需用Close语句将其关闭。7 s; @5 f2 i8 u# R$ F1 U) v1 }: |
第12行代码开启屏幕更新。
! Y- g% h" B6 _& t2 L7 L  B& t% R7 u4 f' a8 y) E6 N
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
新大榭官方公益帮帮群:6603298 官方Excel学习交流群:82064486  欢迎您加入
 楼主| 发表于 2020-4-5 21:48:16 | 显示全部楼层
51-3        隐藏Application对象2 _+ _% g/ q9 A7 F
通过隐藏Application对象来模拟不打开工作簿取数,如下面的代码所示。, p/ }9 ]8 i, v" o: b7 m) s
  1. Sub CopyData_3()
    & {& u$ X% f: Q4 Q
  2.       Dim myApp As New Application
    . |/ g' w' N; s: P. u5 ^7 z% V7 B
  3.       Dim Sh As Worksheet, }( l& k$ c- x8 j* ]9 J& U
  4.       Dim Temp As String7 o; H  v0 e' |. X* k2 A4 B
  5.       Temp = ThisWorkbook.Path & "\数据表.xls"+ }8 g, z2 G' P' R
  6.       myApp.Visible = False
    + O; ]: m4 ~, i% L
  7.       Set Sh = myApp.Workbooks.Open(Temp).Sheets(1)  k$ ?8 L6 h( ?" Z, E
  8.       With Sh.Range("A1").CurrentRegion
    7 C" I  G, L* V. b3 M9 `
  9.           Range("A1").Resize(.Rows.Count, .Columns.Count) = .Value
    9 \& h# y  K! u1 ~( g' s- k
  10.       End With2 R8 M5 b8 \! o" T3 w
  11.       myApp.Quit
    4 x1 s5 ?3 h& x+ k% ]) L: H5 ]' [
  12.       Set Sh = Nothing
    7 y# @- q! j& i5 n+ l5 z% n
  13.       Set myApp = Nothing
    , V) [# ~) Z6 I5 [
  14. End Sub
复制代码

3 |# u5 X4 b6 {代码解析
4 h5 {2 |0 [+ v2 ~- SCopyData_3过程隐藏Application对象来模拟不打开工作簿取数。
4 M" ^' v( c6 E7 ]第2行代码使用New关键字隐式地创建一个Application对象。
3 `& i. _7 D7 L2 h3 [# G第6行代码将新创建的Application对象的Visible属性设置为False,使之隐藏。# j9 w; A5 I- x9 M  L: A
第7行代码使用Open方法打开“数据表”工作簿(关于Open方法请参阅技巧42 ,因为工作簿是使用新创建的、隐藏的Application对象打开的,所以在窗口中是不可视的。& |7 e; f3 ]$ M5 Q
第8行到第10行代码将“数据表”工作簿中的第1张工作表已使用区域的数据赋给本工作表的单元格。
! ~. E$ |( j* z2 D+ n" c" V第11行代码使用Quit方法退出新打开的Excel程序。: a* r1 K2 {, B, E1 k' D
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
北仑单身女神专属群:181567400 北仑单身男神专属群:140788506  平台大数据筛选,勇敢为爱宣告,拒绝骚扰!
 楼主| 发表于 2020-4-5 21:50:52 | 显示全部楼层
51-4  使用ExecuteExcel4Macro方法
//  使用ExecuteExcel4Macro方法可以做到不打开工作簿的情况下获取其他工作薄中指定工作表的数据,如下面的代码所示。
  1. Sub CopyData_4(). h3 X' g/ I, L! Z
  2.       Dim RCount As Long
      p: ^: r& [6 O  t: R8 ]" ~+ |
  3.       Dim CCount As Long! F  j) W" }- z+ A9 p
  4.       Dim Temp As String- H% ]5 w; Z1 V! l. H: x
  5.       Dim Temp1 As String) G, a5 T, r5 k( l2 M3 k
  6.       Dim Temp2 As String5 V3 t5 k; d& ^
  7.       Dim Temp3 As String& z+ g% t' p/ F- R7 R/ q
  8.       Dim R As Long
    % ?0 s  [: ?+ j0 }
  9.       Dim C As Long/ p, K# h8 _. l8 N8 j2 U3 e
  10.       Dim arr() As Variant$ n+ B& l) b4 ]/ k3 v* U! g
  11.       Temp = "'" &ThisWorkbook.Path & "\[数据表.xls]Sheet1'!"# n7 T! T1 m! o) e3 c) |
  12.       Temp1 = Temp & Rows(1).Address(, ,xlR1C1)" y6 u. a3 C- C. N( [' O
  13.       Temp1 = "Counta(" & Temp1& ")"5 f# |" S- C( k8 |+ h2 z
  14.       CCount =Application.ExecuteExcel4Macro(Temp1)/ |6 ~2 a. H' `
  15.       Temp2 = Temp &Columns("A").Address(, , xlR1C1)
    1 L+ h$ q% k4 ?* L
  16.       Temp2 = "Counta(" & Temp2& ")"
    ; E* K. b3 u8 @
  17.       RCount = Application.ExecuteExcel4Macro(Temp2)
    ! u& @/ F4 S: P/ ^8 ?  Z" {
  18.       ReDim arr(1 To RCount, 1 To CCount)
    & O7 O" \' E- X+ G% T. X% |
  19.       For R = 1 To RCount
    $ I' y5 @, B0 d5 ^% T8 ?
  20.           For C = 1 To CCount
    * h( a$ J( \" I/ J8 A) x; w+ w% B$ T
  21.               Temp3 = Temp & Cells(R,C).Address(, , xlR1C1)) y3 q% l  Z9 J! i
  22.               arr(R, C) = Application.ExecuteExcel4Macro(Temp3)
    , p1 h/ t5 i. @8 O
  23.           Next. C6 P3 C7 `$ `" E1 g0 @0 Z3 X
  24.       Next
    & O# J* \7 @$ z1 \2 L8 p
  25.       Range("A1").Resize(RCount,CCount).Value = arr  U+ ~8 @/ r' G! j  D- Q3 J8 @7 i+ F' q- h
  26. End Sub
复制代码

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

# W% O2 e1 R% }) x
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
 楼主| 发表于 2020-4-5 21:56:55 | 显示全部楼层
51-5        使用SQL连接9 ~* [0 b, X* w2 `0 b
- z1 k; I1 Z6 L' b

4 a; _5 ]; U: w$ w/ d5 N; H3 [//  使用SQL建立与工作簿的连接,查询数据记录后复制到当前工作表中,如下面的代码所示。0 k  ?$ M5 j8 _0 C' s
  1. Sub CopyData_5()- G  c9 a7 U/ f5 ^" B
  2.       Dim Sql As String5 F4 B6 @; u. a: @
  3.       Dim j As Integer
    " U$ m6 V+ y$ B" n1 `
  4.       Dim R As Integer
    ! u  @$ i# j1 {7 D, g
  5.       Dim Cnn As ADODB.Connection
      R/ j3 X7 Z; Y+ |, ]8 _
  6.       Dim rs As ADODB.Recordset
      _1 v% u' G' v' f
  7.       With Sheet5- F3 N& F/ v; s' m
  8.           .Cells.Clear; Z; G; H9 C$ y* O5 R7 |
  9.           Set Cnn = New ADODB.Connection2 m2 E4 k, [3 B& ]' I* G6 ^
  10.           With Cnn: _7 K4 |9 I* o6 o, C
  11.               .Provider = "microsoft.jet.oledb.4.0"  u/ x2 H. v: H4 w, i
  12.               .ConnectionString = "Extended Properties=Excel 8.0;" _9 V5 H5 J1 b/ ^% q
  13.                   & "Data Source=" & ThisWorkbook.Path & "\数据表"
    4 n9 |; b* D% w& t& q
  14.               .Open2 L. y4 Y8 x- j6 V4 l6 H
  15.           End With
    ; [1 E  E* @) `" c* B+ a: d  u* j
  16.           Set rs = New ADODB.Recordset
    + o/ L7 ~' ?; g
  17.           Sql = "select * from [Sheet1$]"3 M7 Y& A6 B# L/ {3 o
  18.           rs.Open Sql, Cnn, adOpenKeyset, adLockOptimistic
    7 B$ ]0 E9 y( f4 D0 a
  19.               For j = 0 To rs.Fields.Count - 1
    8 g  w. X" }/ j; u& m( C: U4 a- T0 Z
  20.                   .Cells(1, j + 1) = rs.Fields(j).Name3 |% ]4 V+ m, X
  21.               Next+ H- L, `* R: o5 ~$ F2 m! ?
  22.           R = .Range("A65536").End(xlUp).Row1 F$ @" ^9 [/ ^. K; `9 s6 j
  23.           .Range("A" & R + 1).CopyFromRecordset rs  o2 {/ @' A3 A
  24.       End With
    & l3 }7 B! N7 H) r
  25.       rs.Close
    : E( K3 |, k& @, T
  26.       Cnn.Close5 t- o$ Z( V2 z( ?3 b$ Q
  27.       Set rs = Nothing
    4 b/ @2 I6 ?# g: j  x# B
  28.       Set Cnn = Nothing
    & W8 g& E: \4 G+ E0 f0 P
  29. End Sub
复制代码
3 U: M" Z2 f3 t; d
代码解析" m# ^: K$ d" G% d: N5 G  T/ x4 W0 K6 x
CopyData_5过程使建立与“数据表”工作簿的连接,查询数据记录后复制到当前工作表中。
( F% M, v4 K; ~第8行代码删除当前工作表的所有数据。6 p$ b% O! B" p: X7 b
第9行到第15行代码建立与“数据表”工作簿的连接。
% Y8 g- J# ]3 G! a( e, g7 F1 u第16行到第24行代码查询“数据表”工作簿的全部数据,并复制到工作表中。
4 e9 I7 J' _9 x第20行代码将字段名称(标题行)复制到工作表中,6 R3 ?# D; F8 F9 z% Z' x
第23行代码将查询到的数据记录复制到工作表。
1 w4 j3 M+ T5 Y" w# q$ u5 p: k* y8 r6 C. g3 M$ A& T3 f) ~

* w, _; g! y+ p: i, c# n" J0 h" U! O$ a4 j1 l

7 J3 p, X: Z; [: m: V% c/ O" j, S. Q! D. d
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
您需要登录后才可以回帖 登录 | 注册

本版积分规则

文字版|小黑屋|新大榭 ( 浙ICP备16018253号-1 )|点击这里给站长发消息|

GMT+8, 2026-8-26 21:40 , Processed in 0.077540 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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