




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、從關(guān)閉的工作簿中取值有多種方法,現(xiàn)將網(wǎng)上收集的整理向大家共享。方法1、使用公式方法2、使用GetObject函數(shù)方法3、隱藏Application對象方法4、使用ExecuteExcel4Macro方法方法5、使用SQL連接其它收集的相關(guān)內(nèi)容1、使用公式如果需要引用的數(shù)據(jù)不是太多,可以使用公式取得引用工作簿中的工作表數(shù)據(jù),如下面的代碼所示。1. Sub CopyData_1()2. Dim Temp As String3. Temp = "'" & ThisWorkbook.Path & &qu
2、ot;數(shù)據(jù)表.xlsSheet1'!"4. With Sheet1.Range("A1:F22")5. .FormulaR1C1 = "=" & Temp & "RC"6. .Value = .Value7. End With8. End Sub代碼解析:CopyData_1過程在工作表中寫入公式
3、引用“數(shù)據(jù)表”中同一位置單元格中的數(shù)據(jù)。第3行代碼將引用工作簿的路徑賦給變量Temp。第5行代碼在作表中寫入公式引用數(shù)據(jù)。第6行代碼將公式轉(zhuǎn)換為數(shù)值。2、使用GetObject函數(shù) (返回目錄)使用GetObject函數(shù)來獲取對指定的Excel工作表的引用,如下面的代碼所示。1. Sub CopyData_2()2. Dim Wb As Workbook3. Dim Temp As String4. Application.ScreenUpdating = False5. Temp
4、= ThisWorkbook.Path & "數(shù)據(jù)表.xls"6. Set Wb = GetObject(Temp)7. With Wb.Sheets(1).Range("A1").CurrentRegion8. Range("A1").Resize(.Rows.Count, .Columns.Count) = .Valu
5、e9. Wb.Close False10. End With11. Set Wb = Nothing12. Application.ScreenUpdating = True13. End Sub代碼解析:CopyData_2過程使用GetObject函數(shù)來獲取“數(shù)據(jù)表”工作簿中的數(shù)據(jù)。第4行代碼關(guān)閉屏幕更新加快運(yùn)行速度。第5行代碼將引用工作簿的路徑賦給變量Te
6、mp。第6行代碼使用Set語句將GetObject函數(shù)返回的對象賦給對象變量Wb。GetObject函數(shù)返回文件中的ActiveX對象的引用,語法如下:GetObject(pathname , class)參數(shù)pathname是可選的,包含待檢索對象的文件的全路徑和名稱。如果省略,則class參數(shù)是必需的。參數(shù)class是可選的,代表該對象的類的字符串。Class參數(shù)的格式為appname.objecttype,語法的各個部分如表格 1所示。部分描述appname必需的,提供該對象的應(yīng)用程序名稱。objecttype必需的,待創(chuàng)建對象的類型或類。表格 1 Class參數(shù)語法的各個部分第7行到第
7、10行代碼,當(dāng)GetObject函數(shù)指定的對象被激活之后,就可以在代碼中使用對象變量Wb來訪問這個對象的屬性和方法。其中第7、8行代碼將“數(shù)據(jù)表”工作簿中的第1張工作表已使用區(qū)域的數(shù)據(jù)賦給本工作表的單元格,第9行代碼關(guān)閉“數(shù)據(jù)表”工作簿,使用GetObject函數(shù)返回對象的引用時,雖然在窗口中看不到對象的實例,但實際上是打開的,所以需用Close語句將其關(guān)閉。第12行代碼開啟屏幕更新。3、隱藏Application對象(返回目錄)通過隱藏Application對象來模擬不打開工作簿取數(shù),如下面的代碼所示。1. Sub CopyData_3()2. Dim myApp
8、 As New Application3. Dim Sh As Worksheet4. Dim Temp As String5. Temp = ThisWorkbook.Path & "數(shù)據(jù)表.xls"6. myApp.Visible = False7. Set Sh = myApp.Workbooks.Open(Temp).Sheets(1)8. With Sh.Range("A1&quo
9、t;).CurrentRegion9. Range("A1").Resize(.Rows.Count, .Columns.Count) = .Value10. End With11. myApp.Quit12. Set Sh = Nothing13. Set myApp = Nothing14. End Sub代碼解析:CopyData_3過程隱藏Application對象來模擬不打開工作
10、簿取數(shù)。第2行代碼使用New關(guān)鍵字隱式地創(chuàng)建一個Application對象。第6行代碼將新創(chuàng)建的Application對象的Visible屬性設(shè)置為False,使之隱藏。第7行代碼使用Open方法打開“數(shù)據(jù)表”工作簿(關(guān)于Open方法請參閱技巧42 ,因為工作簿是使用新創(chuàng)建的、隱藏的Application對象打開的,所以在窗口中是不可視的。第8行到第10行代碼將“數(shù)據(jù)表”工作簿中的第1張工作表已使用區(qū)域的數(shù)據(jù)賦給本工作表的單元格。第11行代碼使用Quit方法退出新打開的Excel程序。4、使用ExecuteExcel4Macro方法(返回目錄)使用ExecuteExcel4Macro方法可以做
11、到不打開工作簿的情況下獲取其他工作薄中指定工作表的數(shù)據(jù),如下面的代碼所示。1. Sub CopyData_4()2. Dim RCount As Long3. Dim CCount As Long4. Dim Temp As String5. Dim Temp1 As String6. Dim Temp2 As String7. Dim Temp3 As String8. Dim R As Long9
12、. Dim C As Long10. Dim arr() As Variant11. Temp = "'" & ThisWorkbook.Path & "數(shù)據(jù)表.xlsSheet1'!"12. Temp1 = Temp & Rows(1).Address(, , xlR1C1)13. Temp1 = "Counta(" & Temp1 & &
13、quot;)"14. CCount = Application.ExecuteExcel4Macro(Temp1)15. Temp2 = Temp & Columns("A").Address(, , xlR1C1)16. Temp2 = "Counta(" & Temp2 & ")"17. RCount = Application.ExecuteExcel4Macro(Temp2)18.
14、 ReDim arr(1 To RCount, 1 To CCount)19. For R = 1 To RCount20. For C = 1 To CCount21. Temp3 = Temp & Cells(R, C).Address(, , xlR1C1)22.
15、0; arr(R, C) = Application.ExecuteExcel4Macro(Temp3)23. Next24. Next25. Range("A1").Resize(RCount, CCount).Value = arr26. End Sub代碼解析:CopyData_4過程使用ExecuteExcel4Macro方法獲取“數(shù)據(jù)表”工作薄中指定工作表的數(shù)據(jù)。第14、16行代碼使用ExecuteExcel4Macro方
16、法執(zhí)行Counta函數(shù)取得“數(shù)據(jù)表”工作薄中指定工作表的行數(shù)和列數(shù)合計。ExecuteExcel4Macro方法執(zhí)行一個Microsoft Excel 4.0宏函數(shù),然后返回此函數(shù)的結(jié)果,語法如下:expression.ExecuteExcel4Macro(String)參數(shù)expression是可選的,返回一個Application對象。參數(shù)String是必需的,一個不帶等號的Microsoft Excel 4.0宏語言函數(shù),所有引用必須是像R1C1這樣的字符串。因為Microsoft Excel 4.0 宏不在當(dāng)前工作簿或工作表的環(huán)境中求值,所有的引用都是外部引用,所以無需打開引用工作簿但
17、是需要明確指定工作簿名稱。第18行代碼使用ReDim語句為動態(tài)數(shù)組arr重新分配存儲空間。第19行到第24行代碼循環(huán)取值,將“數(shù)據(jù)表”工作薄中指定工作表的數(shù)據(jù)賦給動態(tài)數(shù)組arr。第25行代碼將動態(tài)數(shù)組arr的值賦給工作表的單元格。5、使用SQL連接(返回目錄)使用SQL建立與工作簿的連接,查詢數(shù)據(jù)記錄后復(fù)制到當(dāng)前工作表中,如下面的代碼所示。1. Sub CopyData_5()2. Dim Sql As String3. Dim j As Integer4. Dim R As Integer5.
18、 Dim Cnn As ADODB.Connection6. Dim rs As ADODB.Recordset7. With Sheet58. .Cells.Clear9. Set Cnn = New ADODB.Connection10. With Cnn11.
19、; .Provider = "microsoft.jet.oledb.4.0"12. .ConnectionString = "Extended Properties=Excel 8.0;" _13. & "Data Source="
20、; & ThisWorkbook.Path & "數(shù)據(jù)表"14. .Open15. End With16. Set rs = New ADODB.Recordset17. Sql = "select * from Shee
21、t1$"18. rs.Open Sql, Cnn, adOpenKeyset, adLockOptimistic19. For j = 0 To rs.Fields.Count - 120. .Cells(1, j + 1) = rs.Fields(j).Name21.
22、60; Next22. R = .Range("A65536").End(xlUp).Row23. .Range("A" & R + 1).CopyFromRecordset rs24. End With25. rs.Close26.
23、160; Cnn.Close27. Set rs = Nothing28. Set Cnn = Nothing29. End Sub代碼解析:CopyData_5過程使建立與“數(shù)據(jù)表”工作簿的連接,查詢數(shù)據(jù)記錄后復(fù)制到當(dāng)前工作表中。第8行代碼刪除當(dāng)前工作表的所有數(shù)據(jù)。第9行到第15行代碼建立與“數(shù)據(jù)表”工作簿的連接。第16行到第24行代碼查詢“數(shù)據(jù)表”工作簿的全部數(shù)據(jù),并復(fù)制到工作表中。其中第20行代碼將字段名稱(標(biāo)題行)復(fù)制到工作表中,第23行代碼將查詢到的數(shù)據(jù)記錄復(fù)制到工作表。其它收集的相關(guān)內(nèi)容:(返回目錄)示例代碼1:Sub tes
24、tGetValuesFromClosedWorkbook() GetValuesFromAClosedWorkbook "C:", "Book1.xls", "Sheet1", "A1:G20"End Sub Sub GetValuesFromAClosedWorkbook(fPath As String, _ fName As String, sName, cellRange As String) With ActiveSheet.Range(cellRange) .FormulaArray = &qu
25、ot;='" & fPath & "" & fName & "" _ & sName & "'!" & cellRange .Value = .Value End WithEnd Sub本示例包含一個子過程GetValuesFromAClosedWorkbook,用來從已關(guān)閉的工作簿中獲取數(shù)據(jù),主過程testGetValuesFromClosedWorkbook用來傳遞參數(shù)。本示例表示從C盤根目錄下的Book1.xls工作簿的工作表Sheet1中的A1:
26、G20單元格區(qū)域內(nèi)獲取數(shù)據(jù),并將其復(fù)制到當(dāng)前工作表相應(yīng)單元格區(qū)域中。示例代碼2:已前面的代碼相似,下面的VBA代碼從關(guān)閉的工作簿中獲取值。Sub ExtractDataFromClosedWorkBook() Application.ScreenUpdating = False '創(chuàng)建鏈接來從關(guān)閉的工作簿中獲取數(shù)據(jù) '可以將相關(guān)代碼修改為相應(yīng)的路徑和單元格 With Sheet1!A1:B4 .Value = "='" & ActiveWorkbook.Path & "testDataWorkbook
27、.xlsSheet1'!A1:B4" '刪除鏈接 .Value = .Value End With Application.ScreenUpdating = True End Sub其中,可以將代碼中的路徑修改為需要從中獲取值的工作簿的路徑,單元格也作相應(yīng)的修改。示例代碼3:Sub GetDataFromClosedWorkbook() Dim wb As Workbook Application.ScreenUpdating = False '以只讀方式打開工作簿 Set wb = Workbooks.Open("C:文件夾名
28、文件.xls", True, True) With ThisWorkbook.Worksheets("工作表名") '從工作簿中讀取數(shù)據(jù) .Range("A10").Formula = wb.Worksheets("源工作表名").Range("A10").Formula .Range("A11").Formula = wb.Worksheets("源工作表名").Range("A20").Formula .Range("A12
29、").Formula = wb.Worksheets("源工作表名").Range("A30").Formula .Range("A13").Formula = wb.Worksheets("源工作表名").Range("A40").Formula End With wb.Close False '關(guān)閉打開的源數(shù)據(jù)工作簿且不保存任何變化 Set wb = Nothing '釋放內(nèi)存 Application.ScreenUpdating = TrueEnd Sub在運(yùn)行程
30、序時,打開所要獲取數(shù)據(jù)的工作簿,當(dāng)取得數(shù)據(jù)后再關(guān)閉該工作簿。將屏幕更新屬性值設(shè)置為False,將看不出源數(shù)據(jù)工作簿是否被打開過。本程序代碼中,“C:文件夾名文件.xls”、”源工作表名”代表工作簿所在的文件夾和工作簿文件名。示例代碼4:下面是JOHN WALKENBACH先生使用VBA編寫的一個實用函數(shù),其作用是從關(guān)閉的工作簿中取值。VBA沒有包含從關(guān)閉的文件中獲取值的方法,但是利用Excel處理連接文件的功能,可以實現(xiàn)。該函數(shù)要調(diào)用XLM宏,但不能在工作表公式中使用該函數(shù)。GetValue函數(shù)具有四個參數(shù),分別如下:· path: 關(guān)閉的文件的驅(qū)動器和路徑(例如”d:files”)
31、· file: 工作簿名稱(例如”99budget.xls”)· sheet: 工作表名稱(例如”Sheet1)· ref: 單元格引用(例如”C4)Private Function GetValue(path, file, sheet, ref)' 從一個關(guān)閉的工作簿中獲取值 Dim arg As String ' 確保該文件存在 If Right(path, 1) <> "" Then path = path & "" If Dir(path & file) = "&
32、quot; Then GetValue = "File Not Found" Exit Function End If' 創(chuàng)建參數(shù) arg = "'" & path & "" & file & "" & sheet & "'!" & _ Range(ref).Range("A1").Address(, , xlR1C1)' 執(zhí)行XLM宏 GetValue = ExecuteExcel4Ma
33、cro(arg)End Function使用GetValue函數(shù)要使用該函數(shù),將其復(fù)制到VBA模塊中,然后使用合適的參數(shù)調(diào)用該函數(shù)。子過程演示如下,簡單地顯示在名為99Budget.xls工作簿Sheet1的單元格A1中的值,該文件在驅(qū)動器C:中的XLFilesBudget目錄下。Sub TestGetValue() p = "c:XLFilesBudget" f = "99Budget.xls" s = "Sheet1" a = "A1" MsgBox GetValue(p, f, s, a)End Sub另一個
34、示例如下,該過程從一個關(guān)閉的文件中讀取1,200個值(100行和12列),并將這些值放置到活動工作表中。Sub TestGetValue2() p = "c:XLFilesBudget" f = "99Budget.xls" s = "Sheet1" Application.ScreenUpdating = False For r = 1 To 100 For c = 1 To 12 a = Cells(r, c).Address Cells(r, c) = GetValue(p, f, s, a) Next c Next r App
35、lication.ScreenUpdating = TrueEnd Sub注意:為了使該函數(shù)正常運(yùn)行,在Excel中必須有一個活動工作表。如果所有窗口都是隱藏的,或者活動工作表為圖表工作表,那么將產(chǎn)生錯誤。示例代碼5:Sub ReadDataFromAllWorkbooksInFolder() Dim FolderName As String, wbName As String, r As Long, cValue As Variant Dim wbList() As String, wbCount As Integer, i As Integer FolderName = "C:文件夾名" '創(chuàng)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 心理發(fā)展與教育
- 中醫(yī)護(hù)理技術(shù)對黃疸的治療
- 餐飲店員工績效考核與晉升合同
- 系統(tǒng)化代牧養(yǎng)殖合同范本
- 餐飲連鎖總經(jīng)理任期目標(biāo)與績效考核合同
- 礦產(chǎn)資源開采安全生產(chǎn)責(zé)任書范本
- 城市更新改造項目舊廠房物業(yè)財產(chǎn)移交及改造合同
- 車輛無償租賃與品牌合作推廣合同
- 車輛合伙經(jīng)營運(yùn)輸市場拓展協(xié)議
- 餐館廚師崗位競聘與選拔合同
- 2025年廣東省廣州市越秀區(qū)第十六中學(xué)中考二模數(shù)學(xué)試卷(含部分答案)
- 櫥柜廠規(guī)章管理制度
- 初三中考數(shù)學(xué)最后一課-主題班會【課件】
- 2025益陽市赫山區(qū)中小學(xué)教師招聘考試試題及答案
- 水利工程施工監(jiān)理規(guī)范(SL288-2014)用表填表說明及示例
- 2020-2021成都石室聯(lián)合中學(xué)蜀華分校小學(xué)數(shù)學(xué)小升初模擬試卷附答案
- 某冶金機(jī)械廠供配電系統(tǒng)設(shè)計
- 《在中亞細(xì)亞草原上》賞析 課件
- Q/GDW248-2008輸變電工程建設(shè)標(biāo)準(zhǔn)強(qiáng)制性條文實施管理規(guī)程第3部分:變電站建筑工程施工教程文件
- 小學(xué)生綜合素質(zhì)評價方案與評價表
評論
0/150
提交評論