Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 用VBA解析excel工作表_Arrays_Excel_Vba - Fatal编程技术网

Arrays 用VBA解析excel工作表

Arrays 用VBA解析excel工作表,arrays,excel,vba,Arrays,Excel,Vba,场景:在我的工作表中,我有以下格式的多列数据(这是一个ASCII生成的表格,便于可视化,符号不在原始电子表格中): Obs.:根据表格,数据可以有多个条目,其中每列显示不同的信息。差异可能是格式(大写/小写)或内容(是否有数据) 目标:我正在尝试从该表中检索信息,而不会丢失数据。例如:如果两行有相同的数据,但一行是小写,而另一行是大写,则可以检索任何一行(无首选项),但如果有不同的数据(可能项目名称或状态略有不同),我将尝试检索所有数据 到目前为止已完成:我可以简单地创建一个数组,循环它,并手动

场景:在我的工作表中,我有以下格式的多列数据(这是一个ASCII生成的表格,便于可视化,符号不在原始电子表格中):

Obs.:根据表格,数据可以有多个条目,其中每列显示不同的信息。差异可能是格式(大写/小写)或内容(是否有数据)

目标:我正在尝试从该表中检索信息,而不会丢失数据。例如:如果两行有相同的数据,但一行是小写,而另一行是大写,则可以检索任何一行(无首选项),但如果有不同的数据(可能项目名称或状态略有不同),我将尝试检索所有数据

到目前为止已完成:我可以简单地创建一个数组,循环它,并手动比较数据,但结果是次优的,因为它只是将数据聚合到同一单元格中不同的位置。仍然需要手动检查/清洁

Obs2.此表约有22000行

Obs3.此数据集的另一个问题是没有一列完全填满。有时我有所有标识符和项目名称的数据,有时缺少标识符,有时缺少名称,有时只有一个标识符可用(没有名称或任何其他)

问题:有办法做到这一点吗

想要的输出:

+-------+--------------+-------------+-------------+------------------------------+----------+-----------------------------+--------------------------+----------------+
| Count | Indentifier1 | Identifier2 | Identifier3 | ProductName                  | Location | Type                        | Status                   | RegistryDate   |
+-------+--------------+-------------+-------------+------------------------------+----------+-----------------------------+--------------------------+----------------+
| 1     | azjzjzj3611a |             |             | Super electric               | SEA      | General                     | Sold out -- Used --      | 4/17/2019 4:19 |
|       |              |             |             |   board - high load          |          |                             |   Good                   |                |
+-------+--------------+-------------+-------------+------------------------------+----------+-----------------------------+--------------------------+----------------+
| 2     | y000zj9y30   |             |             | electric board - low battery | SEA      | General                     | Sold out -- Used -- Good | 5/12/2015 3:48 |
+-------+--------------+-------------+-------------+------------------------------+----------+-----------------------------+--------------------------+----------------+
| 3     | a30y970y3    |             |             | Super jet-ski 01 Special     | SHORE    | TEST - Utility - Vehicle    | Used - Good              |                |
+-------+--------------+-------------+-------------+------------------------------+----------+-----------------------------+--------------------------+----------------+
| 4     | a3044aa69    | 1007750     |             | Ball 10-Type2                | BEACH    | TEST - Utility - Small-Item | Sold out -- Used - Good  | 6/10/2013 0:00 |
+-------+--------------+-------------+-------------+------------------------------+----------+-----------------------------+--------------------------+----------------+
| 5     | a3044aa69    | 1007750     | BLL101      | Ball 10-Type1                | BEACH    | TEST - Utility - Small Unit | Used - Good              |                |
+-------+--------------+-------------+-------------+------------------------------+----------+-----------------------------+--------------------------+----------------+
| 6     | y0003aa67    | 36021       | BLL051      | BALL 5-TYPE1                 | Ridge    | Group - Special             | Used - Good              |                |
+-------+--------------+-------------+-------------+------------------------------+----------+-----------------------------+--------------------------+----------------+
Sub cleanup_detail()

Dim raw_array As Variant
Dim w As Workbook
Dim loopvar1 As Long

Set w = ThisWorkbook

raw_array = w.Worksheets("Sheet1").UsedRange

For loopvar1 = 2 To UBound(raw_array, 1)
    If raw_array(loopvar1 + 1, 2) = "" Or raw_array(loopvar1 + 1, 2) = "0" Then
        If raw_array(loopvar1 + 1, 3) = "" Or raw_array(loopvar1 + 1, 3) = "0" Then
            If raw_array(loopvar1 + 1, 4) = "" Or raw_array(loopvar1 + 1, 4) = "0" Then
                If raw_array(loopvar1 + 1, 5) = "" Or raw_array(loopvar1 + 1, 5) = "0" Then
                    Next loopvar1
                ElseIf raw_array(loopvar1 + 1, 5) = raw_array(loopvar1, 5) Then
                    w.Worksheets("Sheet1").Cells(loopvar1 + 1, 2) = raw_array(loopvar1 + 1, 2) & "/" & raw_array(loopvar1, 2)
                    w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 3) & "/" & raw_array(loopvar1, 3)
                    w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 4) & "/" & raw_array(loopvar1, 4)
                    w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 5)
                    w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 6) & "/" & raw_array(loopvar1, 6)
                    w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 7) & "/" & raw_array(loopvar1, 7)
                    w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 8) & "/" & raw_array(loopvar1, 8)
                    w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 9) & "/" & raw_array(loopvar1, 9)
                End If
            ElseIf raw_array(loopvar1 + 1, 4) = raw_array(loopvar1, 4) Then
                w.Worksheets("Sheet1").Cells(loopvar1 + 1, 2) = raw_array(loopvar1 + 1, 2) & "/" & raw_array(loopvar1, 2)
                w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 3) & "/" & raw_array(loopvar1, 3)
                w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 4)
                w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 5) & "/" & raw_array(loopvar1, 5)
                w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 6) & "/" & raw_array(loopvar1, 6)
                w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 7) & "/" & raw_array(loopvar1, 7)
                w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 8) & "/" & raw_array(loopvar1, 8)
                w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 9) & "/" & raw_array(loopvar1, 9)
            End If
        ElseIf raw_array(loopvar1 + 1, 3) = raw_array(loopvar1, 3) Then
            w.Worksheets("Sheet1").Cells(loopvar1 + 1, 2) = raw_array(loopvar1 + 1, 2) & "/" & raw_array(loopvar1, 2)
            w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 3) & "/" & raw_array(loopvar1, 3)
            w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 4) & "/" & raw_array(loopvar1, 4)
            w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 5) & "/" & raw_array(loopvar1, 5)
            w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 6) & "/" & raw_array(loopvar1, 6)
            w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 7) & "/" & raw_array(loopvar1, 7)
            w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 8) & "/" & raw_array(loopvar1, 8)
            w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 9) & "/" & raw_array(loopvar1, 9)
        End If
    ElseIf raw_array(loopvar1 + 1, 2) = raw_array(loopvar1, 2) Then
        w.Worksheets("Sheet1").Cells(loopvar1 + 1, 2) = raw_array(loopvar1 + 1, 2)
        w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 3) & "/" & raw_array(loopvar1, 3)
        w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 4) & "/" & raw_array(loopvar1, 4)
        w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 5) & "/" & raw_array(loopvar1, 5)
        w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 6) & "/" & raw_array(loopvar1, 6)
        w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 7) & "/" & raw_array(loopvar1, 7)
        w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 8) & "/" & raw_array(loopvar1, 8)
        w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 9) & "/" & raw_array(loopvar1, 9)
    End If
Next loopvar1

End Sub
阵列方法代码:

+-------+--------------+-------------+-------------+------------------------------+----------+-----------------------------+--------------------------+----------------+
| Count | Indentifier1 | Identifier2 | Identifier3 | ProductName                  | Location | Type                        | Status                   | RegistryDate   |
+-------+--------------+-------------+-------------+------------------------------+----------+-----------------------------+--------------------------+----------------+
| 1     | azjzjzj3611a |             |             | Super electric               | SEA      | General                     | Sold out -- Used --      | 4/17/2019 4:19 |
|       |              |             |             |   board - high load          |          |                             |   Good                   |                |
+-------+--------------+-------------+-------------+------------------------------+----------+-----------------------------+--------------------------+----------------+
| 2     | y000zj9y30   |             |             | electric board - low battery | SEA      | General                     | Sold out -- Used -- Good | 5/12/2015 3:48 |
+-------+--------------+-------------+-------------+------------------------------+----------+-----------------------------+--------------------------+----------------+
| 3     | a30y970y3    |             |             | Super jet-ski 01 Special     | SHORE    | TEST - Utility - Vehicle    | Used - Good              |                |
+-------+--------------+-------------+-------------+------------------------------+----------+-----------------------------+--------------------------+----------------+
| 4     | a3044aa69    | 1007750     |             | Ball 10-Type2                | BEACH    | TEST - Utility - Small-Item | Sold out -- Used - Good  | 6/10/2013 0:00 |
+-------+--------------+-------------+-------------+------------------------------+----------+-----------------------------+--------------------------+----------------+
| 5     | a3044aa69    | 1007750     | BLL101      | Ball 10-Type1                | BEACH    | TEST - Utility - Small Unit | Used - Good              |                |
+-------+--------------+-------------+-------------+------------------------------+----------+-----------------------------+--------------------------+----------------+
| 6     | y0003aa67    | 36021       | BLL051      | BALL 5-TYPE1                 | Ridge    | Group - Special             | Used - Good              |                |
+-------+--------------+-------------+-------------+------------------------------+----------+-----------------------------+--------------------------+----------------+
Sub cleanup_detail()

Dim raw_array As Variant
Dim w As Workbook
Dim loopvar1 As Long

Set w = ThisWorkbook

raw_array = w.Worksheets("Sheet1").UsedRange

For loopvar1 = 2 To UBound(raw_array, 1)
    If raw_array(loopvar1 + 1, 2) = "" Or raw_array(loopvar1 + 1, 2) = "0" Then
        If raw_array(loopvar1 + 1, 3) = "" Or raw_array(loopvar1 + 1, 3) = "0" Then
            If raw_array(loopvar1 + 1, 4) = "" Or raw_array(loopvar1 + 1, 4) = "0" Then
                If raw_array(loopvar1 + 1, 5) = "" Or raw_array(loopvar1 + 1, 5) = "0" Then
                    Next loopvar1
                ElseIf raw_array(loopvar1 + 1, 5) = raw_array(loopvar1, 5) Then
                    w.Worksheets("Sheet1").Cells(loopvar1 + 1, 2) = raw_array(loopvar1 + 1, 2) & "/" & raw_array(loopvar1, 2)
                    w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 3) & "/" & raw_array(loopvar1, 3)
                    w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 4) & "/" & raw_array(loopvar1, 4)
                    w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 5)
                    w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 6) & "/" & raw_array(loopvar1, 6)
                    w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 7) & "/" & raw_array(loopvar1, 7)
                    w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 8) & "/" & raw_array(loopvar1, 8)
                    w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 9) & "/" & raw_array(loopvar1, 9)
                End If
            ElseIf raw_array(loopvar1 + 1, 4) = raw_array(loopvar1, 4) Then
                w.Worksheets("Sheet1").Cells(loopvar1 + 1, 2) = raw_array(loopvar1 + 1, 2) & "/" & raw_array(loopvar1, 2)
                w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 3) & "/" & raw_array(loopvar1, 3)
                w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 4)
                w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 5) & "/" & raw_array(loopvar1, 5)
                w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 6) & "/" & raw_array(loopvar1, 6)
                w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 7) & "/" & raw_array(loopvar1, 7)
                w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 8) & "/" & raw_array(loopvar1, 8)
                w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 9) & "/" & raw_array(loopvar1, 9)
            End If
        ElseIf raw_array(loopvar1 + 1, 3) = raw_array(loopvar1, 3) Then
            w.Worksheets("Sheet1").Cells(loopvar1 + 1, 2) = raw_array(loopvar1 + 1, 2) & "/" & raw_array(loopvar1, 2)
            w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 3) & "/" & raw_array(loopvar1, 3)
            w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 4) & "/" & raw_array(loopvar1, 4)
            w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 5) & "/" & raw_array(loopvar1, 5)
            w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 6) & "/" & raw_array(loopvar1, 6)
            w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 7) & "/" & raw_array(loopvar1, 7)
            w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 8) & "/" & raw_array(loopvar1, 8)
            w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 9) & "/" & raw_array(loopvar1, 9)
        End If
    ElseIf raw_array(loopvar1 + 1, 2) = raw_array(loopvar1, 2) Then
        w.Worksheets("Sheet1").Cells(loopvar1 + 1, 2) = raw_array(loopvar1 + 1, 2)
        w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 3) & "/" & raw_array(loopvar1, 3)
        w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 4) & "/" & raw_array(loopvar1, 4)
        w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 5) & "/" & raw_array(loopvar1, 5)
        w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 6) & "/" & raw_array(loopvar1, 6)
        w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 7) & "/" & raw_array(loopvar1, 7)
        w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 8) & "/" & raw_array(loopvar1, 8)
        w.Worksheets("Sheet1").Cells(loopvar1 + 1, 3) = raw_array(loopvar1 + 1, 9) & "/" & raw_array(loopvar1, 9)
    End If
Next loopvar1

End Sub

因此,如果数据相同,则希望将多行合并到一行中;如果数据发生更改,则可以将数据的总和插入到一行或多行中。标识符可能是,也可能不是。我想这些数据是经过排序的,因此如果在
Identifier1
excel中找不到标识符,则会假定标识符与该列上最后填充的单元格相同。@Damian是的,它基本上是将每个项目的数据合并到一行中,并包含所有可用信息(如您所说,如果数据在两行中不同,请将其聚合到一个单元格中)。我可以按任何列对数据进行排序,但事实上,每列都缺少一些项,这让我对如何循环数组感到困惑。我的意思是,例如,表上的第13行没有标识符,我是(或宏)假设它属于前一个标识符?@Damian在这种情况下,名称将是最后一次检查。它将比较行的名称,并查看是否存在。对于没有标识符/名称的情况,则宏将完全跳过行。我将使用类来处理此问题,使用与标识符和产品的关系名称,以检查每一行的4种可能性中的任何一种,一旦您知道产品是什么,然后检查其属性是否匹配。如果不匹配,则插入另一行。