Реструктуризация массивного документа Excel - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть задача реструктурировать таблицу Excel с двумя столбцами и расширить ее.Вот изображение, которое показывает, что нужно сделать, данные слева от зеленого столбца - это исходные данные, а данные справа - как они должны выглядеть, но это сделано только для первой записи, мне нужно скопироватьэто для всех 10000 строк данных.

Here

Чтобы объяснить более подробно, каждый CRD необходимо расширить до 160 строк и перейти с 1978-> 2018, перечисляя кварталы для каждого года.Каков наилучший подход?Можно ли написать макрос для решения этой проблемы?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Следующее ожидает, что Sheet1 и Sheet2 будут именами.И идет на 158 кварталов.

Option Explicit

Sub doFromThru()

    ' clear contents
    Sheets("Sheet2").Select
    Cells.Select
    Selection.ClearContents
    Range("A1").Select
    Cells(1, "A") = "CRD"
    Cells(1, "B") = "Year"
    Cells(1, "C") = "Quarter"
    Cells(1, "D") = "QuarterNumerical"
    Cells(1, "E") = "Disclosure"
    Dim nOutRow As Integer
    nOutRow = 1

    ' step thru all the rows on the input sheet
    Dim nInRow As Long, maxInRow As Long, nInCRD As String, nInDisc As String
    maxInRow = Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row
    For nInRow = 2 To maxInRow
        nInCRD = Sheets("Sheet1").Cells(nInRow, "A")
        nInDisc = Sheets("Sheet1").Cells(nInRow, "L")

        ' create the new rows on Sheet2
        Dim dFrom As String, nQtr As Integer
        dFrom = DateValue("Oct 1978")  ' starting from here
        For nQtr = 1 To 158
            nOutRow = nOutRow + 1

            Sheets("Sheet2").Cells(nOutRow, "A") = nInCRD
            Sheets("Sheet2").Cells(nOutRow, "B") = Format$(dFrom, "yyyy")
            Sheets("Sheet2").Cells(nOutRow, "C") = Format$(dFrom, "Q")
            Sheets("Sheet2").Cells(nOutRow, "D") = nQtr
            Sheets("Sheet2").Cells(nOutRow, "E") = nInDisc

            dFrom = DateAdd("Q", 1, dFrom)
        Next nQtr

    Next nInRow

End Sub

Добавьте немного диагностики, чтобы рассказать вам больше.После nOutRow = nOutRow + 1

            Sheets("Sheet2").Cells(1, "G") = nInRow
            Sheets("Sheet2").Cells(1, "H") = nOutRow
            Sheets("Sheet2").Cells(1, "I") = nQtr
            Sheets("Sheet2").Cells(1, "J") = nInDisc
0 голосов
/ 27 ноября 2018

Не проверено.

  • Код предполагает, что вы хотите начать с четвертого квартала 1978 года, и будет циклически повторяться 159 кварталов после четвертого квартала 1978 года.(При необходимости вы можете изменить это, изменив значение TOTAL_QUARTERS и START_QUARTER в коде)

  • Вам нужно будет изменить "Sheet1" в коде на любое значениеимя вашего листа:

  • Код пытается перезаписать содержимое столбцов CH до CL на указанном листе.Поэтому вы можете сохранить копию своей рабочей книги перед запуском.

Код:

Option Explicit

Sub ExpandRows()

Const START_YEAR as long = 1978
Const START_QUARTER as long = 4
Const TOTAL_QUARTERS as long = 160

With thisworkbook.worksheets("Sheet1")

Dim lastRow as long
lastRow = .cells(.rows.count, "A").row

Dim inputCRD() as variant
inputCRD = .range("A2:A" & lastRow).value2

Dim inputDisclosure() as variant
inputDisclosure = .range("L2:L" & lastRow).value2

Dim yearOffset as long
Dim quarterIndex as long
Dim numericalQuarterIndex as long

Dim totalRowCount as long
totalRowCount = (lastRow - 1) * TOTAL_QUARTERS ' -1 to skip first row

Dim outputArray() as variant
Redim outputArray(1 to totalRowCount, 1 to 5)

Dim readIndex as long
Dim writeIndex as long

For readIndex = lbound(inputCRD,1) to ubound (inputCRD,1)

quarterIndex = START_QUARTER

For numericalQuarterIndex = 1 to TOTAL_QUARTERS

writeIndex = writeIndex + 1

outputArray(writeIndex, 1) = inputCRD(readIndex, 1)
outputArray(writeIndex, 2) = START_YEAR + yearOffset
outputArray(writeIndex, 3) = quarterIndex
outputArray(writeIndex, 4) = numericalQuarterIndex
outputArray(writeIndex, 5) = inputDisclosure(readIndex, 1)

If quarterIndex < 4 then
quarterIndex = quarterIndex + 1
Else
yearOffset = yearOffset + 1
quarterIndex = 1
End if

Next numericalQuarterIndex

Next readIndex

.range("CH2").resize(ubound(outputArray,1), ubound(outputArray,2)).value2 = outputArray

End with

End sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...