将2D矩阵分解为Value; Heading格式

时间:2018-08-20 10:33:40

标签: excel excel-vba

我目前正在处理一个很大的(超过100MB)工作表,其格式如下:

a;b;c;d;
1;2;3;4;
5;6;7;8;
9;;10;11;
;;12;;

即这是一个二维列,列的长度不均匀。

我正尝试将这种怪异形式重写为以下格式,以将每个值与其各自的第一行值进行协调:

1;a
5;a
9;a
2;b
6;b
3;c
7;c
10;c
12;c ...

到目前为止,我的主要对手是必须识别每个单个值的坐标的挑战。由于我发现的任何查找解决方案始终都需要知道行或列,因此我假设只有脚本才能解决此问题。但是,当我处理脚本时,可能有比依赖过多搜索的表更简单的解决方案来重写此表。

可能使用VBA解决此问题的最佳方法是什么?感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

即使您没有发布任何代码,我也可以帮助您,因为我曾经遇到过完全相同的问题。

下一个代码将在第EF列上写入您要求的矩阵:

Sub StackOverflow()
    Dim counter As Long: counter = 1
    Dim x As Long: Dim y As Integer
    With ThisWorkbook.Sheets("Stack")
        For y = 1 To 4
            For x = 1 To .Columns(y).Find("*", SearchOrder:=xlByRows, LookIn:=xlValues, SearchDirection:=xlPrevious).Row
                If .Cells(x, y).Value <> "" Then
                    .Cells(counter, 5).FormulaR1C1 = .Cells(x, y).Value
                    .Cells(counter, 6).FormulaR1C1 = ColumnAddress(y)
                    counter = counter + 1
                End If
            Next x
        Next y
    End With
End Sub
Function ColumnAddress(y As Integer) As String
    Select Case y
        Case 1: ColumnAddress = "a"
        Case 2: ColumnAddress = "b"
        Case 3: ColumnAddress = "c"
        Case 4: ColumnAddress = "d"
    End Select
End Function

可以根据您的情况随意调整代码地址(即工作表名称,宏名称和单元格地址)。