我是新手使用VBA在MS Word中编写宏。我已经研究了如何选择表格中的单元格,但似乎没有我可以使用段落对象...或者,更可能的是,我做错了。
基本上,我正在尝试做的事情,它在表(1)的单元格(13,2)的所有段落中寻找短语“如下:”。如果它找到了,我想看看在该短语之后发生的下一件事是否是带有子弹的新段落。如果是,那很好,没什么可做的。如果不是,那就做一个带子弹的新段落。
我只是不确定如何解决这个问题,特别是确定是否已有子弹。
希望有人可以对这个问题有所了解。在此期间我会继续插手。 :)
更新:我已经到了这里,它插入了一个返回,我希望插入一个子弹但是它在该Cell的许多空格中插入一个子弹而不是在vbCr之后:
Dim BIOCell As range
With ActiveDocument
Set BIOCell = .range(Start:=.Tables(1).Cell(13, 2).range.Start, _
End:=.Tables(1).Cell(13, 2).range.End)
BIOCell.Select
End With
With ActiveDocument.Tables(1)
If .Cell(13, 2).range.Text Like "*as follows:*" Then
With Selection.Find
.Text = "as follows: "
.Replacement.Text = "as follows:" & vbCr
Selection.range.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
ListGalleries(wdBulletGallery).ListTemplates(1), ContinuePreviousList:= _
False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
wdWord10ListBehavior
.Execute Replace:=wdReplaceAll
End With
Else
MsgBox "couldn't find it"
End If
End With
答案 0 :(得分:1)
我修改了您的代码示例,这对我有用。由于您已经为BIOCell声明并分配了一个范围,因此可以在整个宏中使用它来识别单元格内容。没有必要使用" Like" test Range.Find.Execute
如果成功则返回True,否则返回False。当查找成功时,范围将更改为已找到的内容(换句话说,它不再是整个单元格)。
尝试替换段落标记并不是按照您的意愿工作。由于您需要执行无法完成查找/替换的操作(子弹),只需添加段落标记,如果查找成功,则将范围焦点放在单元格的末尾,而不是应用项目符号格式。 (请注意,如果您有Range对象,则无需使用Selection。)
Sub FindInCellAppendBullets()
Dim BIOCell As Range
Dim found As Boolean
With ActiveDocument
Set BIOCell = .Range(Start:=.Tables(1).Cell(13, 2).Range.Start, _
End:=.Tables(1).Cell(13, 2).Range.End)
BIOCell.Select
End With
With BIOCell.Find
.Text = "as follows: "
found = .Execute
If found Then
BIOCell.InsertParagraphAfter
BIOCell.Collapse wdCollapseEnd
BIOCell.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
ListGalleries(wdBulletGallery).ListTemplates(1), ContinuePreviousList:= _
False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
wdWord10ListBehavior
Else
MsgBox "couldn't find it"
End If
End With
End Sub
如果表格单元格已经包含文本段落,并且您希望查找“查找”字词后的所有内容,则代码看起来就像后面的示例。
在这种情况下,第二个Range对象用于执行查找,而BIOCell仍然分配给整个单元格。 (始终使用Duplicate
属性来制作可以独立使用的范围的"副本。范围是Office对象模型中的一个分析:Range
= {{1}使两个范围相同 - 如果你改变一个的位置,其他的位置也会改变。)
一旦查找成功,findRange将折叠到“查找”字词的末尾,并进一步移动一个段落(到找到的文本后面的第一个段落)。然后将Range的末尾扩展到单元格的末尾(BIOCell的结尾),然后移回几个字符,这样它就不包含单元格结束标记。 (否则,子弹将应用于整个单元格,而不是通过单元格的最后一段。)
Range
答案 1 :(得分:0)
尝试:
Sub Demo()
Application.ScreenUpdating = False
Dim Rng As Range, i As Long
With ActiveDocument.Tables(1).Cell(13, 2)
Set Rng = .Range
With .Range
With .Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = "as follows:"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute
End With
If .Find.Found = False Then
MsgBox "couldn't find it"
Exit Sub
End If
Do While .Find.Found
If .InRange(Rng) Then
If .Characters.Last.Next <> vbCr Then .InsertAfter vbCr & vbCr
If .Paragraphs.Last.Next.Range.ListFormat.ListType <> wdListBullet Then
If Len(.Paragraphs.Last.Next.Range.Text) > 1 Then .InsertAfter vbCr
.Paragraphs.Last.Next.Range.ListFormat.ApplyListTemplateWithLevel _
ListTemplate:=ListGalleries(wdBulletGallery).ListTemplates(1), _
ContinuePreviousList:=False, ApplyTo:=wdListApplyToWholeList, _
DefaultListBehavior:=wdWord10ListBehavior
End If
Else
Exit Do
End If
.Collapse wdCollapseEnd
.Find.Execute
Loop
End With
End With
Application.ScreenUpdating = True
End Sub
与Cindy的代码不同,上面将插入一个子弹段落,无论其是否如下:&#39;当以下段落不是一个项目符号时,字符串以段落(或空格以外的任何内容)终止。