我面临着基于单元格值重新排列大量数据的问题。 示例:目前我有一个excel文件,如下图所示。
当前的Excel文件
先生。 Ajith |客户ID:119982928 |地点:印度孟买| 职业:商人|出生日期:1989年7月12日|类型:常规| Acc No:不知道|联系电话。否:不可用
先生。 Sumon |客户ID:119934534 |职业:商人|类型: 常规| Acc No:不知道|手机:1234567819
先生。阿拉法特|客户ID:119886140 |手机:678868 |任职资格: M. Sc |配偶:不是Avaialbel
先生。 Ashok |客户ID:119837746 |出生日期:1989年7月12日|持续 Trans:2018年2月16日
先生。 Nirmol |客户ID:119789352 |地址:达卡Khayerpara | 电话:13344234 |孩子:Subeer先生
我试着像下面这样制作这个文件。但是,多次失败。我试图提取文本,但因为有一个巨大的数据。我很困惑怎么做。
我需要这个文件
目前,我在移动每个细胞后手动完成:( 是否有任何Vba代码或公式根据其值重新排列所有数据?
答案 0 :(得分:1)
此子程序适用于两个变体数组。
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
答案 1 :(得分:0)
您可以在每个单元格中尝试此公式:
= IFERROR(INDEX(A1:AZ1,1,MATCH(&#34;客户ID&#34;,INDEX(左(A1:AZ1,11),0),0)),&#34;&# 34)
注意:11表示字符串中的字符总数
答案 2 :(得分:0)
正如我所说的,在这种情况下看起来你的数据的分隔符始终是&#34;:#34;所以知道这一点,只是与Mid,Len和Find一起玩。
我的公式寻找&#34;的位置:&#34;在字符串中,然后在&#34;之后提取所有文本:&#34;
我的公式(英文)是这样的:
=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先生的出生日期出现在位置栏(B栏),当它应该是E栏时
答案 3 :(得分:0)
我建议为每个可能的类别添加一列。然后将整个表输出到单个列中,其值以|分隔正如在Stackoverflow上所做的那样。请使用|,结束该单元格。
现在我们使用mid,len和find的组合来提取数据。我使用的公式取决于冒号后的空格和最后的|,如上所述。
= IFERROR(MID($ A2,FIND(B $ 1和;&#34;:&#34;,$ A2)+ 2 + LEN(B $ 1), - 2-LEN(B $ 1)+ FIND( &#34; |&#34;,$ A2,FIND(B $ 1和;&#34;:&#34;,$ A2)) - FIND(B $ 1和;&#34;:&#34 ;, $ A2)),&#34;&#34)
干杯!