ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 日期替换求便捷方法

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-9-23 08:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 周星骋 于 2014-9-23 09:19 编辑
loquat 发表于 2014-9-22 15:34
楼上表达式用的出神入化了。
不过实际上也只需要两次替换吧。


呵呵,这样只是分别给日、月前加了一个“0”,
结果是:本来2位数的日、月,替换成了3位数。
而且第一个替换“日”后还无意中多了一根减号。

不过,你懂VBA,能实现一步替换,这我完全相信。

TA的精华主题

TA的得分主题

发表于 2014-9-23 08:31 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
wshcw 发表于 2014-9-22 15:34
"\"占位符,这点与EXCEL中的单元格格式是相通的,规定占位符后的字符没有特殊含义,只代表字符本身.有特殊含义 ...

Bingo!
引用反斜杠本身,的确需要双反,我刚还用单反测试了一下,果然不行。

TA的精华主题

TA的得分主题

发表于 2014-9-23 09:41 | 显示全部楼层
本帖最后由 loquat 于 2014-9-23 09:43 编辑
周星骋 发表于 2014-9-23 08:24
呵呵,这样只是分别给日、月前加了一个“0”,
结果是:本来2位数的日、月,替换成了3位数。
而且第一 ...

一、先处理“日”,保留分隔符
勾上“使用通配符”
“查找内容”:([0-9]{4})-([0-9]{1,2})-([0-9]{1})([!0-9])
“替换为”:\1-\2-0\3\4

二、再处理“月”,保留分隔符
勾上“使用通配符”
“查找内容”:([0-9]{4})-([0-9]{1})-([0-9]{2})([!0-9])
“替换为”:\1-0\2-\3\4

三、去掉分隔符
勾上“使用通配符”
“查找内容”:([0-9]{4})-([0-9]{2})-([0-9]{2})([!0-9])
“替换为”:\1\2\3\4


只能省掉一部,意义不大啊。。。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-9-23 10:27 | 显示全部楼层
本帖最后由 周星骋 于 2014-9-23 11:52 编辑
loquat 发表于 2014-9-22 15:34
楼上表达式用的出神入化了。
不过实际上也只需要两次替换吧。


根据 loquat 在第19楼的提示,第14楼的问题化简成3步是可以的。

原理是:
前两步分别将1位数的月、日先变成2位数,关键是要保留分隔符,“日”、“月”哪先哪后处理到是无所谓。
第三步统一去掉分隔符。

为了达到各种分隔符通用,这里将减号“-”顺手改为圆点、减号、斜杠、反斜杠4种符号(其中减号、反斜杠前加占位符),即“[.\-/\\]”。以后有其它分隔符号的话,直接加到方括号里即可。

第1步、将1位数“月”变成2位数
勾选“使用通配符”;
查找内容:
  1. ([0-9]{4})([.\-/\\])([0-9]{1})([.\-/\\])([0-9]{1,2})([!0-9])
复制代码
替换为:
  1. \1\20\3\4\5\6
复制代码

第2步、将1位数的“日”变成2位数
勾选“使用通配符”;
查找内容:
  1. ([0-9]{4})([.\-/\\])([0-9]{1,2})([.\-/\\])([0-9]{1})([!0-9])
复制代码
替换为:
  1. \1\2\3\40\5\6
复制代码

注:上边两步都用到了“[0-9]{1,2}”,这样可保证处理“月”、“日”时不分先后。

第3步、统一去掉分隔符号
勾选“使用通配符”;
查找内容:
  1. ([0-9]{4})([.\-/\\])([0-9]{2})([.\-/\\])([0-9]{2})([!0-9])
复制代码
替换为:
  1. \1\3\5\6
复制代码

当我写完这个回复后,发现 loquat 又有新回复,果然也是3步。
真是 loquat 省略一小步,人类对替换的理解又迈进一大步。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-9-23 11:30 | 显示全部楼层
本帖最后由 周星骋 于 2014-9-23 11:46 编辑

索性将分隔符号打乱,录制上述3步替换的宏,做个附件,
期待VBA高手将代码简化一下。

注意:
当光标定位在某个日期中间(含后面的回车和下一行开头)时,
无论是手工替换,还是用宏替换,
都无法替换掉光标所在位置处的那一个日期,
因为光标将当前日期 或日期和后面的“非数字” 分成了两半截,
“查找内容”代码 无法查找到前、后两半截的内容。
光标最好定位到 全文开头 或者日期后面一个或多个字 的地方,才可以。

补充:
有VBA就好办,运行替换之前,加一行代码:
Selection.HomeKey Unit:=wdStory '光标定位到文章开头
呵呵,这样也行。

将带有分隔符的日期替换为8位数格式.rar (11.42 KB, 下载次数: 5)

TA的精华主题

TA的得分主题

发表于 2014-9-23 15:43 | 显示全部楼层
本帖最后由 loquat 于 2014-9-23 15:50 编辑

代码整体思路不是很清晰,在VBA中完全可以优化更通用,欢迎拍砖
  1. Sub 替换日期_MeThee()
  2. '1.将日期统一为8为数字格式
  3. '2.目前仅支持:“四位年份+分隔符+(1-2位月份)分隔符+(1-2位日期)”格式
  4. '3.分隔符列表可以在代码中修改
  5. Dim aRange As Range, aText As String
  6. Dim 分隔符 As String
  7. 分隔符 = "[.\-/\\]"
  8. Set aRange = ActiveDocument.Content
  9. With aRange.Find
  10.     .ClearFormatting
  11.     .MatchWildcards = True
  12.     .Text = "([0-9]{4})" & 分隔符 & "([0-9]{1,2})" & 分隔符 & "([0-9]{1,2})"
  13.     .Forward = True
  14.     .Wrap = wdFindContinue
  15.     .MatchByte = True
  16.     Do While .Execute = True
  17.         aText = aRange.Text
  18.         With CreateObject("Vbscript.RegExp")
  19.             .Global = True
  20.             .Pattern = "[^0-9]"
  21.             aText = .Replace(aText, "-")
  22.         End With
  23.         aText = Format(CDate(aText), "yyyymmdd")
  24.         aRange.Text = aText
  25.     Loop
  26. End With
  27. Set aRange = Nothing
  28. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-9-23 16:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
loquat 发表于 2014-9-23 15:43
代码整体思路不是很清晰,在VBA中完全可以优化更通用,欢迎拍砖

高!
(好吧,凑够10个字回复)

TA的精华主题

TA的得分主题

发表于 2014-9-23 16:26 | 显示全部楼层
本帖最后由 周星骋 于 2014-9-23 16:28 编辑

闲来无事,来两个拓展训练。
换成8位数,基本就那么的了。
现在往回换:

一、将8位数日期替换成减号分隔格式,并且不保留虚位“0”。
手工替换分两步。
第1步,将日期分为4、2、2位数,中间用减号隔开
勾选“使用通配符”;
查找内容:

  1. ([0-9]{4})([0-9]{2})([0-9]{2})
复制代码
替换为:
  1. \1-\2-\3
复制代码

第2步,去掉虚位“0”
勾不勾“使用通配符”都行;
查找内容:
  1. -0
复制代码
替换为:
  1. -
复制代码

二、将8位数日期替换成“×年×月×日”,不保留虚位“0”
这个,其实又回到了楼主在第1楼的问题,只不过增加了一步:不保留虚位“0”。
第1步,将日期分为4、2、2位数字,分别带上“年月日”
勾选“使用通配符”;
查找内容:
  1. ([0-9]{4})([0-9]{2})([0-9]{2})
复制代码
替换为:
  1. \1年\2月\3日
复制代码

第2步,去掉虚位“0”
勾选“使用通配符”;
查找内容:
  1. ([年,月])0
复制代码
替换为:
  1. \1
复制代码

哈哈,这个帖子让我回复得 味同嚼蜡 了。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-9-23 21:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
loquat 发表于 2014-9-23 15:43
代码整体思路不是很清晰,在VBA中完全可以优化更通用,欢迎拍砖

筑巢引凤,求助得好解,令我回味无穷.感谢两位鼎立相助。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-1-28 10:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 wshcw 于 2015-2-2 09:44 编辑
周星骋 发表于 2014-9-16 16:22
刚又发现查找内容还可以更简单点,这样也行:
([0-9]{4})([0-9]{2})([0-9]{2})

现在又复习了一下,将以下三种情况:
2013.1.1
2013.8.25
2013.12.5
2013-1-1
2013-8-25
2013-12-25
2013/1/1
2013/8/25
2013/12/1
统一变为年月日格式
查找:
([!0-9])([0-9]{1,2})([!0-9])([0-9]{1,2})([!0-9])
替换为:
年\2月\4日\5
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-15 18:08 , Processed in 0.029750 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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