You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨工作表调用Saveaspdfandsend宏时ExportAsFixedFormat语句报错求助

跨工作表调用Saveaspdfandsend宏时ExportAsFixedFormat语句报错求助

嘿,我看你遇到的是跨工作表调用宏时的经典小坑——代码默认跟着当前激活的工作表走,但你实际要操作的是存着核心逻辑的"Summary by S ref"工作表,这就导致后续的导出操作找错了对象,自然会报错。我给你拆解下问题和解决办法:

核心问题分析

  1. 工作表指定错误:你原代码里的Set xSht = ActiveSheet,会把你点击按钮的那个"Summary"工作表赋值给xSht,但你要导出PDF的应该是"Summary by S ref"的内容,这就相当于你要给A拍照,结果对着B按了快门,肯定出问题。
  2. 单元格引用未指定工作表:Range("N1")默认会取当前激活表的N1值,而你需要的是"Summary by S ref"表里的N1,这也会导致生成的PDF路径不对。
  3. MsgBox代码不完整:你贴的代码里MsgBox语句截断了,缺少按钮类型和标题参数,这也会导致编译报错。

一步步修改方案

1. 精准指定目标工作表

把原代码里的Set xSht = ActiveSheet改成直接指定你要操作的工作表:

Set xSht = ThisWorkbook.Worksheets("Summary by S ref")

这样不管你当前在哪个工作表点击按钮,宏都会精准定位到"Summary by S ref"表,不会跑偏。

2. 修正单元格引用的工作表

把生成PDF路径的代码改成指定目标表的N1,同时用VBA里更稳妥的&做字符串连接(+只适合数字连接,字符串用&不会踩坑):

xFolder = "H:\xxxx\xxxx\xxxx\xxxxx\" & xSht.Range("N1").Value & ".pdf"

3. 补全MsgBox的完整代码

你贴的代码里MsgBox语句没写完,补全成完整的确认框代码:

xYesorNo = MsgBox(xFolder & " already exists." & vbCrLf & vbCrLf & "Do you want to overwrite it?", _
                  vbYesNo + vbExclamation, "File Exists")

完整修改后的Saveaspdfandsend宏

Sub Saveaspdfandsend()
'Updated by Extendoffice 20230130
Dim xSht As Worksheet
Dim xFileDlg As FileDialog
Dim xFolder As String
Dim xYesorNo As Integer
Dim xOutlookObj As Object
Dim xEmailObj As Object
Dim xUsedRng As Range

' 精准指定要导出的目标工作表
Set xSht = ThisWorkbook.Worksheets("Summary by S ref")

' 生成正确的PDF保存路径,指定目标表的N1单元格
xFolder = "H:\xxxx\xxxx\xxxx\xxxxx\" & xSht.Range("N1").Value & ".pdf"

'Check if file already exist
If Len(Dir(xFolder)) > 0 Then
    xYesorNo = MsgBox(xFolder & " already exists." & vbCrLf & vbCrLf & "Do you want to overwrite it?", _
                      vbYesNo + vbExclamation, "File Exists")
    ' 如果用户选择不覆盖,直接退出宏
    If xYesorNo = vbNo Then Exit Sub
End If

' 执行PDF导出(现在操作的是正确的工作表了)
xSht.ExportAsFixedFormat Type:=xlTypePDF, Filename:=xFolder, Quality:=xlQualityStandard

' 下面继续保留你原来的Outlook邮件发送代码即可(如果有的话)
' Set xOutlookObj = CreateObject("Outlook.Application")
' Set xEmailObj = xOutlookObj.CreateItem(0)
' ... 你的邮件逻辑代码
End Sub

调用宏的代码不用改

你原来的Macro999宏完全可以继续用:

Sub Macro999()
    Call Saveaspdfandsend
End Sub

因为现在Saveaspdfandsend已经会自己精准找到目标工作表了,不管你在哪个表点击按钮都没问题。

备注:内容来源于stack exchange,提问作者Croon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 08:49:35