我面临着根据细胞价值重新排列大量数据的问题。示例:目前我有一个excel文件,如下图所示。
当前的Excel文件
阿吉思先生|客户ID:119982928 |地点:印度孟买|职业:商人|出生日期:1989年7月12日|类型:常规| Acc No:不知道|联系电话。否:不可用
Sumon先生|客户ID:119934534 |职业:商人|类型:常规| Acc No:不知道|手机:1234567819
阿拉法特先生|客户ID:119886140 |手机:678868 |资格:理学硕士|配偶:不可用
阿肖克先生客户ID:119837746 |出生日期:1989年7月12日| Last Trans:2018年2月16日
凡人。清洁|客户Eid:Ga 9789352 |地址:达卡Khairpara |电话:13344243 |孩子:死了。苏比尔
我试着像下面这样制作这个文件。但是,多次失败。我试图提取文本,但因为有一个巨大的数据。我很困惑怎么做。
我需要这个文件
目前,我在移动每个单元格后手动执行此操作:(是否有任何Vba代码或公式根据其值重新排列所有数据?
此子过程适用于两个变体数组。
Option Explicit
Sub Macro3()
Dim i As Long, j As Long, nr As Long
Dim tmp As Variant, arr As Variant, hdr As Variant, vals As Variant
With Worksheets("sheet4")
tmp = .Cells(1, "A").CurrentRegion
ReDim vals(LBound(tmp, 1) To UBound(tmp, 1), LBound(tmp, 2) To UBound(tmp, 2))
nr = UBound(tmp, 1) + 2
For i = LBound(tmp, 1) To UBound(tmp, 1)
vals(i, 1) = tmp(i, 1)
For j = LBound(tmp, 2) + 1 To UBound(tmp, 2)
If CBool(InStr(1, tmp(i, j), Chr(58), vbBinaryCompare)) Then
arr = Split(tmp(i, j), Chr(58))
arr(0) = Trim(arr(0)): arr(1) = Trim(arr(1))
hdr = Application.Match(arr(0), .Rows(nr), 0)
If IsError(hdr) Then
hdr = .Cells(nr, .Columns.Count).End(xlToLeft).Offset(0, 1).Column
.Cells(nr, hdr) = arr(0)
If UBound(vals, 2) < hdr Then
ReDim Preserve vals(LBound(tmp, 1) To UBound(tmp, 1), LBound(tmp, 2) To hdr)
End If
End If
vals(i, hdr) = arr(1)
End If
Next j
Next i
.Cells(nr + 1, "A").Resize(UBound(vals, 1), UBound(vals, 2)) = vals
End With
End Sub
您可以在每个单元格中尝试此公式:
= IFERROR(INDEX(A1:AZ1,1,MATCH(“客户ID”,INDEX(左(A1:AZ1,11),0),0)),“”)
注意:11表示字符串中的字符总数
正如我所说的,在这种情况下,你的数据的分隔符看起来总是“:”,所以知道这一点,只是与Mid,Len和Find有点玩。
我的公式在字符串中查找“:”的位置,然后在“:”之后提取所有文本
我的公式(英文)是这样的:
=IFERROR(TRIM(MID(B1;FIND(":";B1)+1;LEN(B1)-FIND(":";B1)));"")
我手动翻译,但它应该有点工作。如果没有,这个公式的VBA版本是这样的(如果不知道VBA,忘掉它):
ActiveCell.FormulaR1C1 = "=IFERROR(TRIM(MID(R[-6]C,FIND("":"",R[-6]C)+1,LEN(R[-6]C)-FIND("":"",R[-6]C))),"""")"
无论如何,你的数据有点令人困惑,至少是这个输出,因为它混合了不同列中的数据。例如,Ashok先生的出生日期应出现在列E(列B)的列中(B列)