在 Excel 中调用时返回 运行 时间错误 '438 的字函数

Word Function returning Run Time Error '438 when called in Excel

我一直在 excel 中创建一个宏,它将从 excel sheet 中提取信息并插入到 word 文档中。

经过多次尝试和错误后,我设法让它插入了我想要的所有信息,但我现在坚持更改插入内容的格式。

在尝试了多种不同的方法来更改宏内的格式后(none 其中有效)我决定在 word VBA 中创建一些函数来进行格式更改我想要(I.E 更改为样式,粗体或格式为项目符号)。这些功能在零问题的情况下工作。但是每当我从 excel 宏调用它们时,我都会收到 运行 时间错误“438”对象不支持此 属性 或方法。我双重和三次检查我勾选了对象库这个词,在这个阶段我假设我正在做一些 excel 对象不喜欢的事情但是对于我的生活我无法弄清楚问题在哪里是。

这是 excel 宏的一小部分,如果我 运行 它没有调用 word 函数,它就可以正常工作。我曾尝试将电话放在 wrdApp 中,但没有成功。我也尝试将它拉到 wrdDoc 之外,但这也没有用。

Sub ExportData()
'
' ExportData Macro
' Export the data from excel into a more usable form in word
'

Dim sheetcounter As Integer
Dim counter As Integer
Dim numbsheets As Integer
Dim numbepisodes As Integer
Dim wrdApp As Object, wrdDoc As Object
Dim episodetitle As String
Dim nextepisodetitle As String
Dim season As Variant
Dim series As String
Dim episodenumber As String
Dim releasedate As Variant
Dim length As String
Dim fndDay As Integer
Dim fndMnth As Integer
Dim hrs As String
Dim mns As String
Dim scs As String
Dim lnglgth As String

Dim sheetname As String
Dim myRange As Range
Dim lookupRange As Range
Dim datarng As Range
Dim text As Range

Set wrdApp = CreateWord
Set wrdDoc = wrdApp.Documents.Add
With wrdDoc
numbsheets = Application.Sheets.Count
.Content.ParagraphFormat.SpaceBefore = 0
.Content.ParagraphFormat.SpaceAfter = 0

.Content.InsertAfter "Internal Wiki"

Call wrdApp.cntrl("Internal Wiki", "Style", "Title")

.Content.InsertParagraphAfter
.Content.InsertParagraphAfter

这里是cntrl函数

Public Function cntrl(txt As String, fnctn As String, optn As String, Optional optnsize As Integer) as Object
'
' A function to control the word functions from excel
'
'
Dim myRange As Range

Set myRange = fndtxt(txt)

If fnctn = "Style" Then
    Call Style(myRange, optn)
ElseIf fnctn = "List" Then
    Call List(myRange, optn)
ElseIf fnctn = "Format" Then
    If IsMissing(optnsize) Then
    Call format(myRange, optn)
    Else
    Call format(myRange, optn, optnsize)
    End If
End If
End Function

fnd txt函数

Public Function fndtxt(txt As String) As Range
'
' A function to find text and return it as a range. To be used in combination with the formatting funcitons
'
'
Set fndtxt = ActiveDocument.Range
With fndtxt.Find
 .text = txt
 .Forward = True
 .Execute
End With
End Function

还有样式函数。

Public Function Style(txt As Range, stylename As String) As Object
'
' A function to apply styles to ranges
'
'
Dim myRange As Range

Set myRange = txt
myRange.Style = stylename

End Function

我将它们拆分成单独的函数,这样我可以根据需要单独使用它们,也可以在控制函数中一起使用。我确信这不是最有效的方法,但在连续 3 天完成此工作后,我需要将事情分开,否则我将患上动脉瘤。为了通过,我尝试将它们作为 sub 而不是函数,但得到了同样的错误。

我在所有格式化函数中都遇到了同样的错误,我只关注样式函数,因为这似乎是简化事情并使其更容易解释的最佳方式:)。如果需要,也很高兴post那些。

很抱歉,如果有人回答了这个问题,我浏览了论坛,但没有看到类似的内容。

非常感谢任何和所有帮助这让我发疯。

编辑:

非常感谢蒂姆,现在可以正常工作了,这是更改后的工作代码。我将函数移到了 excel 中,您可以在下面找到它们。

Excel宏

Sub ExportData()
'
' ExportData Macro
' Export the data from excel into a more usable form in word
'

Dim sheetcounter As Integer
Dim counter As Integer
Dim numbsheets As Integer
Dim numbepisodes As Integer
Dim wrdApp As Object, wrdDoc As Object
Dim episodetitle As String
Dim nextepisodetitle As String
Dim season As Variant
Dim series As String
Dim episodenumber As String
Dim releasedate As Variant
Dim length As String
Dim fndDay As Integer
Dim fndMnth As Integer
Dim hrs As String
Dim mns As String
Dim scs As String
Dim lnglgth As String

Dim sheetname As String
Dim myRange As Range
Dim lookupRange As Range
Dim datarng As Range
Dim text As Range

Set wrdApp = Createword
Set wrdDoc = wrdApp.Documents.Add
With wrdDoc
numbsheets = Application.Sheets.Count
.Content.ParagraphFormat.SpaceBefore = 0
.Content.ParagraphFormat.SpaceAfter = 0

.Content.InsertAfter "DnD is for Nerds Wiki"

Call cntrl(wrdDoc, "DnD is for Nerds Wiki", "Style", "Title")

.Content.InsertParagraphAfter
.Content.InsertParagraphAfter

控制函数

Public Function cntrl(doc As Word.Document, txt As String, fnctn As String, optn As String, Optional optnsize As Integer) As Object
'
' A function to control the word funcitons from excel
'
'
Dim myRange As Word.Range

Set myRange = fndtxt(doc, txt)

If fnctn = "Style" Then
    Call Style(myRange, optn)
ElseIf fnctn = "List" Then
    Call List(myRange, optn)
ElseIf fnctn = "Format" Then
    If IsMissing(optnsize) Then
    Call format(myRange, optn)
    Else
    Call format(myRange, optn, optnsize)
    End If
End If
End Function

fndtxt 函数

Public Function fndtxt(doc As Word.Document, txt As String) As Word.Range
'
' A function to find text and return it as a range. To be used in combination with the formatting funcitons
'
'

Dim rng As Word.Range
Set rng = doc.Range

With rng.Find
 .text = txt
 .Forward = True
 .Execute
End With
Set fndtxt = rng
End Function

风格功能

Public Function Style(txt As Word.Range, stylename As String) As Object
'
' A function to apply styles to ranges
'
'
Dim myRange As Word.Range

Set myRange = txt
myRange.Style = stylename

End Function

很多都归结为添加这个词。在范围前面。

这是一个基本示例,所有代码都在 Excel 端:

Sub Tester()

    Dim wdApp As Word.Application, doc As Word.Document, rng As Word.Range
    
    Set wdApp = GetObject(, "Word.Application") 'in my testing word is already open
    Set doc = wdApp.Documents.Add()
    
    With doc
        .Content.ParagraphFormat.SpaceBefore = 0
        .Content.ParagraphFormat.SpaceAfter = 0
        .Content.InsertAfter "Internal Wiki"
    
        SetTextStyle doc, "Internal Wiki", "Title"
    
        .Content.InsertParagraphAfter
        .Content.InsertParagraphAfter
    End With
    
End Sub

Sub SetTextStyle(doc As Word.Document, txt As String, theStyle As String)
    Dim rng As Word.Range
    Set rng = WordTextRange(doc, txt)
    If Not rng Is Nothing Then
        rng.style = theStyle
    Else
        MsgBox "'" & txt & "' was not found", vbExclamation
    End If
End Sub


'return a range containing the text `txt` in document `doc`
'  returns Nothing if no match is made
Function WordTextRange(doc As Word.Document, txt As String) As Word.Range
    Dim rng As Word.Range
    Set rng = doc.Range
    With rng.Find
        .Text = txt
        .Forward = True
        If .Execute() Then 'check that Execute succeeds...
            Set WordTextRange = rng
        End If
    End With
End Function