ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

vba 使txt中英文中间加空格并对齐

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-11-5 20:00 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
达到图片中的效果
66.jpg

文件.rar

289 Bytes, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2020-11-29 00:42 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
正则(?<![一-龢])(?=[一-龢])

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-11-29 13:56 来自手机 | 显示全部楼层
简七 发表于 2020-11-29 00:42
正则(?

能写下代码吗?

TA的精华主题

TA的得分主题

发表于 2020-11-30 08:51 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub test()
Dim ado As Object
Dim reg As Object
Dim p$, s$, rs$, f$
p = Dir(ThisWorkbook.Path & "\*.txt") '文本文件目录
Set ado = CreateObject("adodb.stream") 'ado
Set reg = CreateObject("VBscript.regexp") '正则

With reg
.MultiLine = True '多行
.Global = True '全部
.ignorecase = True '不区分大小写
.Pattern = "([一-龢]+)" '表达式
End With

With ado
.Charset = "GB2312" '编码
.Type = 2 '打开类型

End With


While p <> ""
f = ThisWorkbook.Path & "\" & p
With ado
.Open '打开ado
.LoadFromFile f '载入文件
s = .ReadText '读文本
End With

rs = reg.Replace(s, Chr(9) & "$1") '正则替换并将值赋给变量
ado.Close '关闭ado
Kill f '删除原文件

ado.Open
ado.WriteText rs '写入修改后文本
ado.SaveToFile f '保存文件
ado.Close
p = Dir
Wend
Set ado = Nothing
Set reg = Nothing
End Sub

TA的精华主题

TA的得分主题

发表于 2020-11-30 09:47 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 简七 于 2020-11-30 09:56 编辑

中间判定一下字符串长度是否小于8 <8要在加对应制表符 因为字符长度大于等于8制表符长度会再增加8个位置

TA的精华主题

TA的得分主题

发表于 2020-11-30 09:56 来自手机 | 显示全部楼层
Sub test()
Dim ado As Object
Dim reg As Object
Dim p$, s$, rs$, f$, sarr, i%, maxlength, slength, slength2
p = Dir(ThisWorkbook.Path & "\*.txt") '文本文件目录
Set ado = CreateObject("adodb.stream") 'ado
Set reg = CreateObject("VBscript.regexp") '正则

With reg
.MultiLine = True '多行
.Global = True '全部
.ignorecase = True '不区分大小写
.Pattern = "([一-龢]+)" '表达式
End With

With ado
.Charset = "GB2312" '编码
.Type = 2 '打开类型

End With


While p <> ""
rs = "" '写入文本置空
f = ThisWorkbook.Path & "\" & p '文件路径
With ado
.Open '打开ado
.LoadFromFile f '载入文件
s = .ReadText '读文本
End With
sarr = Split(s, vbNewLine) '读入文本转换为数组
maxlength = 0 '字符串最大长度置0
For i = LBound(sarr) To UBound(sarr) '计算每行字符串最大长度
If maxlength < Len(reg.Replace(sarr(i), "")) Then maxlength = Len(reg.Replace(sarr(i), "")) '逐行对比字符串长度,对maxlength赋值
Next

For i = LBound(sarr) To UBound(sarr)
If Len(reg.Replace(sarr(i), "")) < 8 Then '字符数小于8加入最大字符串/8,不足1向上进位1个制表符,等于或超过8个字符,制表符会向后再移动8个字符,显示会不对齐
    slength = Application.Ceiling(maxlength / 8, 1) '插入制表符个数计算
    rs = rs & reg.Replace(sarr(i), String(slength, Chr(9)) & "$1") & vbNewLine '连接文本
ElseIf Len(reg.Replace(sarr(i), "")) < maxlength Then '大于8小于最大长度字符串,计算与最大长度相差值/8,不足1向上进位1
    slength2 = Application.Ceiling((maxlength - Len(reg.Replace(sarr(i), ""))) / 8, 1) '插入制表符个数计算
    rs = rs & reg.Replace(sarr(i), String(slength2, Chr(9)) & "$1") & vbNewLine '连接文本
Else
    rs = rs & reg.Replace(sarr(i), Chr(9) & "$1") & vbNewLine '连接文本
End If
Next
ado.Close '关闭ado,直接写入会保存原来值
Kill f '删除原文件,不知道怎么在原文件改

ado.Open '重新打开ado
ado.WriteText rs '写入修改后文本
ado.SaveToFile f '保存文件到原路径
ado.Close
p = Dir '调用下一个
Wend
Set ado = Nothing '释放内存
Set reg = Nothing '释放内存
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-11-30 20:00 来自手机 | 显示全部楼层
简七 发表于 2020-11-30 09:56
Sub test()
Dim ado As Object
Dim reg As Object

感谢帮助,很好的实现了我的想法
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-25 20:32 , Processed in 0.036163 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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