VBA跨工作簿传递单元格值到目标列下一个空单元格报错修复
代码问题排查
原代码共有4处会导致运行报错/逻辑不符合预期的问题:
- 工作表集合拼写错误:VBA中工作簿持有的工作表集合对象名为
Sheets(或Worksheets),原代码写为Sheet缺少结尾s,会直接触发"对象不支持该属性或方法"的报错 - 行号统计上下文错误:原代码中
Rows.Count未绑定到DASH工作表,会默认读取当前活动工作表的最大行号,若两个工作簿格式不同(如一个是.xls格式最大65536行、一个是.xlsx格式最大1048576行),会导致最后一行定位错误 - 粘贴逻辑不匹配:原代码仅将C2的值存入变量,未执行任何复制操作,直接调用
PasteSpecial会因为剪贴板为空触发报错,变量取值场景直接给目标单元格赋值即可,不需要走剪贴板 - 缺少前置校验:如果运行宏时Dash工作簿未打开,直接引用会触发"下标越界"报错,无友好提示
修正后可直接运行的代码
Sub S2WL() Dim lst As Long Dim myVar As String Dim dashSht As Worksheet ' 校验Dash工作簿及DASH工作表是否可访问 On Error Resume Next Set dashSht = Workbooks("Dash").Sheets("DASH") On Error GoTo 0 If dashSht Is Nothing Then MsgBox "请先打开名为Dash的工作簿后再运行宏", vbExclamation Exit Sub End If ' 读取当前活动工作表C2的ticker值 myVar = Trim(ActiveSheet.Range("C2").Value) If myVar = "" Then MsgBox "当前激活工作表C2单元格为空,无有效ticker可写入", vbExclamation Exit Sub End If ' 定位JW列下一个空白行并写入值 With dashSht lst = .Range("JW" & .Rows.Count).End(xlUp).Row + 1 ' 适配无表头场景:如果JW列全空,从第1行开始写入 If .Range("JW1").Value = "" And lst = 2 Then lst = 1 .Range("JW" & lst).Value = myVar End With MsgBox "已成功写入ticker:" & myVar, vbInformation End Sub
使用说明
- 建议将宏存入个人宏工作簿(
PERSONAL.xlsb),后续不管激活Fundamentals工作簿下的哪个工作表,都可以直接触发宏运行 - 如果你的Dash工作簿带后缀名(如
Dash.xlsx、Dash.xlsm),请将代码中Workbooks("Dash")的引号内内容替换为完整文件名,否则会匹配不到已打开的工作簿 - 代码默认支持JW列带表头(第一行为列名)、全空两种场景,不需要手动调整行号
内容的提问来源于stack exchange,提问作者JupBrew
相关产品推荐
相关产品推荐

