Personal工作簿宏运行报错:Runtime error '9'下标越界求助
解决Personal工作簿VBA运行时错误'9':下标越界
错误根源分析
报错行Set pwb = Workbooks("Personal").Worksheets("Sheet1")触发Runtime error '9',本质是找不到指定的工作簿或工作表,常见原因包括:
- Personal工作簿未成功加载到Excel进程中
- 工作簿引用名称错误(Excel中打开的工作簿会显示完整扩展名,比如
Personal.xlsb而非Personal) - 工作表
Sheet1被重命名或不存在
分步解决方案
1. 确认Personal工作簿的加载状态
- 打开Excel,按
Alt+F11打开VBA编辑器,在左侧项目资源管理器中查看是否存在Personal.xlsb(或对应扩展名的文件,如.xlsm/.xls) - 若未找到,检查XLSTART文件夹路径:
- 打开Excel选项 → 信任中心 → 信任中心设置 → 受信任位置,找到XLSTART的路径
- 确认Personal工作簿确实放在该路径下,且文件为启用宏的格式(带宏的工作簿需保存为
.xlsb/.xlsm,否则宏会被禁用)
- 确保宏已启用:文件 → 选项 → 信任中心 → 信任中心设置 → 宏设置,选择"启用无数字签署的所有宏"(根据安全需求调整)
2. 修正工作簿引用逻辑
直接使用Workbooks("Personal")容易因扩展名问题报错,改用更可靠的查找逻辑:
Sub make_buttons_appear_onhotkey() Dim ws As Worksheet Dim pwb As Worksheet Dim personalWB As Workbook Dim shape1 As Shape Dim shape2 As Shape Dim shape3 As Shape Dim shape4 As Shape Dim shapetop As Long, shapeleft As Long Dim shapeheight As Long, shapewidth As Long Dim shapetop2 As Long, shapeleft2 As Long Dim shapeheight2 As Long, shapewidth2 As Long Set ws = ActiveWorkbook.ActiveSheet ' 查找Personal工作簿,兼容带扩展名的情况 On Error Resume Next Set personalWB = Workbooks("Personal") If personalWB Is Nothing Then Set personalWB = Workbooks("Personal.xlsb") ' 若你的文件是.xlsm,替换为Personal.xlsm End If On Error GoTo 0 ' 检查工作簿是否找到 If personalWB Is Nothing Then MsgBox "Personal工作簿未加载,请检查XLSTART文件夹和宏设置" Exit Sub End If Set pwb = personalWB.Worksheets("Sheet1") ' 检查工作表是否存在 If pwb Is Nothing Then MsgBox "Personal工作簿中未找到Sheet1工作表" Exit Sub End If ' 复制并粘贴Button 1 Set shape1 = pwb.Shapes("Button 1") shapetop = shape1.Top shapeleft = shape1.Left shapeheight = shape1.Height shapewidth = shape1.Width shape1.Copy ws.Paste ' 改用获取最后添加的形状,避免名称重复问题 Set shape3 = ws.Shapes(ws.Shapes.Count) shape3.Top = shapetop shape3.Left = shapeleft shape3.Height = shapeheight shape3.Width = shapewidth ' 复制并粘贴Button 2 Set shape2 = pwb.Shapes("Button 2") shapetop2 = shape2.Top shapeleft2 = shape2.Left shapeheight2 = shape2.Height shapewidth2 = shape2.Width shape2.Copy ws.Paste Set shape4 = ws.Shapes(ws.Shapes.Count) shape4.Top = shapetop2 shape4.Left = shapeleft2 shape4.Height = shapeheight2 shape4.Width = shapewidth2 Application.OnKey "{ESC}", "make_buttons_disappear_onclick" Range("A1").Select End Sub Sub make_buttons_disappear_onclick() Dim ws As Worksheet Set ws = ActiveWorkbook.ActiveSheet ' 容错处理:避免形状已被删除时报错 On Error Resume Next ws.Shapes("Button 1").Delete ws.Shapes("Button 2").Delete ' 若使用了上面的修改,这里也可以按索引删除,或者遍历形状查找名称包含Button的 ' 例如: ' Dim shp As Shape ' For Each shp In ws.Shapes ' If shp.Name Like "Button*" Then shp.Delete ' Next shp On Error GoTo 0 Application.OnKey "{ESC}" End Sub
3. 额外注意事项
- 确认Personal工作簿中的工作表名称确实为
Sheet1(右键工作表标签可查看/修改名称) - 粘贴形状后,Excel会自动为重复名称的形状添加后缀(如
Button 1 (2)),因此直接用名称引用容易出错,建议改用索引或遍历查找的方式 - 确保两台电脑的Excel宏设置一致,避免其中一台因宏禁用导致Personal工作簿未加载
内容的提问来源于stack exchange,提问作者Salviati
相关产品推荐
相关产品推荐

