ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1457|回复: 9

[已解决] WORD表格内的数值批量替换

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-2-16 14:53 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 woyaofacai 于 2020-2-18 16:57 编辑

WORD文档中有批量的表格,表格中部份负值数字格为-123.45,如果出现类同格式的数字格式转换为(123.45) 项 目.rar (30.46 KB, 下载次数: 38) ,能否用VBA批量替换所有表格内的值的格式?

TA的精华主题

TA的得分主题

发表于 2020-2-17 12:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
见下面代码:
Sub NUM_change()
  Dim i%
  Dim tb As Table
  Dim doc As Document
  Set doc = ActiveDocument
  For Each tb In doc.Tables
    For i = 2 To tb.Rows.Count
       If Val(tb.Cell(i, 2).Range) < 0 Then
           tb.Cell(i, 2).Range.Find.Execute findText:="-", ReplaceWith:="", Replace:=wdReplaceAll
           tb.Cell(i, 2).Range = "(" & Left(tb.Cell(i, 2).Range, Len(tb.Cell(i, 2).Range) - 2) & ")"
       End If
    Next
  Next
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-17 15:30 | 显示全部楼层
excel玉米 发表于 2020-2-17 12:51
见下面代码:
Sub NUM_change()
  Dim i%

大侠,你好,如果表格有些为2列,有些3列,最终多时7列,执行上述代码运行后只有第二列才可以,其他列没有变化,如就是说可否考虑一下表格列数不等的情况下达到要求呢?

TA的精华主题

TA的得分主题

发表于 2020-2-18 01:24 | 显示全部楼层
自己加一个循环就可以了
Sub NUM_change()
  Dim i%
  Dim tb As Table
  Dim doc As Document
  Set doc = ActiveDocument
  For Each tb In doc.Tables
    For i = 2 To tb.Rows.Count
For j=1 to 7
       If Val(tb.Cell(i, j).Range) < 0 Then
           tb.Cell(i, j).Range.Find.Execute findText:="-", ReplaceWith:="", Replace:=wdReplaceAll
           tb.Cell(i, j).Range = "(" & Left(tb.Cell(i, j).Range, Len(tb.Cell(i, j).Range) - 2) & ")"
       End If
next
    Next
  Next
End Sub

没有测试,自己测试一下

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-2-18 15:15 | 显示全部楼层
改成这样吧。 For j=1 to tb.columns.count  从左至右,如果只是单纯for j=1 to 7,可能会出错。因为表的大小不完全是7列。
Sub NUM_change()
  Dim i%
  Dim tb As Table
  Dim doc As Document
  Set doc = ActiveDocument
  For Each tb In doc.Tables
    For i = 2 To tb.Rows.Count
      For j=1 to tb.columns.count
       If Val(tb.Cell(i, j).Range) < 0 Then
           tb.Cell(i, j).Range.Find.Execute findText:="-", ReplaceWith:="", Replace:=wdReplaceAll
           tb.Cell(i, j).Range = "(" & Left(tb.Cell(i, j).Range, Len(tb.Cell(i, j).Range) - 2) & ")"
       End If
      next
    Next
  Next
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-18 16:49 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-2-18 18:05 | 显示全部楼层
Sub lkyy()
Dim doc As Document
Set doc = Word.ActiveDocument
With doc.Content
    .Find.Execute "-([0-9]{1,3},[0-9]{3},[0-9]{3}.[0-9]{2})", , , 1, , , , , , "(\1)", 2
    .Find.Execute "-([0-9]{1,3},[0-9]{3}.[0-9]{2})", , , 1, , , , , , "(\1)", 2
End With
End Sub

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-2-19 12:26 | 显示全部楼层
本帖最后由 excel玉米 于 2020-2-19 12:43 编辑
凌空一羽 发表于 2020-2-18 18:05
Sub lkyy()
Dim doc As Document
Set doc = Word.ActiveDocument

凌老师的代码非常简练,吾辈当学习之。谢谢凌老师提供!刚才验证了下代码,建议修改如下,无使有错漏。
Sub lkyy()
Dim doc As Document
Set doc = Word.ActiveDocument
With doc.Content
    .Find.Execute "-([0-9]{1,3},[0-9]{3},[0-9]{3}.[0-9]{1,2})", , , 1, , , , , , "(\1)", 2
    .Find.Execute "-([0-9]{1,3},[0-9]{3}.[0-9]{1,2})", , , 1, , , , , , "(\1)", 2
    .Find.Execute "-([0-9]{1,3}.[0-9]{1,2})", , , 1, , , , , , "(\1)", 2
End With
End Sub


评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-22 22:23 | 显示全部楼层
excel玉米 发表于 2020-2-19 12:26
凌老师的代码非常简练,吾辈当学习之。谢谢凌老师提供!刚才验证了下代码,建议修改如下,无使有错漏。
...

好精简的代码,如果条件变换一下,在整个WORD文档中我只要第8页才执行上面的替换代码,前面表格保留原来的内容和格式,试过没有成功

TA的精华主题

TA的得分主题

发表于 2020-2-23 12:52 | 显示全部楼层
woyaofacai 发表于 2020-2-22 22:23
好精简的代码,如果条件变换一下,在整个WORD文档中我只要第8页才执行上面的替换代码,前面表格保留原来 ...

有这么复杂么?试试下列代码:
  1. Sub kkk()
  2.     Dim myTbl As Table, theStr$, reg As Object, theCell As Cell
  3.     '
  4.     Set reg = CreateObject("VBScript.RegExp")
  5.     With reg
  6.         .Pattern = "-(\d+(,\s*\d+)*(.\d+)?)"
  7.         .Global = True
  8.         For Each myTbl In ActiveDocument.Tables
  9.             For Each theCell In myTbl.Range.Cells
  10.                 theStr = theCell.Range.Text
  11.                 theStr = Left(theStr, Len(theStr) - 2)
  12.                 If reg.test(theStr) Then
  13.                     theStr = .Replace(theStr, "($1)")
  14.                     theCell.Range.Text = theStr
  15.                 End If
  16.             Next theCell
  17.         Next myTbl
  18.     End With
  19. The_Exit:
  20.     Set reg = Nothing
  21. End Sub
复制代码

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-24 14:43 , Processed in 0.046498 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表