根据值重新排列Excel单元格[关闭]

问题描述 投票:-5回答:4

我面临着根据细胞价值重新排列大量数据的问题。示例:目前我有一个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代码或公式根据其值重新排列所有数据?

excel vba excel-vba
4个回答
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


0
投票

您可以在每个单元格中尝试此公式:

= IFERROR(INDEX(A1:AZ1,1,MATCH(“客户ID”,INDEX(左(A1:AZ1,11),0),0)),“”)

注意:11表示字符串中的字符总数


0
投票

正如我所说的,在这种情况下,你的数据的分隔符看起来总是“:”,所以知道这一点,只是与Mid,Len和Find有点玩。

我的公式在字符串中查找“:”的位置,然后在“:”之后提取所有文本

检查下面的示例(我的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先生的出生日期应出现在列E(列B)的列中(B列)


0
投票

我建议为每个可能的类别创建一列。然后将整个表输出到单个列中,其值以|分隔正如在Stackoverflow上所做的那样。请用|,也结束那个单元格。

现在我们使用mid,len和find的组合来提取数据。如上所述,我使用的公式取决于冒号后的空格和最终的空间。

= IFERROR(MID($ A2,FIND(1 B $& “:”,$ A2)+ 2 + LEN(B $ 1), - 2-LEN(B $ 1)+ FIND( “|”,$ A2,FIND(B $ 1 “:”,$ A2)) - FIND(B $ 1 “:”,$ A2)), “”)

干杯!

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.