一道数据拆分难题,函数半天搞不定,VBA却一分钟解决问题!

送人玫瑰,手有余香,请将文章分享给更多朋友

动手操作是熟练掌握EXCEL的最快捷途径!

群里有一位群友提出了这样一个问题。感谢群友小白提供了这道题目的代码

怎样将上面截图中左面单元格中的数据拆分成为右面的格式。

初步一看,好像可以使用SUBSTITUTE函数来拆分。但是仔细想想,虽然可以按标点符号来拆分,但对于价格部分没有特别好的办法拆出来。

如果说,就是一次性的工作,那直接就分列配合剪切板来解决问题;如果是重复性的工作,就需要编写一段VBA代码,或者利用POWER QUERY来解决了。

今天着重向大家介绍的是如何利用VBA和公式来解决这个问题。

01

使用公式并不能完全解决这个问题。

在单元格D5中输入公式“=TRIM(MID(SUBSTITUTE(SUBSTITUTE(TRIM(MID(SUBSTITUTE($A$1,CHAR(10),REPT(" ",99)),ROW(B1)*99-98,99)),":",","),",",REPT(" ",99)),COLUMN(B1)*99-98,99))”,并向下向右拖曳即可。

思路:

这个公式看起来比较长,其实是非常简单大。由于公式没有最终完成,这里就不在详细解释公式了。简单说,就是连续两次使用了TRIM+MID+SUBSTITUTE函数组合。

02

通过VBA代码我们则可以完美地解决这个问题。

完成的代码如下:

Sub test()

Dim reg As Object

Dim arr(), alist

Dim i, j, m, k, n, ar

Set reg = CreateObject("vbscript.regexp")

Range("B1:ZZ65535").ClearContents

arr() = Range("A1:A" & Range("A65535").End(xlUp).Row + 1).Value

With reg

.Pattern = "(\d+月\d+日){0,}:?([\u4e00-\u9fa5]*)(\d+元),?"

.Global = True

On Error Resume Next

For i = 1 To UBound(arr)

alist = Split(arr(i, 1), Chr(10))

For Each ar In alist

Set mnt = reg.Execute(ar)

If mnt.Count <> 0 Then

j = j + 1

n = 2

For k = 0 To mnt.Count - 1

For m = 0 To mnt(k).SubMatches.Count - 1

If m = 0 Then

If k = 0 Then Cells(j, n).Value = mnt(k).SubMatches(m)

Else

n = n + 1

Cells(j, n).Value = mnt(k).SubMatches(m)

End If

Next m

Next k

End If

Next

Next i

End With

End Sub

好了朋友们,今天和大家分享的内容就是这些了!喜欢我的文章请分享、转发、点赞和收藏吧!如有任何问题可以随时私信我哦!

-END-

长按下方二维码关注EXCEL应用之家

面对EXCEL操作问题时不再迷茫无助

我就知道你“在看”

推荐阅读
(0)

相关推荐