ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助]如何“智能填充空格”

[复制链接]

TA的精华主题

TA的得分主题

发表于 2006-6-17 01:48 | 显示全部楼层 |阅读模式
小弟想把一个Word表格里的内容贴在论坛,表格内容不太多,且只是作为浏览用,没有下载这些内容进行编辑操作的必要,用Word附件过于麻烦,请问,如何在Word里进行“智能填充空格”,把每一列的内容相应对齐,基本上保持表格的外观?   把表格内容粘贴到记事本里,也需要这方法。   相关问题:“格式→制表位”里的“前导符”能否转换为“纯文本”。   详细说明请看附件。谢谢大家! fHLRJLFD.rar (6.02 KB, 下载次数: 29)

TA的精华主题

TA的得分主题

发表于 2006-6-17 08:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
不用VBA的方案(假定只有2列)——笨: 先将西文字体设为中文 ①选中第一列,选择性粘贴为无格式文本 查找^p,替换为 ^p(空格根据需要) ②选中第二列,选择性粘贴为无格式文本 用Alt+鼠标选择对应矩形区域,复制 ③将②的矩形粘贴到①的后面对应位置。 ④查找^t,替换为空;查找^w^p,替换为^p
[此贴子已经被作者于2006-6-17 8:48:10编辑过]

TA的精华主题

TA的得分主题

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

何兄,想了也做了一上午。本以为快摆平了。没想到,

这个被空格愚了一下。发现半角空格所占用的位置不好判断。

例如,同是25个长度,就是对不齐。就是一个半角空格与大写的字母占用多少不是一样的,也不是1/2。

下同给出我的不完美的解决方案。

注意最后一个宏,就是测试选中区域的长度的。 没想到,一个小东西,居然想了上午,用了60多行代码。

Sub 表格()
Dim atable As Table
Dim acolumn As Long, arow As Long, i As Long, i1 As Long
Dim arr
Dim a As String, b As String
Dim arange As Range, astring As String
If Selection.Information(wdWithInTable) = True And Selection.Type = wdSelectionIP Then
'判断是否在表格中
Set atable = Selection.Tables(1)
arow = atable.Rows.Count - 1
acolumn = atable.Columns.Count - 1 '数组的位数
Set arange = atable.Range
astring = Replace(arange, Chr(13), "") '把类似于回车的替换掉
astring = Replace(astring, Chr(7) & Chr(7), Chr(7)) '把连续的两个chr(7)替换掉
astring = Mid(astring, 1, Len(astring) - 1) '最后一个也有一个chr(7),把其去掉
arr = Split(astring, Chr(7))

For i1 = 0 To acolumn - 1 '最后一位不要循环,所以,减1
For i = i1 To UBound(arr) Step acolumn + 1
a = arr(i)
b = max(b, a) '取得最长的单元格
Next
'MsgBox b
'添加空格
Dim c As String
c = b & Space(4)
'MsgBox Len(c)
For i = i1 To UBound(arr) Step acolumn + 1
If arr(i) = b Then
arr(i) = c
Else
'MsgBox Len(arr(i))
arr(i) = arr(i) & Space(Len(c) - Len(arr(i)))
' MsgBox Len(arr(i))
End If
Next
b = ""
Next
'开始写出字符串。
astring = ""
For i = 1 To UBound(arr) + 1
If i Mod (acolumn + 1) = 0 Then
astring = astring + arr(i - 1) + Chr(13)
Else
astring = astring & arr(i - 1)
End If
Next

'在数组中摆平
Else
MsgBox "出错的情况可错是:" & Chr(13) & Chr(13) & _
" 1.不合要求!,只要把光标放在表格即可,不要选中表格" & Chr(13) _
& " 2.或者你的光标不在表格中", vbOKOnly, "出错了!"
Exit Sub
End If
atable.Delete
Selection.InsertAfter astring
End Sub
Function max(b, a)
If Len(b) > Len(a) Then
max = b
Else
max = a
End If
End Function
Sub 长度()
MsgBox Len(Selection.Text)
End Sub

[此贴子已经被作者于2006-6-17 10:38:55编辑过]

TA的精华主题

TA的得分主题

发表于 2006-6-17 11:03 | 显示全部楼层
半角空格所占用的位置不好判断。例如,同是25个长度,就是对不齐。就是一个半角空格与大写的字母占用多少不是一样的,也不是1/2 能否设为中文字体解决
[此贴子已经被作者于2006-6-17 11:04:13编辑过]

TA的精华主题

TA的得分主题

发表于 2006-6-17 12:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

谢谢瘦兄,

全部设为全角(相当于中文字体)就能对齐。

但是,这个太难看了,我想没有人能忍受。

经瘦兄帮助,改如下: 尚有一处不好。下次再改。 Sub 表格() Dim atable As Table Dim acolumn As Long, arow As Long, i As Long, i1 As Long Dim arr Dim a As String, b As String Dim arange As Range, astring As String If Selection.Information(wdWithInTable) = True And Selection.Type = wdSelectionIP Then '判断是否在表格中 Set atable = Selection.Tables(1) arow = atable.Rows.Count - 1 acolumn = atable.Columns.Count - 1 '数组的位数 Set arange = atable.Range astring = Replace(arange, Chr(13), "") '把类似于回车的替换掉 astring = Replace(astring, Chr(7) & Chr(7), Chr(7)) '把连续的两个chr(7)替换掉 astring = Mid(astring, 1, Len(astring) - 1) '最后一个也有一个chr(7),把其去掉 arr = Split(astring, Chr(7)) For i1 = 0 To acolumn - 1 '最后一位不要循环,所以,减1 For i = i1 To UBound(arr) Step acolumn + 1 a = arr(i) b = max(b, a) '取得最长的单元格 Next 'MsgBox b '添加空格 Dim c As String c = b & Space(4) 'MsgBox Len(c) For i = i1 To UBound(arr) Step acolumn + 1 If arr(i) = b Then arr(i) = c Else 'MsgBox Len(arr(i)) arr(i) = arr(i) & Space(Len(c) - Len(arr(i))) ' MsgBox Len(arr(i)) End If Next b = "" Next '开始写出字符串。 astring = "" For i = 1 To UBound(arr) + 1 If i Mod (acolumn + 1) = 0 Then astring = astring + arr(i - 1) + Chr(13) Else astring = astring & arr(i - 1) End If Next '在数组中摆平 Else MsgBox "出错的情况可错是:" & Chr(13) & Chr(13) & _ " 1.不合要求!,只要把光标放在表格即可,不要选中表格" & Chr(13) _ & " 2.或者你的光标不在表格中", vbOKOnly, "出错了!" Exit Sub End If atable.Delete Selection.InsertAfter astring Set arange = Selection.Range arange.Font.Name = "宋体" End Sub Function max(b, a) If Len(b) > Len(a) Then max = b Else max = a End If End Function
[此贴子已经被作者于2006-6-17 12:51:24编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-6-17 13:41 | 显示全部楼层

“小东西”不小

上午小弟这儿停电好一阵,这时才有电,这是小弟停电期间写好的,此时试用了一下孔兄5楼的编码,对于某个单元格内有几段内容的情况已经有了“改进”,即把单元格内不管几段内容全部合为一段了。不过,这样似乎还未解决得很好。请孔兄参考小弟提的④⑤两点。
以下是引用[I]yuyvtul[/I]在2006-6-17 8:42:26的发言:
不用VBA的方案(假定只有2列)——笨: 先将西文字体设为中文 ①选中第一列,选择性粘贴为无格式文本 查找^p,替换为 ^p(空格根据需要) ②选中第二列,选择性粘贴为无格式文本 用Alt+鼠标选择对应矩形区域,复制 ③将②的矩形粘贴到①的后面对应位置。 ④查找^t,替换为空;查找^w^p,替换为^p
  谢谢yuyvtul兄的方案,辛苦了!不失为别致的解决思路。   试用结果:   第一个步骤,“空格根据需要”,可能是小弟没有把问题阐释清楚——小弟要的是根据不同列的内容,填充数目不等的空格,以使长短不一的列内容对齐在一个列中。兄台使用的是数目相等的空格,在实际运用时,无法“基本保持表格的外观”。   第四个步骤,小弟按兄台前面三个步骤做下来,没有发现哪一个地方需要用到第四个步骤的,应用第四个步骤的两次替换都为“0”。大概是兄台设想的情况比较丰富,需要用到第四个步骤,详情能否告知?
以下是引用[I]konggs [/I]在2006-6-17 10:37:10的发言:
被空格愚了一下。发现半角空格所占用的位置不好判断。 例如,同是25个长度,就是对不齐。就是一个半角空格与大写的字母占用多少不是一样的,也不是1/2。 下同给出我的不完美的解决方案。 没想到,一个小东西,居然想了上午,用了60多行代码。
  谢谢孔兄!说实在的,小弟本以为小弟的问题难以得到解决的,是另一个“空想”,不想孔兄竟只花了小半天功夫就解决了,孔兄的“能量”非小弟可想象呢!   确实,难题是存在的,因为即使是用手工做,也是需要根据不同列的每一行的“目视行长”来相应增减空格的数目的,孔兄的编码达到了“基本保持表格的外观”的要求!但要真正比较完美的实现这个要求,还得在运行孔兄编码的基础上进行手工调整,毕竟,一些地方只能是“人力”为之,电脑无法“智能”到这地步。   试用情况报告:   ①表格的每一个单元格都有内容、内容都是中文、多列,运行孔兄的编码可以接近“智能填充空格”的要求,个别地方需要手工再调整。但如果表格较多列,多列叠加的效果会使本是同一列的内容呈斜线状或S状对齐,从版面上看,也就属于“错列”了。如果多行,则手工调整的量也比较可观。要在编码中考虑这一点,是否可以根据每列的首行单元格内容的分布来给同列内容“定位”?比如说Word表格中D列的内容处于第5-9厘米处,则转换成文本后,D列的每个单元格的内容都分布在第5-9厘米处。同理,原E列在9-16厘米处,转换后也分布在9-16厘米处。但考虑到列与列之间“最少要相隔4个半角空格”的要求,因此,在转化为文本后,应该考虑到相应增加厘米数,即按如下方式计算列分布位置的厘米数:原A列宽度+4个半角空格+原B列宽度+4个半角空格+……”。当然,因为字符宽度不一,无法绝对处于某一位置之内,小弟的设想只是避免原E列的每行内容会因为前边列的关系而跑到第5厘米、第7厘米、第9厘米等处,造成全局“S状”或其他不规则形状。   ②表格的每一个单元格都有内容、一些单元格是英文内容、多列,运行孔兄的编码,“错列”现象比较严重,手工调整的量较大。   ③对于有一些单元格是没有内容的、多列的表格,运行孔兄的编码,结果有时会类于“乱码”现象,即整个版面完全分辨不出哪些内容属于同一列。   ④假若一个或多个单格里的内容是有两段或三段的,同样会出现“乱码”版面——其实这个要求是小弟试用时想到的,真要达到这个要求,难度更大:即两三段的,把这一个单元格的内容显示在论坛里时,于相应列位置占据两三段的内容,第二段、第三段与之同一行的其他单元格内容全部用空格代替。   ⑤某一个单元格的内容超长,如何妥善解决多列内容的对齐问题?能否以“根据内容调整表格”后这个单元格分为几行而自动分为几段,再用④的方法对齐?   小弟以为,电脑大概也只能做到孔兄编码这个程度了,要“完美”解决小弟的问题,小弟真有些“不敢想”!呵呵,或许这是一个“不起眼、不实用”的“小东西”,可里头的复杂程度,小弟还是无法表述清楚,更不敢想要在编程时一一设计了!——或谓,编程的关键,在于“周全”考虑,即老大曾经说过的“容错性”。这里要向孔兄道歉,小弟的附件内容给得过于简单,以上的许多情况没有在附件中体现,致使孔兄又要“翻工”了!当然,孔兄可以不用再多想了,毕竟解决了小弟的大部分问题,已经省了许多手工调整的力气。   谢谢孔兄!呵呵,累着你了!从三楼、五楼的文字和编码中看得出孔兄的“体贴”,里头也已经设想了许多小弟没有想到的情况了。      再次谢谢yuyvtul兄四楼的费心!小弟致礼!希望能得到你的继续指教!
[此贴子已经被作者于2006-6-17 15:54:33编辑过]

TA的精华主题

TA的得分主题

发表于 2006-6-17 15:05 | 显示全部楼层

呵呵,又给何兄搞复杂了。

真是[em06],有时间我尽力。

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-6-17 15:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

“残害”孔兄处请见谅

呵呵,小弟是善于“得寸进尺”的,想想都觉得对不住孔兄——每一次都这样,也只有孔兄有这耐性了!   其一,小弟要改进的是发帖前尽量把问题阐述清楚。   其二,小弟要学着具备“编程思维”,以免在试用孔兄的编码后才提出“额外要求”。   其三,最重要的,当然,就是小弟要好好学习编程了,不然,哪怕再小的问题都要再三麻烦孔兄,真是惭愧!

TA的精华主题

TA的得分主题

发表于 2006-6-17 17:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

没时间看两位的代码和附件,所有不便发表意见。

早上本来想让何兄参考一下这个链接的,还来得及吗?

http://club.excelhome.net/viewthread.php?tid=92099&replyID=&skin=0

TA的精华主题

TA的得分主题

发表于 2006-6-17 17:41 | 显示全部楼层

何兄不必自责,

收到老大的链接.学习ing.

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

本版积分规则

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

GMT+8, 2024-11-16 16:51 , Processed in 0.039838 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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