Это моя ежедневная задача, где я должен взять необработанные данные, как показано на рисунке 1, и мне нужно отсортировать данные. Обычно образец данных, который мне нужно пройти, составляет около 2000 позиций.

Я хотел бы максимально упростить это, поэтому я хочу разбить свой процесс на этапы.

  1. Я сортирую данные по столбцу E ("Имя CE"),
  2. Я условно форматирую и для дубликатов в столбце A (серийный номер продукта) и столбце E ("Название CE"),
  3. Я ищу значения, не равные "L101" в столбце G ("Код причины") (я выделяю их для визуальных целей),
  4. (Трудный шаг) Если значения столбца E ("Имя CE") совпадают, а значения столбца G ("Код причины") не равны "L101", я разделяю эти значения.

    Примечание: это сделает два примера наборов данных

    Образец данных 1: будет любой набор или одна строка, которая содержит значение "L101" в столбце G ("Код причины").

    Образец данных 2: будет любой набор или одна строка, которая не содержит значения "L101" в столбце G ("Код причины").

    Пример:1 строки 4 и 5 изображения 1, «C-375204» имеет 2 значения столбца G ("Код причины"), не равных L101. Это станет "Образцом данных 2".

    Пример:2 строки 8 и 9 изображения 1, «C-375306» имеет значения столбца G ("Код причины") "L101" и "L208". Поскольку присутствует значение "L101", оно станет "Образцом данных". 1" .

    Пример:3 строки 12 и 13 изображения 1, «C-376157» имеет 2 значения столбца G ("Код причины") "L101". Это станет "Образцом данных 1".

  5. Как только все данные отсортированы, я объединяю значения в столбце B ("Symp") на основе значений столбца E ("CE Name"), разделенных запятыми («,»).

    ЕХ: Строка 4 и 5 Изображение 1, "С-375204" будет Колонка B ("Symp") появляется как "LM01, LM01" как изображение в изображении 3 строки 24.

  6. Удалите лишние данные, чтобы закончить его конечный продукт, изображенный на рисунке 3

Необработанные данные (изображение 1) Изображение 1: необработанные данные

Пары (изображение 2) Изображение 2: Пары

Окончательные данные (изображение 3) Изображение 3: Окончательные данные

2 ответа2

0

Я ценю помощь всех, я неустанно работал над этим и многому научился, поэтому я хотел поделиться кодом, который я написал для этого. Я включил несколько ссылок, прокомментированных в коде, который я использовал. Кроме того, если у вас есть какие-либо дополнительные предложения, я хотел бы услышать их.

Этот Кодекс будет:

Создайте словарь идентифицированных пользователем причин, по которым нужно искать значения, и создайте словарь значений причин с соответствующим CE-именем.

Он объединит Symp, который имеет совпадающее имя CE, и идентифицирует объединенную ячейку, выделив ее, пока «Значения причины, определенные пользователем» отсутствуют в Словаре причин соответствия CE

Он идентифицирует дополнительные (ненужные строки) как N/A

Это удалит любую строку с N/A

Затем данные будут отсортированы по идентифицированным (цветным) строкам.

Private Sub Auto_Combine() 'Step 5 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
'******************************************************************************
'WIP Auto Combine cells based on Symp value

'******************************************************************************
'Variables

Dim PrevRefCell As String 'Refers to the Complaint Number Column A
Dim CurrRefCell As String 'Refers to the Complaint Number Column A
Dim PrevCombCell As Range
Dim CurrCombCell As Range
Dim PrevSympCell As String
Dim CurrSympCell As String
Dim PrevCausCell As Range
Dim CurrCausCell As Range

Dim FirstFour As String
Dim PrevFirstFour As String

Dim sh As Worksheet
Dim rn As Range
Dim k As Long
Dim CurRRow As Long
Dim PrevRow As Long
Dim i As Long

Dim Flag As Boolean



    Dim CauseDict As Object
    Set CauseDict = CreateObject("Scripting.Dictionary")
    CauseDict.Add "L101", "L101"
    CauseDict.Add "X101", "X101"
    CauseDict.Add "L304", "L304"

    Dim CauseDictItem As Variant


    Dim CurCauseDict As Object
    Set CurCauseDict = CreateObject("Scripting.Dictionary")

    Dim j As Variant
    Dim l As Variant

    Dim RefDict As Object
    Set RefDict = CreateObject("Scripting.Dictionary")




'******************************************************************************
'Counts Number Of active rows in ActiveSheet and set to variable "k"
'https://stackoverflow.com/questions/25056372/vba-range-row-count

Set sh = ThisWorkbook.ActiveSheet
'Set rn = sh.UsedRange
Set rn = Range("A1", sh.Range("A1").End(xlDown).End(xlDown).End(xlUp))
k = rn.Rows.Count + rn.Row - 1

'******************************************************************************
'Use this to incrememnt actual address
'Sets Values of ref cells to cell contents

'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'For Loop A Begin
For CurRRow = 1 To k ' set row value currently at max row "k"

'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'Insert Instructions Set below

    PrevRow = CurRRow - 1
'Assign increment cell locations to variables
    CurrRefCell = ActiveSheet.Range("A" & CurRRow).Value
    CurrSympCell = ActiveSheet.Range("P" & CurRRow).Value


    On Error GoTo ErrHandler:

    PrevRefCell = ActiveSheet.Range("A" & PrevRow).Value
    PrevSympCell = ActiveSheet.Range("P" & PrevRow).Value

                                        'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                        'Nested Loop A.1 Begin
                                        'Compare Values and does set of instruction based on those values. in this case
                                        '"PrevRefCell" and "CurrRefCell"

                                        If InStr(CurrRefCell, PrevRefCell) > 0 Then ' If A.1
                                        'https://www.techonthenet.com/excel/formulas/instr.php
                                        'https://www.techonthenet.com/excel/formulas/if_then.php
                                        ' combine Symptom code combos to combo cell in column "O"

                                            Set CurrCombCell = ActiveSheet.Range("O" & CurRRow)
                                            Set PrevCombCell = ActiveSheet.Range("O" & PrevRow)

                                            CurrCombCell.Value = CurrSympCell & "," & PrevCombCell.Value

                                            Set CurrCausCell = ActiveSheet.Range("R" & CurRRow)
                                            Set PrevCausCell = ActiveSheet.Range("R" & PrevRow)

                                        ' After Combo is made N/A previous combo cell
                                            PrevCombCell.Value = "N/A"

                                            FirstFour = Left(CurrCausCell, 4)
                                            PrevFirstFour = Left(PrevCausCell, 4)

                                            If Not CurCauseDict.Exists(PrevFirstFour) Then
                                            CurCauseDict.Add PrevFirstFour, PrevFirstFour
                                            End If

                                            If Not CurCauseDict.Exists(FirstFour) Then
                                            CurCauseDict.Add FirstFour, FirstFour
                                            End If



                                                                                        ' Look for non "L101" cause codes can highlight CurrCombCell Yellow based on values
                                                                                        i = i - 1
                                                                                        'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                                                                        'Nested Loop A.1.1 If Begin

                                                                                            For Each l In CurCauseDict.Keys
                                                                                                If CauseDict.Exists(l) Then
                                                                                                Flag = True
                                                                                                End If
                                                                                            Next
                                                                                                    If Flag = True Then
                                                                                                    '__________________
                                                                                                        Else
                                                                                                        CurrCombCell.Select
                                                                                                        With Selection.Interior
                                                                                                        .Pattern = xlSolid
                                                                                                        .PatternColorIndex = xlAutomatic
                                                                                                        .Color = 65535
                                                                                                        End With
                                                                                                    End If
ColorSKIP: '-----------------------------------------------------------------------------
                                                                                'Nested Loop A.1.1 If End
                                                                                'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                        'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                        'Nested Loop A.1 Else Begin
                                        ' if only single line item assign current symp to current comb location
                                        Else 'A.1 Else Begin

                                            CurCauseDict.RemoveAll

                                            i = 0
                                            Set CurrCombCell = ActiveSheet.Range("O" & CurRRow)
                                            CurrCombCell.Value = CurrSympCell
                                            Set CurrCausCell = ActiveSheet.Range("R" & CurRRow)

                                            FirstFour = Left(CurrCausCell, 4)

                                            If Not CurCauseDict.Exists(FirstFour) Then
                                            CurCauseDict.Add FirstFour, FirstFour
                                            On Error Resume Next
                                            End If

                                                                                'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                                                                'Nested Loop A.1.2 If Begin
                                                                                    For Each j In CurCauseDict.Keys
                                                                                        If Not CauseDict.Exists(j) Then ' if current "beginning" dict key is in "ending" dict
                                                                                            CurrCombCell.Select
                                                                                            With Selection.Interior
                                                                                            .Pattern = xlSolid
                                                                                            .PatternColorIndex = xlAutomatic
                                                                                            .Color = 65535
                                                                                            End With

                                                                                            CurCauseDict.RemoveAll
                                                                                            Flag = False
                                                                                        End If
                                                                                     Next
                                                                                  'Nested Loop A.1.2 If End
                                                                                'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                        End If 'A.1 Else End
                                        'Nested Loop A.1 Else End
                                        'Nested Loop A.1 If End
                                        'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ErrHandler:
Next CurRRow
'For Loop A End
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


End Sub

Sub AA2_NA_Data_Sort() 'Step 6 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
'******************************************************************************
'Variables

Dim PrevRefCell As String
Dim CurrRefCell As String

Dim sh As Worksheet
Dim rn As Range
Dim k As Long
Dim CurRRow As Long
Dim PrevRow As Long


Range("A1").Select

'******************************************************************************
'Counts Number Of active rows in ActiveSheet and set to variable "k"
'https://stackoverflow.com/questions/25056372/vba-range-row-count

Set sh = ThisWorkbook.ActiveSheet
'Set rn = sh.UsedRange
Set rn = Range("A1", sh.Range("A1").End(xlDown).End(xlDown).End(xlUp))
k = rn.Rows.Count + rn.Row - 1

'******************************************************************************
'Use this to incrememnt actual address
'Sets Values of ref cells to cell contents

'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'For Loop A Begin
    For CurRRow = 1 To k ' set row value currently at max row "k"

'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'Insert Instructions Set below

    PrevRow = CurRRow - 1

    CurrRefCell = ActiveSheet.Range("O" & CurRRow).Value

    On Error GoTo ErrHandler:
    PrevRefCell = ActiveSheet.Range("O" & PrevRow).Value

'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'Nested Loop A.1 Begin
'Compare Values and does set of instruction based on those values. in this case
'"PrevRefCell" and "CurrRefCell"

    If InStr(CurrRefCell, "N/A") > 0 Then
    'https://www.techonthenet.com/excel/formulas/instr.php
    'https://www.techonthenet.com/excel/formulas/if_then.php
    ActiveSheet.Range("A" & CurRRow).Activate
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.ClearContents

    End If

'    Else

'Nested Loop A.1 Else End
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

'For Loop End
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ErrHandler:
    Next CurRRow


End Sub

Sub AA3_Color_Sort() 'Step 7 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

    '******************************************************************************
'Sort by CE Name
    ActiveSheet.AutoFilter.Sort.SortFields.Clear
    ActiveSheet.AutoFilter.Sort.SortFields.Add key:=Range _
        ("A:A"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveSheet.AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

'******************************************************************************
'Sort By Color no fill on top

'    Range("A1:U120").Select
    ActiveSheet.AutoFilter.Sort.SortFields.Clear
    ActiveSheet.AutoFilter.Sort.SortFields.Add key:=Range _
        ("O:O"), SortOn:=xlSortOnCellColor, Order:=xlAscending, DataOption:= _
        xlSortNormal

    With ActiveSheet.AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply

    End With
 End Sub
0

У меня не было достаточно времени, чтобы отполировать его, и есть несколько ярлыков, но это должно что-то делать в соответствии с тем, что вы просите.

Этот код ожидает, что ваша таблица будет в верхнем левом углу листа, в котором вы запускаете макрос. Он создаст два новых листа и поместит туда данные.

Sub Sort()

Dim name As String, i As Integer, nameRange As Range, savedRange As Range, firstRange As Range, obj As Variant
'Set "E" to whatever Column contains the "CE Name"
Set nameRange = ActiveSheet.Range(Range("E2"), Range("E65000").End(xlUp))
Set savedRange = Nothing

'Make new sheets for sorted data
If Evaluate("ISREF('" & "Data 1" & "'!A1)") = False Then
    Sheets.Add(After:=ActiveSheet).name = "Data 1"
    Sheets.Add(After:=ActiveSheet).name = "Data 2"
End If

For Each obj In nameRange
    'Make Group
    If savedRange Is Nothing Then
            Set savedRange = Range(obj.Address)
            Set firstRange = Range(obj.Address)
    Else
            Set savedRange = Range(savedRange.Address, obj.Address)
    End If

    'Print Group
    If Not obj.Offset(1).Value = obj.Value Then
        If Not savedRange.Offset(0, 2).Find("L101 - Cycler", LookIn:=xlValues) Is Nothing Then
            'Data range 1
            Rows(firstRange.Row).Copy
            Sheets("Data 1").Range("A1").Insert
            Sheets("Data 1").Range("B1").Value = ConcatenateRow(savedRange.Offset(0, -3), ",")
        Else
            'Data Range 2
            Rows(firstRange.Row).Copy
            Sheets("Data 2").Range("A1").Insert
            Sheets("Data 2").Range("B1").Value = ConcatenateRow(savedRange.Offset(0, -3), ",")
        End If
        'reset group
        Set savedRange = Nothing
    End If

Next obj


End Sub

Function ConcatenateRow(rowRange As Range, joinString As String) As String
    Dim x As Variant, temp As String

    temp = ""
    For Each x In rowRange
        temp = temp & x & joinString
    Next

    ConcatenateRow = Left(temp, Len(temp) - Len(joinString))
End Function

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .