Возьмите ненулевые значения и смежные данные с одного листа и создайте новую таблицу на другом листе — цикл VBA

#excel #vba

#excel #vba

Вопрос:

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

Мой экран решателя выглядит как этот снимок экрана решателя. Идеальным результатом отчета будет эта таблица.Обратите внимание, что в январе только две загрузки (TLS) в качестве выходных данных решателя (ЕСЛИ (E4: N4= True, включить TL, n / a). Итак, новый отчет должен пропустить TLs # 3,4,5 (G4: I4) и заполнить таблицу следующим допустимым выводом (столбец J). Я всегда буду хотеть связать количество единиц (E: N) с названием продукта (D) в новом отчете.

Я супер начинающий пользователь VBA. Вот как далеко я продвинулся в своем VBA для достижения этой цели:

 Sub TL_Report()
Dim c As Range
For Each c In ActiveSheet.Range("e5:e30")
If c.Value <> 0 Then
Worksheets("TL_Report").Range("C" amp; Rows.Count).End(xlUp).Offset(1, 0).Resize(1, 2).Value = Range(c.Offset(0, -1), c).Value
End If
Next c
End Sub
  

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

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

1. Ваш отчет содержит 10 строк для каждого грузового месяца. Вам нужен список десяти лучших для каждого грузового месяца? Вам нужен полный список? Находится ли каждый грузовик-месяц на одинаковом расстоянии от одной строки до другой?

2. Какова цель ячейки «Доставка» в каждом месяце доставки в отчете?

3. В вашем отчете 3-я глава помечена как грузовик 3 февраля (я полагаю), но она относится к грузовику 1 февраля. Предполагается, что 3 указывает номер грузовика или ссылается на номер главы отчета?

4. Привет @EvilBlueMonkey, спасибо за большую помощь. 1. В моем отчете должна быть строка до 20 уникальных продуктов в каждом грузовике. 2. Месяц «Доставки» в отчете будет отражать, в каком месяце этот TL был найден в решателе (строка 4 в решателе) 3. Это относится к главе # в отчете. TL # в решателе используется только на этой вкладке. Последовательность грузовиков # s в отчете всегда должна быть непрерывной серией. т. Е. Первый доставленный грузовик # 1, будь то в январе, феврале, марте. Кстати, вкладка отчета называется «TL_Report», а решатель находится на «TL_Solver»

Ответ №1:

В соответствии с доступными данными я создал эту подпрограмму:

 Sub SubReport()
    
    'Declarations.
    Dim WksSource As Worksheet
    Dim WksReport As Worksheet
    Dim WksWorksheet01 As Worksheet
    Dim RngMonths As Range
    Dim RngTrucks As Range
    Dim RngProductList As Range
    Dim RngValues As Range
    Dim RngTarget As Range
    Dim RngRange01 As Range
    Dim DblCounter01 As Integer
    Dim DblCounter02 As Integer
    
    'Setting WksSource.
    Set WksSource = Sheets("TL_Solver")
    
    'Referring to WksSource.
    With WksSource
        
        'Setting RngMonths.
        Set RngRange01 = .Range("E2")
        DblCounter01 = Excel.WorksheetFunction.Min(RngRange01.End(xlToRight).Column, _
                                                   .Cells(RngRange01.Row, .Columns.Count).End(xlToLeft).Column _
                                                  )
        Set RngMonths = .Range( _
                               RngRange01, _
                               .Cells(RngRange01.Row, DblCounter01) _
                              )
        
        'Setting RngTrucks.
        Set RngRange01 = .Range("E3")
        DblCounter01 = Excel.WorksheetFunction.Min(RngRange01.End(xlToRight).Column, _
                                                   .Cells(RngRange01.Row, .Columns.Count).End(xlToLeft).Column _
                                                  )
        Set RngTrucks = .Range( _
                               RngRange01, _
                               .Cells(RngRange01.Row, DblCounter01) _
                              )
        
        'Setting RngProductList.
        Set RngRange01 = RngTrucks.Resize(1, 1).Offset(2, -1)
        DblCounter01 = Excel.WorksheetFunction.Min(RngRange01.End(xlDown).Row, _
                                                   .Cells(.Rows.Count, RngRange01.Column).End(xlUp).Row _
                                                  )
        Set RngProductList = .Range( _
                             RngRange01, _
                             .Cells(DblCounter01, RngRange01.Column) _
                            )
        
        'Setting RngValues.
        Set RngRange01 = .Cells(RngProductList.Row, RngTrucks.Column)
        Set RngValues = RngRange01.Resize(RngProductList.Rows.Count, RngTrucks.Columns.Count)
        
    End With
    
    'Creating a new worksheet for the report.
    Set WksReport = ActiveWorkbook.Sheets.Add(After:=WksSource)
    
    'Counting other existing reports if any.
    DblCounter01 = 0
    For Each WksWorksheet01 In WksReport.Parent.Worksheets()
        If Left(WksWorksheet01.Name, 7) = "Report " Then
            DblCounter01 = DblCounter01   1
        End If
    Next
    
    'Renaming the current report.
    DblCounter02 = DblCounter01
    On Error Resume Next
    Do Until WksReport.Name = "Report " amp; DblCounter01
        DblCounter01 = DblCounter01   1
        WksReport.Name = "Report " amp; DblCounter01
        If DblCounter01 - DblCounter02 > 1000 Then GoTo CP_FAILED_RENAMING
    Loop
CP_FAILED_RENAMING:
    On Error GoTo 0
    
    'Setting RngTarget.
    Set RngTarget = WksReport.Range("A1")
    
    'Covering each column in RngValues.
    For DblCounter01 = 1 To RngValues.Columns.Count
        
        'Checking if there is any value to report.
        If Excel.WorksheetFunction.Sum(RngValues.Columns(DblCounter01).Cells) <> 0 Then
        
            'Inserting the data for the first row of the report's chapter.
            With RngTarget
                .Offset(0, 1).Value = "Truck #"
                .Offset(0, 2).Value = Split(RngTrucks.Cells(1, DblCounter01), "#")(1)
                .Offset(0, 3).Value = "Delivery"
                If WksSource.Cells(RngMonths.Row, RngTrucks.Columns(DblCounter01).Column).Value = "" Then
                    .Offset(0, 4).Value = WksSource.Cells(RngMonths.Row, RngTrucks.Columns(DblCounter01).Column).End(xlToLeft).Value
                Else
                    .Offset(0, 4).Value = WksSource.Cells(RngMonths.Row, RngTrucks.Columns(DblCounter01).Column).Value
                End If
                .Offset(1, 1).Value = "Product"
                .Offset(1, 2).Value = "Quantity"
            End With
            
            'Offsetting RngTarget by 2 rows in order to enter the data.
            Set RngTarget = RngTarget.Offset(2, 0)
            
            'Covering each value in the given column of RngValues.
            DblCounter02 = 1
            For Each RngRange01 In RngValues.Columns(DblCounter01).Cells
                'Checking if the value is not 0.
                If RngRange01.Value <> 0 Then
                    'Inserting the data.
                    With RngTarget
                        .Value = DblCounter02
                        .Offset(0, 1).Value = WksSource.Cells(RngRange01.Row, RngProductList.Column).Value
                        .Offset(0, 2).Value = RngRange01.Value
                    End With
                    DblCounter02 = DblCounter02   1
                    'Offsetting RngTarget to the next row of the report.
                    Set RngTarget = RngTarget.Offset(1, 0)
                End If
            Next
            
            'Offsetting RngTarget by 1 row for the next chapter.
            Set RngTarget = RngTarget.Offset(1, 0)
            
        End If
    Next
    
    'Autofitting the second column of the report.
    RngTarget.Offset(0, 1).EntireColumn.AutoFit
    
End Sub
  

Он динамически определяет размер обрабатываемых данных (начиная с заданных ячеек), создает новый лист с именем «Отчет n» (на основе n ранее существовавших листов, уже названных «Отчет n«) и вставляет данные по запросу.

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

1. Этот подраздел работает. Необходимо решить только незначительные проблемы с форматированием, и они существуют из-за моего плохого определения проблемы. Очень классный саб, я действительно ценю это!

2. Так это нормально? Вам нужна дополнительная помощь?

3. Да, это было чрезвычайно полезно!!