在VBA中调用其他工作表数据,核心是通过定位“工作簿(Workbook)”和“工作表(Worksheet)”对象,再精准引用单元格或单元格区域,按调用场景可分为「同一工作簿内调用」和「不同工作簿间调用」。同时,VBA可直接调用Excel内置工作表函数(如SUM、VLOOKUP等),实现复杂运算,以下是详细方法、实例及函数调用技巧。
一、同一工作簿内调用(最常用场景)
当目标数据与VBA代码所在工作表处于同一个工作簿时,直接通过工作表名称或索引定位,语法简洁且执行效率高,推荐优先使用工作表名称(索引易因工作表顺序调整出错)。
核心语法
1.通过工作表名称引用:Worksheets("工作表名称").Range("单元格地址")(如Worksheets("数据页").Range("A1"))
2.通过工作表索引引用:Worksheets(索引值).Range("单元格地址")(索引从1开始,如Worksheets(2).Range("A1")代表第二个工作表的A1单元格)
3.简化写法(仅当目标工作表为当前工作簿时):Sheets("工作表名称").[单元格地址](如Sheets("数据页").[A1:A10],适合快速引用)
实例演示
需求:从“数据源”工作表的A1单元格读取数值,写入当前工作表(如“汇总页”)的B1单元格,并计算A1:A10的总和写入B2单元格(此处已用到工作表函数SUM,后续展开细节)。
vba Sub 调用同一工作簿数据()Dim wsSource As Worksheet '定义数据源工作表对象Dim wsTarget As Worksheet '定义目标工作表对象'指定工作表(推荐用名称,避免索引变动影响)Set wsSource = ThisWorkbook.Worksheets("数据源") 'ThisWorkbook代表代码所在工作簿Set wsTarget = ThisWorkbook.Worksheets("汇总页")'1. 读取单个单元格数据并写入目标位置wsTarget.Range("B1").Value = wsSource.Range("A1").Value'2. 读取单元格区域数据并计算总和(调用工作表SUM函数)wsTarget.Range("B2").Value = Application.WorksheetFunction.Sum(wsSource.Range("A1:A10"))'提示执行完成MsgBox "数据调用及计算完成!" End Sub |
二、不同工作簿间调用(跨文件场景)
当目标数据在另一个独立的Excel文件(.xlsx/.xlsm)中时,需先打开目标工作簿(或通过路径直接引用),定位工作表后再读取数据,需注意文件路径、格式及宏启用问题。
两种实现方式
方式1:先打开目标工作簿(适合需多次调用数据的场景)
核心逻辑:通过Workbooks.Open打开目标文件,定位工作表后读取数据,操作完成后可选择关闭目标文件(避免占用资源)。
vba Sub 打开目标工作簿调用数据()Dim wsSource As WorksheetDim wbSource As Workbook '定义目标工作簿对象Dim wsTarget As WorksheetDim filePath As String '目标文件路径'1. 指定目标文件路径(绝对路径,含文件名及后缀)filePath = "D:\文档\目标数据文件.xlsm" '注意:若为.xlsx文件,需确保无宏,否则会报错'2. 打开目标工作簿(ReadOnly:=True表示只读打开,避免误改原文件)Set wbSource = Workbooks.Open(Filename:=filePath, ReadOnly:=True)'3. 定位目标工作表Set wsSource = wbSource.Worksheets("数据源")'4. 定位当前工作簿的目标工作表Set wsTarget = ThisWorkbook.Worksheets("汇总页")'5. 调用数据(读取目标文件A1:A10数据,写入当前工作簿C列)wsTarget.Range("C1:C10").Value = wsSource.Range("A1:A10").Value'6. 关闭目标工作簿(SaveChanges:=False表示不保存修改,避免改动原文件)wbSource.Close SaveChanges:=FalseMsgBox "跨工作簿数据调用完成!" End Sub |
方式2:不打开目标工作簿(直接通过路径引用,适合单次调用)
无需打开目标文件,通过公式嵌套路径引用数据,适合简单读取场景,缺点是无法批量处理复杂数据。
vba Sub 不打开工作簿调用数据()Dim wsTarget As WorksheetDim filePath As StringDim sheetName As StringSet wsTarget = ThisWorkbook.Worksheets("汇总页")filePath = "D:\文档\目标数据文件.xlsm" '目标文件路径sheetName = "数据源" '目标工作表名称'直接通过路径引用单个单元格数据(语法:'文件路径[文件名.xlsm]工作表名称'!单元格地址)wsTarget.Range("D1").Value = GetObject(filePath).Worksheets(sheetName).Range("A1").ValueMsgBox "数据读取完成!" End Sub |