我是 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
有两件事:
您的
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