Word 2010 VBA:奇数随机间歇、不可再现错误。4248此命令不可用,因为未打开任何文档
一些背景…我们有一个用于文档管理的厚客户端。我们可以通过编写C/C++dll自定义客户端的功能。这段代码是十多年前为WinXP和Word 2003编写的。在被迫赢得2010年世界杯和世界杯之后,我们最近才看到一些奇怪的问题。 这些dll中的函数之一创建一个新线程,并在该新线程中启动Word。我们还向Word传递一些命令行参数,这些参数是要使用的Word模板的名称(master.dotm)和在Word启动时要在模板中执行的函数(autonew) Autonew基于master.dotm模板添加新文档,然后关闭模板并调用另一个名为InsertLetter的函数。在这个函数中,我们插入另一个Word文档,作为Master.dotm的字母的实际内容实际上除了页眉和页脚之外没有任何内容。Word 2010 VBA:奇数随机间歇、不可再现错误。4248此命令不可用,因为未打开任何文档,vba,word-2010,Vba,Word 2010,一些背景…我们有一个用于文档管理的厚客户端。我们可以通过编写C/C++dll自定义客户端的功能。这段代码是十多年前为WinXP和Word 2003编写的。在被迫赢得2010年世界杯和世界杯之后,我们最近才看到一些奇怪的问题。 这些dll中的函数之一创建一个新线程,并在该新线程中启动Word。我们还向Word传递一些命令行参数,这些参数是要使用的Word模板的名称(master.dotm)和在Word启动时要在模板中执行的函数(autonew) Autonew基于master.dotm模板添加新文
在InsertLetter中,用户偶尔会收到消息框“4248此命令不可用,因为没有打开的文档”。 我不知道该错误在该函数中的确切位置,但我认为实际问题在于创建文档时AutoNew函数中出现的错误,并且由于某些随机的、不可复制的原因,该错误会弹出。 我无法在我的电脑上复制这个。word的版本显然是相同的,电脑的构建应该是相同的。我唯一能想到的是master.dotm创建新文档和关闭以及调用InsertLetter函数之间的时间问题 以下是autonew功能:
Public Sub AutoNew()
On Error Resume Next
'Create autotextMenu
Call CreateAutoTextMenu
'Open a new document based on the Master.dotm template
If ActiveDocument.Type = wdTypeTemplate Then
Documents.Add ActiveDocument.Path & "\" & ActiveDocument.Name <---this value is always "Master.dotm"
Exit Sub
End If
Documents("master.dotm").Close
'Enable "Letters" toolbar
CommandBars("Letters").Enabled = True
DoEvents
Application.ScreenUpdating = False
System.Cursor = wdCursorWait
GetData 'Function that populates user data
HeaderFooter (gsLtrCode)
If goValues Is Nothing Then
Set goValues = New clsValues
End If
InsertLetter
Application.ScreenRefresh
'Display driver info
Call DriverInfo
System.Cursor = wdCursorNormal
Exit Sub
Private Sub InsertLetter()
Dim sLtrName As String
Dim sTemp As String
Dim oRng As Range
Dim tmpStart
sLtrName = gsPath & "Letters\" & gsLtrCode & ".doc"
With ActiveDocument.Bookmarks
'Insert selected letter
If .Exists("Letter") = True Then
Selection.GoTo what:=wdGoToBookmark, Name:="Letter"
Selection.InsertFile FileName:=sLtrName, Range:="",
ConfirmConversions:=False, link:=False, attachment:=False
'Define gender
sTemp = Left$(sTemp, 2)
If .Exists("Sir_Madam") Then
If CInt(sTemp) > 50 Then
.Item("Sir_Madam").Range.Text = "Madam"
Else
.Item("Sir_Madam").Range.Text = "Sir"
End If
End If
If .Exists("FDate") Then
gbFDate = True
Set oRng = ActiveDocument.Bookmarks("FDate").Range
oRng.Text = Format(Date, "mmmm d, yyyy")
'default Today's Date
.Add Name:="FDate", Range:=oRng
End If
If .Exists("DDate") Then
gbDDate = True
Set oRng = ActiveDocument.Bookmarks("DDate").Range
oRng.Text = Format(DateAdd("ww", 8, Date), "mmmm d, yyyy")
'default +8 weeks
.Add Name:="DDate", Range:=oRng
End If
If .Exists("CaseID") Then
Set oRng = ActiveDocument.Bookmarks("CaseID").Range
oRng.Text = CaseID
.Add Name:="CaseID", Range:=oRng
End If
If .Exists("SeqNum") Then
Set oRng = ActiveDocument.Bookmarks("SeqNum").Range
oRng.Text = LetterSeqNum
.Add Name:="LetterSeqNum", Range:=oRng
End If
If .Exists("SeqNumP1") Then
Set oRng = ActiveDocument.Bookmarks("SeqNumP1").Range
oRng.Text = LetterSeqNum
.Add Name:="LetterSeqNum", Range:=oRng
End If
If .Exists("VJ") Then
.Item("VJ").Range.InsertAfter Trim(gsUserID)
'The next 2 lines added on Feb 23, 2004
ActiveDocument.Bookmarks("VJ").Range.Font.Name = "Arial"
ActiveDocument.Bookmarks("VJ").Range.Font.Size = 10
End If
If Left$(gsLtrCode, 5) = "USREC" Then
If .Exists("DatePlus6w") Then
Set oRng = ActiveDocument.Bookmarks("DatePlus6w").Range
oRng.Text = Format(DateAdd("ww", 6, Date), "mmmm d, yyyy")
'default + 6 weeks
sTemp = oRng
.Add Name:="DatePlus6w", Range:=oRng
End If
If .Exists("DatePlus6wF") Then
Select Case Month(CDate(sTemp))
Case 1
sTemp = Day(CDate(sTemp)) & " janvier, " & Year(CDate(sTemp))
Case 2
sTemp = Day(CDate(sTemp)) & " février, " & Year(CDate(sTemp))
Case 3
sTemp = Day(CDate(sTemp)) & " mars, " & Year(CDate(sTemp))
Case 4
sTemp = Day(CDate(sTemp)) & " avril, " & Year(CDate(sTemp))
Case 5
sTemp = Day(CDate(sTemp)) & " mai, " & Year(CDate(sTemp))
Case 6
sTemp = Day(CDate(sTemp)) & " juin, " & Year(CDate(sTemp))
Case 7
sTemp = Day(CDate(sTemp)) & " juillet, " & Year(CDate(sTemp))
Case 8
sTemp = Day(CDate(sTemp)) & " août, " & Year(CDate(sTemp))
Case 9
sTemp = Day(CDate(sTemp)) & " septembre, " & Year(CDate(sTemp))
Case 10
sTemp = Day(CDate(sTemp)) & " octobre, " & Year(CDate(sTemp))
Case 11
sTemp = Day(CDate(sTemp)) & " novembre, " & Year(CDate(sTemp))
Case 12
sTemp = Day(CDate(sTemp)) & " décembre, " & Year(CDate(sTemp))
End Select
Set oRng = ActiveDocument.Bookmarks("DatePlus6wF").Range
oRng.Text = sTemp
oRng.Font.Italic = True
.Add Name:="DatePlus6wF", Range:=oRng
End If
End If
Else
MsgBox "Letter doesn't exist"
End If
End With
PopulateFields
'Apr 15 begins
With ActiveDocument.Bookmarks
If .Exists("Encl") = True Then
Set oRng = ActiveDocument.Range( _
Start:=ActiveDocument.Bookmarks("Letter").Range.Start, _
End:=ActiveDocument.Bookmarks("Encl").Range.End)
Else
Set oRng = ActiveDocument.Range( _
Start:=ActiveDocument.Bookmarks("Letter").Range.Start, _
End:=ActiveDocument.Bookmarks("VJ").Range.End)
End If
End With
With oRng
.Font.Name = "Arial"
.Font.Size = 11
End With
Exit Sub
End Sub