ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 单元格中输入字符串时,如何自动将字符串中的数字设置数值格式?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-2-16 23:04 | 显示全部楼层 |阅读模式
各位前辈高人,假如我在单元格range("a1")中输入以下一段文字:
1月份实现销售收入2230521.36元,2月份实现销售收入3215612.55元,增加985091.19元。
如何在Private Sub Worksheet_Change(ByVal Target As Range)事件中,将字符串中的数字设置为"#,##0.00"的数值格式,即上述文字自动变为:
1月份实现销售收入2,230,521.36元,2月份实现销售收入3,215,612.55元,增加985,091.19元。

TA的精华主题

TA的得分主题

发表于 2019-2-17 00:18 | 显示全部楼层
使用正则匹配,替换就可以了

  1. Sub Macro()
  2.     Dim s1 As String
  3.     s1 = "1月份实现销售收入2230521.36元,2月份实现销售收入3215612.55元,增加985091.19元。"
  4.     With CreateObject("VBSCRIPT.REGEXP")
  5.         .Global = True
  6.         .Pattern = "\d+.[\d]{2}"
  7.         Set mh = .Execute(s1)
  8.         For j = 0 To mh.Count - 1
  9.             s1 = VBA.Replace(s1, mh(j), VBA.Format(mh(j), "#,##0.00"))
  10.             'Debug.Print mh(j), VBA.Format(mh(j), "#,##0.00")
  11.         Next
  12.         Debug.Print s1
  13.     End With
  14. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-17 12:15 | 显示全部楼层
taller 发表于 2019-2-17 00:18
使用正则匹配,替换就可以了

感谢您的回复,但达不到我想要的效果。我是想要在单元格输入的字符串中(每次输入都不固定)即包括汉字,也包括数字,然后通过工作表的单元格事件(Target)将字符串中的数字格式自动设置成“#,##0.00"样式。

TA的精华主题

TA的得分主题

发表于 2019-2-17 14:14 | 显示全部楼层
本帖最后由 taller 于 2019-2-17 14:17 编辑
★子逸☆ 发表于 2019-2-17 12:15
感谢您的回复,但达不到我想要的效果。我是想要在单元格输入的字符串中(每次输入都不固定)即包括汉字, ...

既然你知道使用工作表的单元格事件,那么把代码放在事件中就可以了, s1=Target.Value

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-17 17:46 | 显示全部楼层
taller 发表于 2019-2-17 14:14
既然你知道使用工作表的单元格事件,那么把代码放在事件中就可以了, s1=Target.Value

我按照您的代码,在工作表 range("a1")中可以达到效果:
Sub Macro()
    Dim s1 As String
    s1 = "1月份实现销售收入2230521.36元,2月份实现销售收入3215612.55元,增加985091.19元。"
    With CreateObject("VBSCRIPT.REGEXP")
        .Global = True
        .Pattern = "\d+.[\d]{2}"
        Set mh = .Execute(s1)
        For j = 0 To mh.Count - 1
             s1 = VBA.Replace(s1, mh(j), VBA.Format(mh(j), "#,##0.00"))
            'Debug.Print mh(j), VBA.Format(mh(j), "#,##0.00")
        Next
        Debug.Print s1
        
        Range("a1") = s1
    End With
End Sub

但在工作表单元格事件中,按下面的代码,在任意单元格中输入“1月份实现销售收入2230521.36元,2月份实现销售收入3215612.55元,增加985091.19元”,变成了“1月份实现销售收入223.0052.001.36元,2月份实现销售收入321.00561.002.55元,增加985.000.009.001.19元”。仍然达不到我想要的效果。
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim s1 As String
    s1 = Target.Value
    With CreateObject("VBSCRIPT.REGEXP")
        .Global = True
        .Pattern = "\d+.[\d]{2}"
        Set mh = .Execute(s1)
        For j = 0 To mh.Count - 1
             s1 = VBA.Replace(s1, mh(j), VBA.Format(mh(j), "#,##0.00"))
            'Debug.Print mh(j), VBA.Format(mh(j), "#,##0.00")
        Next
        Debug.Print s1
        
        Target.Value = s1
    End With
End Sub

TA的精华主题

TA的得分主题

发表于 2019-2-18 00:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
代码主要功能是对的,如果没有效果就是放置的模块不对。另外需要加两行避免死循环

  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     Dim s1 As String
  3.     s1 = Target.Value
  4.     With CreateObject("VBSCRIPT.REGEXP")
  5.         .Global = True
  6.         .Pattern = "\d+.[\d]{2}"
  7.         Set mh = .Execute(s1)
  8.         For j = 0 To mh.Count - 1
  9.             s1 = VBA.Replace(s1, mh(j), VBA.Format(mh(j), "#,##0.00"))
  10.             'Debug.Print mh(j), VBA.Format(mh(j), "#,##0.00")
  11.         Next
  12.         'Debug.Print s1
  13.         Application.EnableEvents = False
  14.         Target.Value = s1
  15.         Application.EnableEvents = True
  16.     End With
  17. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2019-2-18 00:20 | 显示全部楼层
demo (2).zip (11.61 KB, 下载次数: 4)

示例文件

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-2-18 16:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
  If CDec(Target.Rows.Count) * Target.Columns.Count > 1 Then Exit Sub
  Dim s As String, mark, i, j, t
  s = Target.Value
  If Len(s) = 0 Then Exit Sub
  Application.EnableEvents = False
  On Error GoTo errmsg
  mark = "0.123456789,"
  For i = Len(s) To 1 Step -1
    If Mid(s, i, 1) = "Ԫ" Then
      For j = i - 1 To 1 Step -1
        If InStr(mark, Mid(s, j, 1)) = 0 Then
          t = Mid(s, j + 1, i - j - 1)
          s = Replace(s, t, Format(Replace(t, ",", vbNullString), "#,##0.00"))
          i = j: Exit For
        End If
      Next
    End If
  Next
  Target.Value = s
  Application.EnableEvents = True
  Exit Sub
errmsg:
  Debug.Print "error"
  Application.EnableEvents = True
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-21 19:56 | 显示全部楼层

非常感谢您,但输入的数字只有一位小数时,会出错,如输入“2月份实现销售收入3215612.5元”(小数点后只有一位小数时),得到的结果是“2月份实现销售收入3,215,612.00.5元”,另外,假如“输入1998年”,得到的结果是“1,998.00年”,有什么办法解决输入年份数字时避免出现"#,##0.00"格式。再次感谢您!

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-21 19:58 | 显示全部楼层
一把小刀闯天下 发表于 2019-2-18 16:37
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

感谢您的回复,但试了下您的代码,好像没反应,达不到预期效果。能否再修正下?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-20 12:50 , Processed in 0.050973 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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