Excel 带有是/否选项的VBA MsgBox代码问题

Excel 带有是/否选项的VBA MsgBox代码问题,excel,vba,Excel,Vba,我的代码有一个问题,我想让它做的是,当单击“是”时,在另一个模块中创建的word文档将打开。我使用了以下代码来实现这一点 Option Explicit Sub Review_Report_Open() Dim Sheet5 As Worksheet Dim Status As VbMsgBoxResult Dim fileName As String Dim WordDoc, WordApp As Object Set Sheet5 = Sheets(5) Sheets(5).Activa

我的代码有一个问题,我想让它做的是,当单击“是”时,在另一个模块中创建的word文档将打开。我使用了以下代码来实现这一点

Option Explicit
Sub Review_Report_Open()
Dim Sheet5 As Worksheet
Dim Status As VbMsgBoxResult
Dim fileName As String
Dim WordDoc, WordApp As Object

Set Sheet5 = Sheets(5)

Sheets(5).Activate

Status = MsgBox("Do you want to View the Report?", vbQuestion + vbYesNo + vbDefaultButton1, "Review Report")

fileName = ThisWorkbook.Path & "\Reports" & Sheets("4. Word Doc").Range("H9").Value & "_" & ".docx"

If Status <> vbYes Then Exit Sub

'Open Word Template
    On Error Resume Next 'If Word is already running
    Set WordApp = GetObject("Word.Application")
    If Err.Number <> 0 Then
    'Launch a new instance of Word
    Err.Clear
    'On Error GoTo Error_Handler
    Set WordApp = CreateObject("Word.Application") 'launches word application
    WordApp.Visible = True 'Make the application visible to the user
    Documents.Open fileName

End If
End Sub
选项显式
次级审查报告公开()
将表5调整为工作表
Dim状态为VbMsgBoxResult
将文件名设置为字符串
Dim WordDoc,WordApp作为对象
设置图纸5=图纸(5)
第(5)页。激活
Status=MsgBox(“是否要查看报告?”,vbQuestion+vbYesNo+vbDefaultButton1,“查看报告”)
fileName=thispoolk.Path&“\Reports”和Sheets(“4.Word文档”).Range(“H9”).Value&“&”.docx”
如果状态为vbYes,则退出Sub
'打开Word模板
“如果Word已在运行,则在出现错误时继续下一步”
Set WordApp=GetObject(“Word.Application”)
如果错误号为0,则
'启动Word的新实例
呃,明白了
'在发生错误时转到错误\u处理程序
Set WordApp=CreateObject(“Word.Application”)”启动Word应用程序
WordApp.Visible=True“使应用程序对用户可见”
打开文件名
如果结束
端接头
我遇到了一个非常奇怪的问题,代码只在运行两次时有效,一次是在没有任何事情发生时运行,但是如果您不做任何事情就再次运行它,那么它会执行它应该执行的操作


我不知道为什么会发生这种情况,如果有人能透露一些信息,那将是非常好的

您的代码非常不精确。为了解决这个问题,你应该首先引入精度

  • 将表5调整为工作表
    Sheet5
    是默认的
    CodeName
    。默认情况下,这是Excel为工作表指定的名称。我们不知道您的工作簿中是否存在一张代号为
    的工作表。我想,几乎没有人知道,如果将相同的名称分配给对象变量,Excel是否会避免给新工作表命名。“Sheet5”并不是一个非常具有描述性的名称。找到一个能更好地为你服务的名字,而不是一种压舱物
  • 设置图纸5=图纸(5)
    <代码>表(5)
    看起来像一个
    代码名
    。如果您确实有一个同名的工作表,那么语法应该是
    Set Sheet5=Worksheets(“Sheet(5)”)
    。我建议您仔细阅读
    CodeName
    和选项卡
    Name
    属性,避免使用与Excel相同的创建通用名称的系统。也就是说,如果你想不出能帮助你理解自己代码的名字
  • Documents.Open fileName
    是来自Word应用程序DLL的命令。您需要创建Word应用程序的实例,以便在其中成功打开文档。既然你说你的代码每隔一段时间就可以工作,那么背景中似乎确实有这样一个对象在浮动。您需要在代码范围内声明它,以便获得对它的控制
  • 打开Word文档并不一定意味着Excel将关闭。事实上,不清楚您提供的代码是在Excel中运行还是在Word中运行。从名称上看,它似乎是一个事件过程。既然你不知道那一点,我们只能猜测。请澄清你在这方面的问题
  • Excel和Word都有一个活动窗口。打开新文档时,该应用程序将为该文档提供活动窗口。因此,打开Word文档时,Word应用程序的活动窗口将被新文档占用。但是,您的代码没有说明Excel的活动窗口在那一刻之前是活动窗口,应该发生什么。完全有可能您的代码做的一切都是正确的-只是它不管理活动窗口,因此新打开的Word文档礼貌地保留在后台。一旦Word应用程序有了一个变量对象,您就可以检查它,您可以查询打开文档的名称及其窗口的状态

  • 您的代码在“MsgBox”行为方面运行良好。您需要正确声明变量并正确使用它们

    然后,您必须查找现有会话中的单词,如果没有,则打开一个新会话。工作代码必须如下所示:

    Sub Review_Report_Open()
    Dim Sheet5 As Worksheet, boolFound As Boolean
    Dim Status As VbMsgBoxResult, fileName As String
    Dim WordDoc As Object, WordApp As Object
    
    Set Sheet5 = Sheets(5)
    
    Sheets(5).Activate
    
    Status = MsgBox("Do you want to View the Report?", vbQuestion + vbYesNo + vbDefaultButton1, "Review Report")
    
    fileName = ThisWorkbook.path & "\Reports" & Sheets("4. Word Doc").Range("H9").value & "_" & ".docx"
    
     If Status <> vbYes Then Exit Sub
        'Looking for the Word open session:
        On Error Resume Next
        Set WordApp = GetObject(, "Word.Application")
        If Err.Number <> 0 Then
            Err.Clear: On Error GoTo 0
            boolFound = True
        End If
        On Error GoTo 0 'mandatory to avoid VBA surprises
        If Not boolFound Then
            Set WordApp = CreateObject("Word.Application") 'create a new session
            WordApp.Visible = True
        End If
        Documents.Open fileName
        'Do what is to be done...
     End If
    End Sub
    
    Sub Review\u Report\u Open()
    将图纸5标注为工作表,布尔值为布尔值
    Dim状态为VbMsgBoxResult,文件名为字符串
    Dim WordDoc作为对象,WordApp作为对象
    设置图纸5=图纸(5)
    第(5)页。激活
    Status=MsgBox(“是否要查看报告?”,vbQuestion+vbYesNo+vbDefaultButton1,“查看报告”)
    fileName=thispoolk.path&“\Reports”和Sheets(“4.Word文档”).Range(“H9”).value&“&”.docx”
    如果状态为vbYes,则退出Sub
    '查找“开放会话”一词:
    出错时继续下一步
    Set WordApp=GetObject(,“Word.Application”)
    如果错误号为0,则
    错误清除:错误转到0
    boolFound=True
    如果结束
    为避免VBA意外,必须执行“错误转到0”
    如果不是土狗的话
    设置WordApp=CreateObject(“Word.Application”)'创建新会话
    可见=True
    如果结束
    打开文件名
    “做该做的事。。。
    如果结束
    端接头
    

    我认为,测试代码的原因不容易理解。它试图从逻辑上纠正问题代码中没有很好使用的内容…

    您调试了代码吗?执行了if语句的哪一部分?顺便说一句,最好使用
    选项Explicit
    。现在,您的代码中有一些未声明的变量,这使得解决这个问题变得更加容易。如果你在其他地方声明了它们,这意味着你有一个全局范围的变量,这会让事情变得更糟。是的,我调试了代码,没有错误消息,代码可以工作,但只在连续第二次运行时工作。你应该限定范围(“H9”),即指出它属于哪个工作表。类似fileName=thiswoolk.Path&“\Reports”和sheets(“test”).Range(“H9”).Value&“&“.docx”请尝试:
    Dim状态为VbMsgBoxResult
    。然后,如果状态为vb,则使用