Редактирование кода для добавления столбцов и изменения имен заголовков

#excel #vba #multiple-columns

#excel #vba #несколько столбцов

Вопрос:

Я «унаследовал» этот код от предыдущего коллеги в моей компании, и мне нужно его пересмотреть. Я не на том уровне программирования, чтобы понимать некоторые строки.

Код прямо сейчас работает. Он сравнивает два листа с одинаковыми заголовками и идентичной информацией о столбцах A / B / C. Все остальные ячейки имеют # s и могут изменяться.

1. Лист 1 / Начало по сравнению с листом 2 / Текущий
2. перечисляет значение каждого столбца с каждого листа рядом с каждым другим и
3. вычисляет% отклонения.
таким образом, каждый блок в таблице результатов имеет 3 столбца на идентичный столбец.

введите описание изображения здесь

Однако в предыдущем коде использовалась таблица результатов с предварительно названными заголовками, и только после столбца 12 он будет использовать все заголовки, которые названы в исходных листах. Прямо сейчас столбцы представляют собой простые именованные столбцы 1,2,3 и т.д.

Я пытаюсь внести в это два дополнения:

  1. добавьте вычисление столбца, в котором вычисляется разница значений (текущее происхождение). Столбец будет называться отклонением #. Я уже добавил условие ElseIf в код, но оно не вычисляется, и дополнительный столбец отображается только в конце таблицы, но не для каждого блока.

введите описание изображения здесь
2. и я хотел бы, чтобы в таблице результатов использовались те же заголовки, начиная с столбца Идентификатор полосы движения, регион происхождения и т. Д. Из исходных листов, Как это происходит сейчас, начиная со столбца 12. (пример ниже; начиная со случайного 1)

это код:

 Sub Changes()
Dim x, y, z, Hdrs, i As Long, ii As Long, iii As Long
x = Original.UsedRange
y = Current.UsedRange
ReDim z(1 To UBound(x, 1) - 1, 1 To UBound(x, 2) * 3 - 6)
ReDim Hdrs(1 To UBound(z, 2) - 11)
x(1, 2) = "Origin Region": x(1, 3) = "Origin Country"

For i = 2 To UBound(x, 1)
    For ii = 1 To 3
        z(i - 1, ii) = x(i, ii)
    Next
Next
For i = 2 To UBound(x, 1)
    iii = 1
    For ii = 4 To UBound(x, 2)
        iii = iii   3
        z(i - 1, iii) = x(i, ii): z(i - 1, iii   1) = y(i, ii)
        If x(i, ii) = 0 Or IsEmpty(x(i, ii)) Then
            z(i - 1, iii   2) = "New Entry"
         ElseIf x(i, ii) <> 0 Then
            z(i - 1, iii   2) = Format(y(i, ii) / x(i, ii) - 1, "0%")
         ElseIf x(i, ii) <> 0 Then
            z(i - 1, iii   3) = Format(y(i, ii) - x(i, ii) - 1, "0")
        End If
    Next
Next
ii = -2
For i = 7 To UBound(x, 2)
    ii = ii   3
    Hdrs(ii) = x(1, i) amp; " Original"
    Hdrs(ii   1) = x(1, i) amp; " Current"
    Hdrs(ii   2) = x(1, i) amp; " Deviation %"
    Hdrs(ii   3) = x(1, i) amp; " Deviation #"
Next
Application.ScreenUpdating = 0
With Result.ListObjects(1)
    On Error Resume Next
    .DataBodyRange.Delete
    On Error GoTo 0
    .Parent.Columns(13).Resize(, 50).Delete
    For i = .ListColumns.Count To 13 Step -1
        .ListColumns(i).Delete
    Next
    .Parent.[a3].Resize(UBound(z, 1), UBound(z, 2)) = z
    .Parent.[m2].Resize(, UBound(Hdrs)) = Hdrs
    
    'You will probably have to adjust the ColumnWidth value in the next line
    'to suit your actual extra headers
    .Parent.[m2].Resize(, UBound(Hdrs)).ColumnWidth = 10

End With
 

Конец подраздела

введите описание изображения здесь

Пример исходного листа: введите описание изображения здесь

Комментарии:

1. решение в случае заинтересованных сторон

Ответ №1:

 Sub Changes()
Dim x, y, z, Hdrs, i As Long, ii As Long, iii As Long
x = Original.UsedRange
y = Current.UsedRange
ReDim z(1 To UBound(x, 1) - 1, 1 To UBound(x, 2) * 4 - 9)
ReDim Hdrs(1 To UBound(z, 2))

For i = 2 To UBound(x, 1)
    For ii = 1 To 3
        z(i - 1, ii) = x(i, ii)
    Next
Next
For i = 2 To UBound(x, 1)
    iii = 0
    For ii = 4 To UBound(x, 2)
        iii = iii   4
        z(i - 1, iii) = x(i, ii): z(i - 1, iii   1) = y(i, ii)
        If x(i, ii) = 0 Or IsEmpty(x(i, ii)) Then
            z(i - 1, iii   2) = "New Entry"
            If iii = UBound(z, 2) - 3 Then Exit For
         Else
            z(i - 1, iii   2) = Format(z(i - 1, iii   1) - z(i - 1, iii), "0.00")
            z(i - 1, iii   3) = Format(z(i - 1, iii   1) / z(i - 1, iii) - 1, "0%")
        End If
    Next
Next
For i = 1 To 3
    Hdrs(i) = x(1, i)
Next
ii = 0
For i = 4 To UBound(x, 2)
    ii = ii   4
    Hdrs(ii) = x(1, i) amp; " Original"
    Hdrs(ii   1) = x(1, i) amp; " Current"
    Hdrs(ii   2) = x(1, i) amp; " Deviation #"
    Hdrs(ii   3) = x(1, i) amp; " Deviation %"
Next
Application.ScreenUpdating = 0
With DataChanges
    With .ListObjects(1)
        On Error Resume Next
        .DataBodyRange.Offset(1).Delete
        On Error GoTo 0
        .Parent.Columns(4).Resize(, 100).Delete
        .Resize .HeaderRowRange.Columns(1).Resize(UBound(z, 1)   1, UBound(z, 2))
        .DataBodyRange = z
        .HeaderRowRange = Hdrs
        For i = 4 To UBound(Hdrs) - 3 Step 8
            .HeaderRowRange.Columns(i).Resize(, 4).Interior.Color = RGB(84, 130, 53)
        Next
        With .DataBodyRange
            For i = 4 To UBound(Hdrs) - 3 Step 8
                For ii = 1 To .Rows.Count Step 2
                    .Columns(i).Rows(ii).Resize(, 4).Interior.Color = RGB(169, 208, 142)
                Next
                For ii = 2 To .Rows.Count - 1 Step 2
                    .Columns(i).Rows(ii).Resize(, 4).Interior.Color = RGB(198, 224, 180)
                Next
            Next
        End With
    End With
    .Columns(4).Resize(, UBound(Hdrs)   1).ColumnWidth = 12
End With
    
 

Конец подраздела