根据值重新排列Excel单元格

时间:2018-03-06 17:44:02

标签: excel vba excel-vba

我面临着基于单元格值重新排列大量数据的问题。 示例:目前我有一个excel文件,如下图所示。

当前的Excel文件 Current Excel file

  

先生。 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代码或公式根据其值重新排列所有数据?

4 个答案:

答案 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

enter image description here

答案 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;

检查下面的示例(我的Excel是西班牙语,请注意) enter image description here

我的公式(英文)是这样的:

=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)

干杯!

enter image description here

相关问题