如何链接其他工作簿获取数据?VBA宏报错问题求助
解决Excel VBA导入关闭工作簿数据的错误及实现动态选择功能
我来帮你一步步解决这个问题,咱们先理清核心问题,再逐个击破:
一、修复现有GETPRICE宏的公式错误
你遇到的Method 'FormulaR1C1' of object 'Range' failed错误,核心原因是公式格式不规范——既有多余空格,也有R1C1语法的小问题。咱们先把这部分修正:
原来的公式开头有多余空格(比如" =IFERROR(..."),这会导致VBA识别公式失败,同时IF嵌套的逻辑可以保持简洁,修正后的代码片段如下:
Option Explicit Sub GETPRICE() With Sheets("BINO") ' 修正R1C1格式的外部引用公式,去掉多余空格 .Range("A1:C100000").FormulaR1C1 = _ "=IFERROR(IF('[FILE.xlsb]SHEET'!RC=0,"""",'[FILE.xlsb]SHEET'!RC),0)" ' 其他公式也统一用R1C1格式,保证兼容性 .Range("D1:D100000").FormulaR1C1 = "=TRIM(LEFT(RC[-3],250)&LEFT(RC[-2],2))" .Range("E1:E100000").FormulaR1C1 = "=IFERROR(ROUND(RC[-2],4),"""")" ' 将公式转换为静态值(如果需要断开与原工作簿的链接) .Range("A1:E100000").Value2 = .Range("A1:E100000").Value2 ' 修正排序部分:确保引用的是当前工作表的Range,避免跨表错误 With .Sort .SortFields.Clear .SortFields.Add Key:=.Range("E1:E100000"), Order:=xlDescending .SetRange .Range("D5:E5000") .Header = xlNo .Apply End With End With End Sub
关键注意点:
- 给
FormulaR1C1赋值时,公式开头不能有多余空格,VBA对格式要求很严格 - 外部工作簿引用
'[FILE.xlsb]SHEET'!RC的写法是正确的,但要确保文件名和工作表名完全匹配(区分大小写)
二、实现动态选择工作簿和工作表的功能
要满足“选择任意工作簿和工作表,取消则退出”的需求,我们可以用GetOpenFilename让用户选文件,再通过后台打开工作簿获取工作表列表,具体代码如下:
Option Explicit Sub GETPRICE_Dynamic() Dim targetWBPath As Variant Dim targetWB As Workbook Dim targetWSName As String Dim selectedWS As Variant ' 1. 让用户选择目标工作簿,取消则直接退出 targetWBPath = Application.GetOpenFilename( _ FileFilter:="Excel文件 (*.xls;*.xlsx;*.xlsb), *.xls;*.xlsx;*.xlsb", _ Title:="请选择要导入数据的工作簿") If targetWBPath = False Then Exit Sub ' 用户取消选择 ' 2. 后台打开目标工作簿,获取工作表列表 On Error Resume Next Set targetWB = GetObject(targetWBPath) On Error GoTo 0 If targetWB Is Nothing Then MsgBox "无法打开目标工作簿,请检查文件是否损坏或被占用!", vbExclamation Exit Sub End If ' 让用户选择工作表(允许直接点击工作表标签选择) selectedWS = Application.InputBox( _ Prompt:="请选择要导入的工作表:", _ Title:="选择工作表", _ Type:=8) ' Type:=8 允许选择单元格/工作表对象 If selectedWS Is Nothing Then targetWB.Close SaveChanges:=False Exit Sub End If targetWSName = selectedWS.Worksheet.Name targetWB.Close SaveChanges:=False ' 关闭后台打开的工作簿,不保存 ' 3. 导入数据到当前工作簿的BINO工作表 With Sheets("BINO") ' 构造正确的外部引用路径(路径含空格/特殊字符时必须用单引号包裹) Dim externalRef As String externalRef = "'" & targetWBPath & "'!" & targetWSName & "!RC" ' 写入公式并转换为静态值 .Range("A1:C100000").FormulaR1C1 = _ "=IFERROR(IF(" & externalRef & "=0,""""," & externalRef & "),0)" .Range("D1:D100000").FormulaR1C1 = "=TRIM(LEFT(RC[-3],250)&LEFT(RC[-2],2))" .Range("E1:E100000").FormulaR1C1 = "=IFERROR(ROUND(RC[-2],4),"""")" ' 将公式转换为值,断开与原工作簿的链接,避免后续更新问题 .Range("A1:E100000").Value2 = .Range("A1:E100000").Value2 ' 执行排序操作 With .Sort .SortFields.Clear .SortFields.Add Key:=.Range("E1:E100000"), Order:=xlDescending .SetRange .Range("D5:E5000") .Header = xlNo .Apply End With End With MsgBox "数据导入完成!", vbInformation End Sub
功能说明:
- 用户取消文件选择或工作表选择时,子程序会直接退出,符合需求
- 用
GetObject后台打开目标工作簿,不会弹出窗口,体验更流畅 - 自动处理含空格的文件路径,避免引用错误
- 导入后自动将公式转为静态值,彻底解决链接更新问题
三、解决“Method_Default of object 'Range' failed”错误
这个错误通常由以下原因导致,你可以逐一排查:
- 自动更新链接被禁用:打开Excel选项→高级→常规,确保“请求更新自动链接”已启用,或者在VBA开头添加
Application.AskToUpdateLinks = False临时禁用提示 - 目标工作簿路径错误:硬编码路径容易因文件移动失效,用动态选择的方法可以彻底解决
- 公式语法错误:之前的公式有多余空格,修正后即可消除这个错误
内容的提问来源于stack exchange,提问作者Sherzod Matkarimov
相关产品推荐
相关产品推荐

