gpt4 book ai didi

vba - 使用 Excel VBA 从 Word 表格的单元格中删除内容

转载 作者:行者123 更新时间:2023-12-02 11:35:32 26 4
gpt4 key购买 nike

我目前正在开展一个项目,正在寻求一些帮助。为了让大家大致了解正在发生的事情,我将逐步介绍该场景。

1) 目前,我有一个名为“AnimalNamesToRemove”的字符串数组(在本例中,该数组包含以下单词),其中包含在我希望从单词表中删除的单词文档中用作书签的单词引用如下:

要删除的动物名称

动物猫、动物狗、动物鸟

2) 除了数组之外,word 文档中还存在一个表格,其中第一列中包含动物的名称,以及有关该动物的一些信息(唯一重要的信息是动物的名称)动物):

单词表

enter image description here

3) 对于这种情况,我有一个 Excel 表,我希望用它来引用数组中的单词和单词表名称,因为正在使用的单词文档中已经有书签,其中包含存在于数组。为了将这些放在一起,存在一个两列 Excel 电子表格,其中包含书签名称和实际动物名称(第二列使用名为“myRangeRef”的范围引用):

电子表格

enter image description here

4)我想要做的是,对于上述数组中的每个值,如果在电子表格表(即第二列“书签引用”)中找到该值(例如“AnimalDog”),则偏移到第一列中其旁边的相应单元格(即“Dog”)并使用这些值创建一个新的逗号分隔字符串,与“AnimalNamesToRemove”(即 Cat、Dog、Bird)相同,然后将其转换为名为“的字符串数组”要删除的动物”。创建数组后,在第一列中选​​择所有值并根据第二列中的引用将其放入数组中,我想在单词表中逐行查找新数组中存在的每个值“AnimalsToDelete”,如果该值(即猫、狗和鸟)存在于单词表中(在第一列中找到),我希望代码删除在其中找到该名称的整行(参见下面显示的结果)

结果示例

enter image description here

Dim wdTable As Object
Dim myRangeRef As Range
Dim AnimalNamesToRemove As Variant
Dim AnimalsToDelete As Variant
Dim wdDoc As Object

Set myRangeRef = ThisWorkbook.Sheets("Bookmark References").Range("B1:B6")

Set wdTable = wdDoc.Tables(1)
For i = LBound(AnimalNamesToRemove) To UBound(AnimalNamesToRemove)
For Each cell In myRangeRef
If InStr(1, cell.Value, AnimalNamesToRemove(i), vbTextCompare) Then
aCell = cell.Offset(, -1).Value
stTemp = stTemp & "," & aCell
End If
Next cell
Next i

stTemp = Mid(stTemp, 2)
If Not Len(Trim(stTemp)) = 0 Then
AnimalsToDelete = Split(stTemp, ",")
For i = LBound(AnimalsToDelete) To UBound(AnimalsToDelete)
For j = wdTable.Rows.Count To 2 Step -1
If wdTable.cell(j, 1).Range.Text = AnimalsToDelete(i) Then wdTable.Rows(j).Delete
Next j
Next i
End If

如果您有任何解决方案和/或建议,请在下面评论。

注意:代码的第一部分用于创建字符串数组(即从“set wdTable =”到“next i”),它从我的单词表中删除信息我有问题。最好的,

jack ·亨德森

最佳答案

好吧,根据您的代码,我在 Excel VBE 中添加了对 Microsoft Word 16.0 对象库 的引用(工具 - 引用,选中该框),以便我们可以使用 Word 内容。接下来我编写了以下程序:

Sub Test()
Dim BookMarksToDelete() As String
Dim ReturnsToDelete() As String
Dim wApp As Word.Application
Dim wDoc As Word.Document
Dim wdTable As Word.Table
Dim myRangeRef As Range
Dim cel As Range
Dim aCell As String

Set wApp = New Word.Application
Set wDoc = wApp.Documents.Open("C:\Temp\Col1.docx")
Set wdTable = wDoc.Tables(1)

ReDim BookMarksToDelete(0 To 1)
BookMarksToDelete(0) = "BlahOne"
BookMarksToDelete(1) = "BlahThree"

Set myRangeRef = Worksheets("Sheet1").Range("B1:B5")

For i = LBound(BookMarksToDelete) To UBound(BookMarksToDelete)
For Each cel In myRangeRef
If InStr(1, cel.Value, BookMarksToDelete(i), vbTextCompare) Then
aCell = cel.Offset(0, -1).Value
stTemp = stTemp & "," & aCell
End If
Next cel
Next i

stTemp = Mid(stTemp, 2)
If Not Len(Trim(stTemp)) = 0 Then
ReturnsToDelete = Split(stTemp, ",")
For i = LBound(ReturnsToDelete) To UBound(ReturnsToDelete)
For j = wdTable.Rows.Count To 2 Step -1
If Left(wdTable.cell(j, 1).Range.Text, Len(wdTable.cell(j, 1).Range.Text) - 2) = ReturnsToDelete(i) Then
wdTable.Rows(j).Delete
End If
Next j
Next i
End If

wDoc.Save
wDoc.Close
wApp.Quit

Set wdTable = Nothing
Set wDoc = Nothing
Set wApp = Nothing
Set myRangeRef = Nothing
End Sub

正如你所看到的,我基本上坚持了与你完全相同的结构,并且它运行得很好。

您的主要问题(word doc中的行未被删除或找到)是因为word表格中的单元格中的文本实际上在最后包含2个额外的字符。一个是“假新行”,当您点击 GUI 一词上的此段落按钮时,另一个会出现 - 它是一个“单元格结尾”标记。

例如参见this discussion

编辑我自己以“BlahOne”和“NameOne”示例为基础,但是,当然,您可以为动物编辑它......

关于vba - 使用 Excel VBA 从 Word 表格的单元格中删除内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44760133/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com