Excel 列表解析表

问题描述 投票:0回答:2

我有一个 Excel 工作表,其中一列中有主键,另一列中有属性列表(管道分隔)。这是一个例子:

pk1     a | b | c
pk2
pk3     b | d
pk4     e

这持续了大约 38k 行。

我想根据这些数据创建一个交叉引用表,使其看起来更像这样:

pk1     a
pk1     b
pk1     c
pk3     b
pk3     d
pk4     e

有没有简单的方法可以实现这一点?

excel parsing excel-formula cross-reference vba
2个回答
0
投票

使用 VBA,该子程序以您提供的格式解析数据。根据列结构,可能需要进行一些更新。

Sub Parse()
    Dim thissheet As Worksheet
    Set thissheet = ActiveSheet

    Sheets.Add
    ActiveSheet.Range("A1").Value = "Header 1"
    ActiveSheet.Range("B1").Value = "Header 2"

    Dim pk As Long
    Dim carray() As String

    For x = 0 To thissheet.Range("A65535").End(xlUp).Row

    If InStr(1, thissheet.Range("B2").Offset(x, 0).Value, "|") > 0 Then
    'if cellvalue contains bar
    carray() = Split(thissheet.Range("B2").Offset(x, 0).Value, "|")
    For i = LBound(carray) To UBound(carray)
    ActiveSheet.Range("A2").Offset(pk, 0).Value = thissheet.Range("A2").Offset(x, 0).Value
    ActiveSheet.Range("B2").Offset(pk, 0).Value = Trim(carray(i))
    pk = pk + 1
    Next i
    Else
    'No Bar do this
    ActiveSheet.Range("A2").Offset(pk, 0).Value = thissheet.Range("A2").Offset(x, 0).Value
    ActiveSheet.Range("B2").Offset(pk, 0).Value = thissheet.Range("B2").Offset(x, 0).Value
    pk = pk + 1
    End If
    Next

    End Sub

0
投票

有EXCEL公式

=LET(filt,FILTER(A1:B4,B1:B4<>""),
ref,BYROW(filt,LAMBDA(a,TEXTJOIN("",TRUE,CHOOSECOLS(a,1)&
"|"&TEXTSPLIT(TEXTJOIN("",TRUE,
CHOOSECOLS(a,2)),{" ","|"},,TRUE)&"%"))),
TEXTSPLIT(TEXTJOIN("",TRUE,ref),"|","%",TRUE))

enter image description here

FILTER 函数消除 B 列中没有数据的行。
通过插入行 (%) 和列 (|) 分隔符为行生成 A&B 值。
这些不能在字符串中使用。
连接生成的值并将其分割到范围内。

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