ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的测验 > Excel VBA > 可还原的合并居中(VBA题目)

可还原的合并居中(VBA题目)

作者:绿色风 分类: 时间:2022-08-18 浏览:210
楼主
罗刚君
对多单元格合并后保留所有数据,重启后还可以还原合并前的状态(不能使用辅助区)
可以设定分隔符

 


具体看动画

 
2楼
biaotiger1
比如A1=中国、B1=人民、C1=解放军,无分隔符
那么还要求可分开吗 ?
3楼
罗刚君
是的
4楼
amulee
不知道对不对,似乎有些繁琐了。
  1. Sub MyMerge()
  2.     Dim Rng As Range
  3.     Dim i&, arrYS, arrTemp, strJG$, strTemp, strTemp2$
  4.     Dim MyType%, strFG$   '类型和分隔符
  5.     Dim k&, blnStart As Boolean
  6.     Do While MyType <> 1 And MyType <> 2
  7.         MyType = Application.InputBox("1:合并单元格" & vbCrLf & "2:取消合并", "选择类型", 1, , , , , 1)
  8.     Loop
  9.     Do
  10.         strFG = Application.InputBox("请输入分隔符", "分隔符", "-", , , , , 2)
  11.         If InStr(1, strFG, Chr(9), vbTextCompare) = 0 And InStr(1, strFG, Chr(28), vbTextCompare) = 0 _
  12.             And InStr(1, strFG, Chr(10), vbTextCompare) = 0 Then
  13.             Exit Do
  14.         End If
  15.         MsgBox "输入了非法字符,请重新输入。"
  16.     Loop
  17.     '若没有输入,则列之间加入一个看不见摸不着的Chr(9)作为分隔符
  18.     strFG = IIf(Len(strFG) = 0, Chr(9), strFG)
  19.    
  20.     If MyType = 1 Then  '合并
  21.         '遍历所有选择的区域
  22.         For Each Rng In Selection.Areas
  23.             '定义一个数组记录
  24.             arrYS = Rng
  25.             ReDim arrTemp(1 To UBound(arrYS, 1))
  26.             '开头那个
  27.             For i = 1 To UBound(arrTemp)
  28.                 strJG = ""
  29.                 '标志位blnStart表示是否找到了有数据的单元格
  30.                 blnStart = False
  31.                 For j = 1 To UBound(arrYS, 2)
  32.                     If Len(arrYS(i, j)) > 0 Then
  33.                         If blnStart Then
  34.                             '若已经找到,则表示不是第一个有数据的单元格,前面假山分隔符
  35.                             strJG = strJG & strFG & arrYS(i, j)
  36.                         Else
  37.                             '若标志位为否,则表示是第一个有数据的单元格,前面不需要分隔符
  38.                             strJG = strJG & arrYS(i, j)
  39.                             blnStart = True
  40.                         End If
  41.                     Else
  42.                         '加入一个看不见的Chr(28)作为空单元格的分隔符
  43.                         strJG = strJG & Chr(28)
  44.                     End If
  45.                 Next j
  46.                 arrTemp(i) = strJG
  47.             Next i
  48.             '行之间加入一个换行符
  49.             strJG = Join(arrTemp, Chr(10))
  50.             Application.DisplayAlerts = False
  51.             '合并单元格并设定格式
  52.             With Rng
  53.                 .Merge
  54.                 .HorizontalAlignment = xlCenter
  55.                 .VerticalAlignment = xlCenter
  56.                 .Item(1) = strJG
  57.             End With
  58.             Application.DisplayAlerts = True
  59.         Next
  60.     Else    '拆分
  61.         '遍历所有选择的区域
  62.         For Each Rng In Selection.Areas
  63.             '拆分单元格
  64.             strJG = Rng(1)
  65.             Rng.UnMerge
  66.             '先按行拆
  67.             arrTemp = Split(strJG, Chr(10))
  68.             '遍历数组中每一个元素,即每一行,并填写
  69.             j = 1
  70.             k = Rng.Columns.Count
  71.             For Each strTemp In arrTemp
  72.                 '替换所有Chr(28)
  73.                 strTemp = Replace(strTemp, Chr(28), strFG, 1, -1, vbTextCompare)
  74.                 Rng.Cells(j, 1).Resize(1, k) = Split(strTemp, strFG)
  75.                 j = j + 1
  76.             Next
  77.         Next
  78.     End If
  79. End Sub
5楼
罗刚君
功力深厚!
不过还有一个BUG,你稍加修改即可

当分隔符与单元格中的字符一致时.....
6楼
wqfzqgk
可以用注册表或配置文件能完成吧,也就是把恢复记录做好吧
7楼
罗刚君

尽量不改注册表

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap