Excel 带有是/否选项的VBA MsgBox代码问题
我的代码有一个问题,我想让它做的是,当单击“是”时,在另一个模块中创建的word文档将打开。我使用了以下代码来实现这一点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
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“使应用程序对用户可见”
打开文件名
如果结束
端接头
我遇到了一个非常奇怪的问题,代码只在运行两次时有效,一次是在没有任何事情发生时运行,但是如果您不做任何事情就再次运行它,那么它会执行它应该执行的操作
我不知道为什么会发生这种情况,如果有人能透露一些信息,那将是非常好的 您的代码非常不精确。为了解决这个问题,你应该首先引入精度
Sheet5
是默认的CodeName
。默认情况下,这是Excel为工作表指定的名称。我们不知道您的工作簿中是否存在一张代号为的工作表。我想,几乎没有人知道,如果将相同的名称分配给对象变量,Excel是否会避免给新工作表命名。“Sheet5”并不是一个非常具有描述性的名称。找到一个能更好地为你服务的名字,而不是一种压舱物
设置图纸5=图纸(5)
<代码>表(5)看起来像一个代码名
。如果您确实有一个同名的工作表,那么语法应该是Set Sheet5=Worksheets(“Sheet(5)”)
。我建议您仔细阅读CodeName
和选项卡Name
属性,避免使用与Excel相同的创建通用名称的系统。也就是说,如果你想不出能帮助你理解自己代码的名字Documents.Open fileName
是来自Word应用程序DLL的命令。您需要创建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,则使用