我创建了以下内容以逗号分隔ms-word文档中的数字列表。但是,我还想用单个qoutation标记包装每个数字 - 我正在努力做到正确。我设法包装了第一个数字但是我不能为其他数字执行它。每个数字长12位。有人可以帮忙吗?
Sub Macro1()
With Selection
.Find.Text = "^p"
.Find.Replacement.Text = ","
.Find.Execute Replace:=wdReplaceAll
.TypeText Text:="'"
.MoveRight Unit:=wdCharacter, Count:=12
.TypeText Text:="'"
End With
End Sub
答案 0 :(得分:1)
替代和更快的解决方案是使用通配符进行另一个查找替换。完整代码如下所示:
Sub Macro1()
With Selection
'1st step- replacement paragraph marks into commas
.Find.Text = "^p"
.Find.Replacement.Text = ","
.Find.MatchWildcards = False
.Find.Execute Replace:=wdReplaceAll
'2nd step- adding single quotation marks
.Find.Text = "([0-9]{12})"
.Find.MatchWildcards = True
.Find.Replacement.Text = "'\1'"
.Find.Execute Replace:=wdReplaceAll
End With
End Sub
答案 1 :(得分:0)
我认为你需要在With块之外移动转换。
我不是Word VBA专家,所以这是一种使用常见字符串函数的方法,而不是复制键盘输入。因此,可能有不同的方法来完成相同的任务:)我怀疑这是“正确”的方法,因为通常建议不要模仿“输入”,而是直接使用对象。
修改,以便您无需在物理上“选择”文字
注意:这会在文档中使用所有文本,因此您可能需要修改。
Sub Test()
Dim doc As Document
Dim arr As Variant
Dim txtRange As Range
Dim i As Long
Set doc = ActiveDocument
Set txtRange = doc.Range(0, doc.Characters.Count)
'First, replace the paragraph breaks with commas
With txtRange.Find
.Text = "^p"
.Replacement.Text = ","
.Execute Replace:=wdReplaceAll
End With
arr = Split(Left(txtRange.Text, Len(txtRange.Text) - 1), ",")
For i = LBound(arr) To UBound(arr)
arr(i) = "'" & arr(i) & "'"
Next
txtRange.Text = Join(arr, ",")
End Sub
评论更新
我绝对确认这是有效的。请仔细检查您是否正确实施了代码。以下是一些符合您描述的文字示例:
我选择该文本,并运行宏,使用F8单步执行。在With
块结束时,请注意段落符号已替换为逗号:
在For...Next
循环退出后,我确认使用Locals窗口,新数组现在包含用单引号括起的数字:
下一行打印出数组中的这些项目,并替换Selection.Text
,确认:
答案 2 :(得分:0)
我重新编写了原始代码,这在大型数据集上运行得非常快。我现在也在代码的开头和结尾添加括号。
Sub TestN()
Options.AutoFormatAsYouTypeReplaceQuotes = False
'Replace the paragraph breaks with commas and single quotes
With ActiveDocument.Range(0, ActiveDocument.Range.End - 1).Find
.Text = "^p"
.Replacement.Text = "','"
.Execute Replace:=wdReplaceAll
End With
Options.AutoFormatAsYouTypeReplaceQuotes = True
'Cap body of data with single quotes and brackets
ActiveDocument.Content.Text = "('" & ActiveDocument.Range(0, ActiveDocument.Range.End - 1).Text & "')"
End Sub