首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VBA >

将Word中的英文单、双引号转换为中文标点,存在一个有关问题

2012-09-15 
将Word中的英文单、双引号转换为中文标点,存在一个问题求助!这是网上搜到的一个宏代码,能正常运行,但当中存

将Word中的英文单、双引号转换为中文标点,存在一个问题求助!
这是网上搜到的一个宏代码,能正常运行,但当中存在一个问题:
'==================================================================
Sub 英文单双引号转中文()
  Dim CountD As Integer, CountS As Integer, i As Integer, j As Integer, Sh As Byte '声明变量
  Dim ywdy As String, zwdy1 As String, zwdy2 As String, ywsy As String, zwsy1 As String, zwsy2 As String '声明变量

  '以下代码统计出文中的引号数目(包括""“”)
  On Error Resume Next
  ywdy = "'"
  zwdy1 = "‘"
  zwdy2 = "’"
  ywsy = """"
  zwsy1 = "“"
  zwsy2 = "”"

  sure = MsgBox("请先确保您已将WORD的“工具”-自动更正选项-键入时自动套用格式-键入时自动替换-“直引号替换为弯引号”的勾已去掉。" + vbCrLf + " 如果您已去掉勾选,请点击“确定”,否则请按取消", vbOKCancel, "英文单、双引号转中文单、双引号")
  If sure = 1 Then

  With ActiveDocument.Content.Find
  Do While .Execute(FindText:=ywdy, Forward:=True, Format:=True) = True
  Countd = Countd + 1
  Loop
  End With
  For j = 1 To Countd
  Sh = j Mod 2 '求i值除以2的余数
  If Sh <> 0 Then '如果余数不等于0(即为奇数),则将相应的引号替'换为“前d”
  With ActiveDocument.Content.Find
  .Text = ywdy
  .Replacement.Text = "前d"
  .Execute Replace:=wdReplaceOne, Forward:=True
  End With
  Else
  With ActiveDocument.Content.Find '反之则将相应的引号替换为“后d”
  .Text = ywdy
  .Replacement.Text = "后d"
  .Execute Replace:=wdReplaceOne, Forward:=True
  End With
  End If
  Next '进行下一对引号的替换
  With ActiveDocument.Content.Find
  '以下代码将所有的“前d”替换为左引号
  .Text = "前d"
  .Replacement.Text = zwdy1
  .Execute Replace:=wdReplaceAll, Forward:=True
  '以下代码将所有的“后d”替换为右引号
  .Text = "后d"
  .Replacement.Text = zwdy2
  .Execute Replace:=wdReplaceAll, Forward:=True
  End With

  With ActiveDocument.Content.Find
  Do While .Execute(FindText:=ywsy, Forward:=True, Format:=True) = True
  Counts = Counts + 1
  Loop
  End With
  For i = 1 To Counts
  Sh = i Mod 2 '求i值除以2的余数
  If Sh <> 0 Then '如果余数不等于0(即为奇数),则将相应的引号替'换为“前d”
  With ActiveDocument.Content.Find
  .Text = ywsy
  .Replacement.Text = "前s"
  .Execute Replace:=wdReplaceOne, Forward:=True
  End With
  Else
  With ActiveDocument.Content.Find '反之则将相应的引号替换为“后d”
  .Text = ywsy
  .Replacement.Text = "后s"
  .Execute Replace:=wdReplaceOne, Forward:=True
  End With
  End If
  Next '进行下一对引号的替换
  With ActiveDocument.Content.Find
  '以下代码将所有的“前s”替换为左引号
  .Text = "前s"
  .Replacement.Text = zwsy1
  .Execute Replace:=wdReplaceAll, Forward:=True
  '以下代码将所有的“后s”替换为右引号
  .Text = "后s"
  .Replacement.Text = zwsy2
  .Execute Replace:=wdReplaceAll, Forward:=True
  End With



  ActiveDocument.Content.Font.Name = "宋体"

  End If
End Sub
'==================================================================

现在有一个问题:当文章很长很长,里边的单、双引号由于疏忽、手误或遗漏等等原因,不是成对地出现时,上述宏处理的结果就乱套了!

举个例子:

  金庸,当代著名作家,新闻学家,企业家,社会活动家。原名"查良镛("zhā liáng yōng",英文名"Louis Cha"),1924年3月10日生于浙江省海宁县袁花镇。作为新派武侠小说最杰出的代表作家,被誉为武侠小说家的"泰山北斗","金大侠"或"查大侠"。是《香港基本法》主要起草人之一,曾荣获香港"大紫荆勋章"。

会被误转为:

  金庸,当代著名作家,新闻学家,企业家,社会活动家。原名“查良镛(”zhā liáng yōng“,英文名”Louis Cha“),1924年3月10日生于浙江省海宁县袁花镇。作为新派武侠小说最杰出的代表作家,被誉为武侠小说家的”泰山北斗“,”金大侠“或”查大侠“。是《香港基本法》主要起草人之一,曾荣获香港”大紫荆勋章“。 

文章短还比较容易发现,若文章很长,这错误就很难排查了。

我初步设想的一个解决办法是:先用另一个宏代码“预处理”一遍文章,总体思路是,以“段”(回车)为单位,统计每一段当中出现的“"”与“'”的个数。若为奇数,则报错,以便修正。代码如下:

'==================================================================
Sub 全文检查单双引号是否双数()
  Dim nPara As Integer, nCount As Integer, rngParagraph As Range '声明变量
  nPara = ActiveDocument.Paragraphs.count '统计文章一共有多少个段落
  for i = 1 to nPara '遍历全部段落
  Set rngParagraph = ActiveDocument.Paragraphs(i).Range
  '返回一个Range对象,该对象引用活动文档的第i个段落
  if rngParagraph.Find.Execute(FindText:="'", Forward:=True) = True Then
  nCount = 0
  With rngParagraph.Find
  Do While .Execute(FindText:="'", Forward:=True) = True
  nCount = nCount + 1
  Loop
  if nCount Mod 2 <> 0 Then '求nCount值除以2的余数,如果余数不等于0(即为奇数),则有错!
  '.Parent.InsertAfter "★★★"
  rngParagraph.InsertAfter "★★★"
  rngParagraph.InsertParagraphAfter
  endif
  End With
  endif

  if rngParagraph.Find.Execute(FindText:="""", Forward:=True) = True Then
  nCount = 0
  With rngParagraph.Find
  '.ClearFormatting
  Do While .Execute(FindText:="""", Forward:=True) = True
  nCount = nCount + 1
  Loop
  if nCount Mod 2 <> 0 Then '求nCount值除以2的余数,如果余数不等于0(即为奇数),则有错!
  '.Parent.InsertAfter "☆☆☆"
  rngParagraph.InsertAfter "☆☆☆"
  rngParagraph.InsertParagraphAfter
  endif
  End With
  endif

  Next '遍历全部段落的循环
End Sub
'==================================================================

但它不works! 俺的VBA还没入门,水平奇臭。宏自动插入“★★★”和“☆☆☆”,代表这一段落的单引号或双引号数目是奇数,不对,需修正!可是代码运行的结果,它们插入的地方不对。另,当文章中有表格时,表格当中的引号也并不被自动统计和处理。

特来求助,恳请帮助修改一下这段宏代码,以便真正实用。
非常非常非常感谢!


[解决办法]
上面的代码是搜索整个文本引号的个数,不是每个段落的。

解决方法我也上谷歌搜搜。
[解决办法]
在text里查找到是个好办法。

目前看来只能这么做了。

热点排行