使用Range/R1C1跨工作簿取单元格值:变量引用问题求助
解决VBA跨工作簿动态获取单元格数据的问题
问题分析
你当前代码的核心问题是:
- 直接将
RmCn作为字符串写入公式,没有把变量m、n的实际值代入,导致Excel无法识别目标单元格。 - 未正确使用变量指定工作表对象,无法实现循环遍历工作表的需求。
解决方案
1. 动态构建单元格引用
要实现动态的单元格位置,需要通过字符串拼接将变量值嵌入公式或直接引用单元格对象:
- 如果是直接复制单元格值(无链接):使用
Cells(m, n)对象直接取值。 - 如果是创建公式链接(源单元格更新时自动同步):将变量
m、n拼接到R1C1格式的公式字符串中。
2. 用变量指定工作表
Excel的Worksheets集合支持通过数字索引或工作表名称调用工作表,循环时直接用数字变量作为索引即可,比如Worksheets(a)(a为整数变量)。
优化后的示例代码
以下代码包含循环逻辑,同时解决两个问题,且避免了低效的Select/ActiveCell操作:
Sub FetchData() Dim i As Integer, j As Integer Dim m As Integer, n As Integer Dim a As Integer ' 工作表编号变量 Dim targetWB As Workbook ' 绑定目标工作簿(确保File1.xlsx已打开,未打开则用Open方法) Set targetWB = Workbooks("File1.xlsx") ' 示例:遍历1-3号工作表,同时遍历当前工作表的第2-6行 For a = 1 To 3 For i = 2 To 6 j = 4 ' 当前工作表的目标列 m = i + 1 ' 目标工作簿的目标行(动态关联i) n = 5 ' 目标工作簿的目标列 ' 方式1:直接复制单元格值(无公式链接) ThisWorkbook.ActiveSheet.Cells(i, j).Value = targetWB.Worksheets(a).Cells(m, n).Value ' 方式2:创建公式链接(源单元格变化时自动更新),取消注释即可使用 ' ThisWorkbook.ActiveSheet.Cells(i, j).FormulaR1C1 = _ "='" & targetWB.Name & "]" & targetWB.Worksheets(a).Name & "'!R" & m & "C" & n Next i Next a End Sub
关键细节说明
- 如果目标工作簿未打开,需替换
Set targetWB = Workbooks("File1.xlsx")为:Set targetWB = Workbooks.Open("C:\你的文件路径\File1.xlsx") - 若不需要公式链接,优先使用直接赋值的方式,代码运行效率更高且避免公式依赖问题。
ThisWorkbook指代当前运行代码的工作簿,targetWB指代目标数据所在的工作簿,这样的对象引用方式更清晰,避免歧义。
内容的提问来源于stack exchange,提问作者Droidspook
相关产品推荐
相关产品推荐

