Я новый пользователь. Я нашел форум очень полезным, и у меня есть вопрос, на который я не могу найти ответ, выполнив поиск в Интернете. Я уверен, что это легко, но я все еще учусь на ходу!
Я создаю программу VBA для автоматического создания финансовой модели для моего клиента. Первым шагом является получение данных из различных таблиц Excel и очистка / форматирование их в одну таблицу. Обычно команда просто делает это вручную, но я хотел бы предоставить им инструмент, позволяющий легко перезапустить планирование после завершения нашего проекта.
Один из входных данных не очень структурирован, и мне нужнодобавьте несколько новых столбцов для классификации данных для последующего анализа.
Вот образец №. строк того, о чем я говорю
rows columnA columnB columnC
row1 SALES
row2 SegmentA BRAND1 100
row3 SegmentA BRAND2 200
row4 SEGMENTA SUB TOTAL
row4 SegmentB BRAND6 200
row5 SegmentC BRAND7 300
row6 TOTALSALES
row7
row8 GROSSPROFIT
row9 SegmentA BRAND1 100
row10 SegmentA BRAND2 200
row11 SegmentB BRAND6 200
row12 SegmentC BRAND7 300
row13 TOTALGROSSPROFIT
Благодаря stackoverflow я уже нашел код для запуска цикла for по строкам и создания итоговой таблицы по сегментам.
Однако, посколькукатегории показателей, например продажи и выручка, находятся не в столбцах, а на самом деле в строках. Мои итоги являются итогами по всем показателям.
Мне кажется, что мне нужно как-то написать цикл, который проверяет ячейку:в строке между строками, например, для SALES и TOTALSALES или GROSSPROFIT и TOTALGROSSPROFIT, а затем обновите, например, SALES или GROSSPROFIT. Затем я могу объединить ключевую фигуру и сегмент, например, SALES-SEGMENTA и GROSSPROFIT-SEGMENTA, и получить правильные итоги.
Обновление: Через несколько дней после публикации у меня появилась идея, которая, похоже, работает, но все еще заинтересованазнать, есть ли лучший способ. В моей идее я использовал FIND для поиска в первом столбце названий, таких как Sales и Gross Profit, затем я получил адрес ячейки для начальной и конечной точек диапазона, который имеет отношение к продажам, затем я использовал cell.offset для обновленияэту информацию в новый столбец, как показано ниже.
Set SalesRangeStart = Range("A:A").Find("Sales", LookIn:=xlValues)
Set SalesRangeFinish = Range("A:A").Find("Sales Total", LookIn:=xlValues)
Range(SalesRangeStart.Address, SalesRangeFinish.Address).Offset(0, 11).Value = "Sales"
Я включил приведенный ниже код для цикла for, который я сейчас использую для суммирования данных. В реальном примере первый столбец «BusinessType2», который я назвал, включает в себя такие строки, как SEGMENT, REVENUE, пустые поля и т. Д. На основе BusinessType2. Я пытаюсь сложить 4 различных столбца чисел, представляющих прогноз на 2019, 2020, 2021 и 2022 гг.
Я понятия не имею, как определить, какие строки соответствуют продажам, валовой прибыли и т. Д., Поскольку они смешаны с данными строк. Но у меня есть цикл, который суммирует работающие сегменты.
Dim lr As Long
Dim j As Long
Dim BusinessType2 As String
Dim Y2019 As Long
Dim Y2020 As Long
Dim Y2021 As Long
Dim Y2022 As Long
Dim writeRow As Long
lr = 3000
'Set titles for new columns for the output
Range("T1").Value = "BusinessType2"
Range("U1").Value = "Y2019"
Range("V1").Value = "Y2020"
Range("W1").Value = "Y2021"
Range("X1").Value = "Y2020"
' Set initial values for loop - this is the first row of data
BusinessType2 = Range("G11").Value
Y2019 = Range("K11").Value
Y2020 = Range("L11").Value
Y2021 = Range("M11").Value
Y2022 = Range("N11").Value
' Starting from the 2nd row of data sum by BusinessType2
For j = 12 To lr + 1
If Range("G" & j).Value = BusinessType2 Then
Y2019 = Y2019 + Range("K" & j).Value
Y2020 = Y2020 + Range("L" & j).Value
Y2021 = Y2021 + Range("M" & j).Value
Y2022 = Y2022 + Range("N" & j).Value
' The data has a lot of blank rows so we skip them
ElseIf Range("G" & j).Value = "" Then
GoTo NextIteration
' After totalling for 1 instance of BusinessType2 write the output
Else
writeRow = Range("T" & Rows.Count).End(xlUp).Row + 1
Range("T" & writeRow).Value = BusinessType2
Range("U" & writeRow).Value = Y2019
Range("V" & writeRow).Value = Y2020
Range("W" & writeRow).Value = Y2021
Range("X" & writeRow).Value = Y2022
BusinessType2 = Range("G" & j).Value
Y2019 = Range("K" & j).Value
Y2020 = Range("L" & j).Value
Y2021 = Range("M" & j).Value
Y2022 = Range("N" & j).Value
End If
NextIteration:
Next j
End Sub
Цикл тока работает для суммирования сегментов, но итоги охватывают различные показатели, такие как доход, валовая прибыль, накладные расходы, EBIT и т. Д., ИМне нужно, чтобы они составляли отдельно.