Разбор листа Excel с VBA - PullRequest
       1

Разбор листа Excel с VBA

0 голосов
/ 17 января 2020

Сценарий: В моем рабочем листе у меня есть данные в нескольких столбцах в следующем формате (это сгенерированная ASCII-таблица для облегчения визуализации, символы не указаны в исходной электронной таблице):

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

Obs.: Согласно таблице, данные могут иметь несколько записей, где в каждом столбце отображается различная информация. Различия могут быть либо в формате (верхний / нижний регистр), либо в содержании (содержит данные или нет).

Цель: Я пытаюсь получить информацию из этой таблицы, не теряя данные. Пример: если две строки имеют одинаковые данные, но одна строчная, тогда как вторая строчная, другая может быть получена (без предпочтений), но если есть разные данные (возможно, есть небольшая разница в имени или статусе элемента ), Я пытаюсь получить все данные.

Готово: Мне удалось создать массив, l oop и сравнить данные вручную, но результат является неоптимальным, поскольку он просто объединяет данные в одной ячейке, где они различаются. Что еще потребует ручной проверки / очистки.

Obs2.: В этой таблице около 22 тысяч строк.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...