Всем привет. Прошу вашей помощи, уважаемые форумчане, т.к сам пока не могу справиться. Начал изучать массивы и работу с ними и возник вопрос, возможно ли повернуть массив так, как обозначено на вкладке result_example. Результат2 - это был бы идеальный вариант. Но пока почему то в моем макросе, значения проставляются только по Яблокам. Подскажите пожалуйста, где ошибся и как реализовать подобные варианты. Заранее спасибо.
[spoiler][vba]
Код
Sub TEST()
Dim Arr() As Variant Dim i As Integer, j As Integer, k As Integer, l As Integer
'Define last Row Last_Row = Sheets("TEST").Range("A" & Rows.Count).End(xlUp).Row 'Define last Column Last_Column = Sheets("TEST").Cells(1, Columns.Count).End(xlToLeft).Column 'Redim array ReDim Arr(1 To Last_Row, 1 To Last_Column)
Sheets("TEST").Select 'Заполняем массив данными со вкладки For i = 1 To Last_Row For j = 1 To Last_Column Arr(i, j) = Cells(i, j).Value Next j Next i
Sheets("1").Select For k = LBound(Arr) To UBound(Arr) 'Заполняем столбцы For l = LBound(Arr) To UBound(Arr) 'Заполняем строки
Всем привет. Прошу вашей помощи, уважаемые форумчане, т.к сам пока не могу справиться. Начал изучать массивы и работу с ними и возник вопрос, возможно ли повернуть массив так, как обозначено на вкладке result_example. Результат2 - это был бы идеальный вариант. Но пока почему то в моем макросе, значения проставляются только по Яблокам. Подскажите пожалуйста, где ошибся и как реализовать подобные варианты. Заранее спасибо.
[spoiler][vba]
Код
Sub TEST()
Dim Arr() As Variant Dim i As Integer, j As Integer, k As Integer, l As Integer
'Define last Row Last_Row = Sheets("TEST").Range("A" & Rows.Count).End(xlUp).Row 'Define last Column Last_Column = Sheets("TEST").Cells(1, Columns.Count).End(xlToLeft).Column 'Redim array ReDim Arr(1 To Last_Row, 1 To Last_Column)
Sheets("TEST").Select 'Заполняем массив данными со вкладки For i = 1 To Last_Row For j = 1 To Last_Column Arr(i, j) = Cells(i, j).Value Next j Next i
Sheets("1").Select For k = LBound(Arr) To UBound(Arr) 'Заполняем столбцы For l = LBound(Arr) To UBound(Arr) 'Заполняем строки
Код от nilem как всегда хорош и оптимален, рекомендую использовать его. Из интереса привожу менее производительный подход - хотел проверить, насколько по-другому будут смотреться те же действия через метод "Transpose".
[vba]
Код
Sub Rio_Unpivot() Dim aMeasures, aValues, wsResult As Worksheet, iResult&, iStep&, iValues& With ThisWorkbook.Worksheets("TEST") aMeasures = .Cells(1, 1).Resize(.Cells(.Rows.Count, 1).End(xlUp).Row, 3).Value aValues = .Cells(1, 4).Resize(UBound(aMeasures), .UsedRange.Columns.Count - 3).Value End With Set wsResult = ThisWorkbook.Worksheets("result_example") wsResult.UsedRange.Delete wsResult.Range("A1").Resize(1, 5).Value = Array("Имя", "Дата", "Сеть", "Товар", "Количество") iResult = 2: iStep = UBound(aValues, 2) With Application.WorksheetFunction For iValues = 2 To UBound(aValues) wsResult.Cells(iResult, 1).Resize(iStep, 3).Value = .Index(aMeasures, iValues) wsResult.Cells(iResult, 4).Resize(iStep, 1).Value = .Transpose(.Index(aValues, 1)) wsResult.Cells(iResult, 5).Resize(iStep, 1).Value = .Transpose(.Index(aValues, iValues)) iResult = iResult + iStep Next iValues End With End Sub
[/vba]
thrasher, здравствуйте.
Код от nilem как всегда хорош и оптимален, рекомендую использовать его. Из интереса привожу менее производительный подход - хотел проверить, насколько по-другому будут смотреться те же действия через метод "Transpose".
[vba]
Код
Sub Rio_Unpivot() Dim aMeasures, aValues, wsResult As Worksheet, iResult&, iStep&, iValues& With ThisWorkbook.Worksheets("TEST") aMeasures = .Cells(1, 1).Resize(.Cells(.Rows.Count, 1).End(xlUp).Row, 3).Value aValues = .Cells(1, 4).Resize(UBound(aMeasures), .UsedRange.Columns.Count - 3).Value End With Set wsResult = ThisWorkbook.Worksheets("result_example") wsResult.UsedRange.Delete wsResult.Range("A1").Resize(1, 5).Value = Array("Имя", "Дата", "Сеть", "Товар", "Количество") iResult = 2: iStep = UBound(aValues, 2) With Application.WorksheetFunction For iValues = 2 To UBound(aValues) wsResult.Cells(iResult, 1).Resize(iStep, 3).Value = .Index(aMeasures, iValues) wsResult.Cells(iResult, 4).Resize(iStep, 1).Value = .Transpose(.Index(aValues, 1)) wsResult.Cells(iResult, 5).Resize(iStep, 1).Value = .Transpose(.Index(aValues, iValues)) iResult = iResult + iStep Next iValues End With End Sub
nilem, спасибо. Почему то в моем файле код работает некорректно. Тянется только первый столбец, не понимаю как такое возможно. В Вашем файле все работает. Еще раз спасибо.
nilem, спасибо. Почему то в моем файле код работает некорректно. Тянется только первый столбец, не понимаю как такое возможно. В Вашем файле все работает. Еще раз спасибо. thrasher
Сообщение отредактировал thrasher - Понедельник, 24.04.2017, 19:45