WordApp.Documents.Content.Find 无法正常工作

问题描述 投票:0回答:1

我是 VBA 编程新手,有一个问题。我正在尝试自动处理单词文档。我有一个包含通用名称的模板文档,我需要在 Excel 中使用 VBA 代码将这些通用名称替换为具体名称。问题是当我使用 .Find 函数时,无论哪种方式它都不起作用。我做了一个简单的示例,其中我在调试屏幕上打印了几行,这些行不使用上述函数,但当我使用它时,它不会打印。也就是说下面代码的结果是这样的: 巴士车文本:NOMBRE 雷姆普拉佐:你好

谢谢你

Sub Prueba2()
    Dim WordApp As Object               'Aplicación Word
    Dim PlantillaDoc As Object          'Word plantilla
    
    ' Inicializar la aplicación de Word
    On Error Resume Next
    Set WordApp = GetObject(, "Word.Application")
    If WordApp Is Nothing Then
        Set WordApp = CreateObject("Word.Application")
    End If
    WordApp.Visible = True     'Solo para depurar
    
    Set PlantillaDoc = WordApp.Documents.Open("C:\Users\alsanchez\Documents\Automatización de Proyectos\adsgasdfg\Nuevo Documento de Microsoft Word.docx")

    ' Configuración de búsqueda
    Dim TextoBuscado As String
    Dim ReemplazoTexto As String
    
    TextoBuscado = "NOMBRE"
    ReemplazoTexto = "hello"
    
    Debug.Print "Texto a buscar: " & TextoBuscado
    Debug.Print "Reemplazo: " & ReemplazoTexto
    Debug.Print "Dirección de búsqueda: " & IIf(PlantillaDoc.Find.Forward, "Hacia adelante", "Hacia atrás")
    Debug.Print "Envolver búsqueda: " & IIf(PlantillaDoc.Find.Wrap = wdFindContinue, "Sí", "No")
    Debug.Print "Coincidir mayúsculas/minúsculas: " & IIf(PlantillaDoc.Find.MatchCase, "Sí", "No")

    'Reemplazo del texto de la plantilla por nombres concretos
    PlantillaDoc.Content.Find.ClearFormatting
    PlantillaDoc.Content.Find.Replacement.ClearFormatting
    With PlantillaDoc.Content.Find
        .Text = TextoBuscado
        .Replacement.Text = ReemplazoTexto
        .Forward = True
        .Wrap = 1
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    
    ' Ejecutar búsqueda y reemplazo
    PlantillaDoc.Content.Find.Execute Replace:=2
    
End Sub
excel vba ms-word
1个回答
0
投票

有两件事:

您的

Debug.Print
语句使用了无效对象。您写了
IIf(PlantillaDoc.Find.Wrap = wdFindContinue, "Sí", "No")
,但
PlantillaDoc.Find
不存在。一定是
PlantillaDoc.Content.Find
。或者,更好的是,将这些语句移动到您的
With
块中并写入

With PlantillaDoc.Content.Find
    Debug.Print "Dirección de búsqueda: " & IIf(.Forward, "Hacia adelante", "Hacia atrás")
    Debug.Print "Envolver búsqueda: " & IIf(.Wrap = wdFindContinue, "Sí", "No")
    Debug.Print "Coincidir mayúsculas/minúsculas: " & IIf(.MatchCase, "Sí", "No")
    (...)

当您使用Late Binding时,编译器无法告诉您该问题 - 我的建议是使用Early Binging

当您使用

On Error Resume Next
时,不会显示运行时错误,而是简单地跳过打印语句 - 我的建议是永远不要使用
On Error Resume Next
(除了您期望并知道可能会出现的单个语句)失败)。

好吧,但为什么没有替换任何内容的真正问题很简单:您设置了所有

Find
参数,但忘记了 执行 查找/替换。在代码中添加以下语句:

    .Execute Replace:=wdReplaceAll
End With
© www.soinside.com 2019 - 2024. All rights reserved.