Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Ускорение макроса транспонирования - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Ускорение макроса транспонирования (Макросы/Sub)
Ускорение макроса транспонирования
kos-moss Дата: Суббота, 29.11.2014, 10:25 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Доброго времени суток! Уважаемые форумчане помогите ускорить работу макроса, либо написать новый. Суть проблемы такова: есть столбец его нужно транспонировать на другой лист по 10 строк либо на этот же лист но с заданного столбца, значения в столбце могут быть дробными так что нужно каким-то образом отключать преобразование в дату.

[vba]
Код
'формирование по 10 строк
Sub transposition()
Dim intI As Integer
Dim intJ As Integer
Dim intK As Integer
intK = 1
For intJ = 1 To Cells(Rows.Count, 1).End(xlUp).Row Step 10
For intI = 0 To 9 Step 1
Selection.NumberFormat = "@"
Cells(intK, 2 + intI).Value = Cells(intJ + intI, 1).Value
Next intI
intK = intK + 1
Next intJ
End Sub
[/vba]


Сообщение отредактировал kos-moss - Суббота, 29.11.2014, 10:26
 
Ответить
СообщениеДоброго времени суток! Уважаемые форумчане помогите ускорить работу макроса, либо написать новый. Суть проблемы такова: есть столбец его нужно транспонировать на другой лист по 10 строк либо на этот же лист но с заданного столбца, значения в столбце могут быть дробными так что нужно каким-то образом отключать преобразование в дату.

[vba]
Код
'формирование по 10 строк
Sub transposition()
Dim intI As Integer
Dim intJ As Integer
Dim intK As Integer
intK = 1
For intJ = 1 To Cells(Rows.Count, 1).End(xlUp).Row Step 10
For intI = 0 To 9 Step 1
Selection.NumberFormat = "@"
Cells(intK, 2 + intI).Value = Cells(intJ + intI, 1).Value
Next intI
intK = intK + 1
Next intJ
End Sub
[/vba]

Автор - kos-moss
Дата добавления - 29.11.2014 в 10:25
Gustav Дата: Суббота, 29.11.2014, 10:34 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2748
Репутация: 1138 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
Файл примера нужен. С листами "Исходное положение" и "Как должно стать". Уже хотя бы для того, чтобы работоспособность этого Вашего макроса проверить.

Чисто умозрительно априори: нужно считать диапазон-источник в массив, перекидать его в другой массив и выгрузить второй массив в диапазон-назначение. Должно быть быстрее, чем поячеечная переброска. Возможно также решение на формулах.


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Суббота, 29.11.2014, 10:37
 
Ответить
СообщениеФайл примера нужен. С листами "Исходное положение" и "Как должно стать". Уже хотя бы для того, чтобы работоспособность этого Вашего макроса проверить.

Чисто умозрительно априори: нужно считать диапазон-источник в массив, перекидать его в другой массив и выгрузить второй массив в диапазон-назначение. Должно быть быстрее, чем поячеечная переброска. Возможно также решение на формулах.

Автор - Gustav
Дата добавления - 29.11.2014 в 10:34
kos-moss Дата: Суббота, 29.11.2014, 10:48 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Макрос рабочий вот пример. С массивами совсем не умею работать. Кое как циклы освоил =)
К сообщению приложен файл: 1565986.xlsm (22.7 Kb)
 
Ответить
СообщениеМакрос рабочий вот пример. С массивами совсем не умею работать. Кое как циклы освоил =)

Автор - kos-moss
Дата добавления - 29.11.2014 в 10:48
Gustav Дата: Суббота, 29.11.2014, 11:26 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2748
Репутация: 1138 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
Если это реальная задача, а не упражнение именно в макросах, то можно формулой решить.
В ячейку B1 вводим формулу:
Код
=ИНДЕКС($A:$A;10*(СТРОКА()-СТРОКА($B$1))+СТОЛБЕЦ()-СТОЛБЕЦ($B$1)+1)

и затем копируем ее в диапазон B1:K43. Далее можно копированием и специальной вставкой оставить в этом диапазоне только значения и подчистить крайние ячейки с 0, в которые превратились пустые ячейки из исходного диапазона. Если это критично,то можно, несколько усложнив формулу, сразу подавить этот эффект.

Наконец, возвращаясь к макросам, можно записать все эти действия макрорекордером и в результате получить новый макрос, который и будет работать быстрее Вашего :)


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Суббота, 29.11.2014, 11:34
 
Ответить
СообщениеЕсли это реальная задача, а не упражнение именно в макросах, то можно формулой решить.
В ячейку B1 вводим формулу:
Код
=ИНДЕКС($A:$A;10*(СТРОКА()-СТРОКА($B$1))+СТОЛБЕЦ()-СТОЛБЕЦ($B$1)+1)

и затем копируем ее в диапазон B1:K43. Далее можно копированием и специальной вставкой оставить в этом диапазоне только значения и подчистить крайние ячейки с 0, в которые превратились пустые ячейки из исходного диапазона. Если это критично,то можно, несколько усложнив формулу, сразу подавить этот эффект.

Наконец, возвращаясь к макросам, можно записать все эти действия макрорекордером и в результате получить новый макрос, который и будет работать быстрее Вашего :)

Автор - Gustav
Дата добавления - 29.11.2014 в 11:26
kos-moss Дата: Понедельник, 01.12.2014, 13:27 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Задача реальная, вот только хотелось бы без формул, именно макросом. Запись макроса не вариант, так как это часть большого макроса в столбце после неких манипуляций всегда будет находиться разное количество строк, придется опять делать цикл, а хотелось бы уйти от циклов. Думал по поводу массивов, должно работать быстрее. Только вот не знаю как с ними работать.
 
Ответить
СообщениеЗадача реальная, вот только хотелось бы без формул, именно макросом. Запись макроса не вариант, так как это часть большого макроса в столбце после неких манипуляций всегда будет находиться разное количество строк, придется опять делать цикл, а хотелось бы уйти от циклов. Думал по поводу массивов, должно работать быстрее. Только вот не знаю как с ними работать.

Автор - kos-moss
Дата добавления - 01.12.2014 в 13:27
Gustav Дата: Понедельник, 01.12.2014, 17:58 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2748
Репутация: 1138 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
Думал по поводу массивов, должно работать быстрее. Только вот не знаю как с ними работать.

Вот, изучайте.
[vba]
Код
'формирование по 10 столбцов
Sub transposition_2()
       Dim arrSrc() As Variant: Dim arrTrg() As Variant
       Dim rowMax As Long: Dim rowsTrg As Long: Dim colsTrg As Long
       Dim i As Long: Dim r As Long: Dim c As Long
          
       colsTrg = 10
       rowMax = Cells(Rows.Count, 1).End(xlUp).Row
       rowsTrg = WorksheetFunction.RoundUp(rowMax / colsTrg, 0)
          
       ReDim arrSrc(1 To rowMax, 1 To 1)
       ReDim arrTrg(1 To rowsTrg, 1 To colsTrg)
          
       arrSrc = Range(Cells(1, 1), Cells(rowMax, 1))
       For i = 1 To rowMax
           r = Int((i - 1) / colsTrg) + 1
           c = i - (r - 1) * colsTrg
           arrTrg(r, c) = arrSrc(i, 1)
       Next i
       With Range("B1").Resize(rowsTrg, colsTrg)
           .NumberFormat = "@"
           .Value = arrTrg
       End With
End Sub
[/vba]

P.S. Ну и чисто для пробуждения фантазии - "макро-формульный" вариант:
[vba]
Код
Sub transposition_3()
     Dim rowMax As Long: Dim rowsTrg As Long: Dim colsTrg As Long
      
     colsTrg = 10
     rowMax = Cells(Rows.Count, 1).End(xlUp).Row
     rowsTrg = WorksheetFunction.RoundUp(rowMax / colsTrg, 0)
      
     With Range("B1").Resize(rowsTrg, colsTrg)
         .Formula = "=INDEX($A:$A,10*(ROW()-ROW($B$1))+COLUMN()-COLUMN($B$1)+1)"
         .Copy
         .PasteSpecial xlPasteValues
         Application.CutCopyMode = False
     End With
End Sub
[/vba]


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Понедельник, 01.12.2014, 18:19
 
Ответить
Сообщение
Думал по поводу массивов, должно работать быстрее. Только вот не знаю как с ними работать.

Вот, изучайте.
[vba]
Код
'формирование по 10 столбцов
Sub transposition_2()
       Dim arrSrc() As Variant: Dim arrTrg() As Variant
       Dim rowMax As Long: Dim rowsTrg As Long: Dim colsTrg As Long
       Dim i As Long: Dim r As Long: Dim c As Long
          
       colsTrg = 10
       rowMax = Cells(Rows.Count, 1).End(xlUp).Row
       rowsTrg = WorksheetFunction.RoundUp(rowMax / colsTrg, 0)
          
       ReDim arrSrc(1 To rowMax, 1 To 1)
       ReDim arrTrg(1 To rowsTrg, 1 To colsTrg)
          
       arrSrc = Range(Cells(1, 1), Cells(rowMax, 1))
       For i = 1 To rowMax
           r = Int((i - 1) / colsTrg) + 1
           c = i - (r - 1) * colsTrg
           arrTrg(r, c) = arrSrc(i, 1)
       Next i
       With Range("B1").Resize(rowsTrg, colsTrg)
           .NumberFormat = "@"
           .Value = arrTrg
       End With
End Sub
[/vba]

P.S. Ну и чисто для пробуждения фантазии - "макро-формульный" вариант:
[vba]
Код
Sub transposition_3()
     Dim rowMax As Long: Dim rowsTrg As Long: Dim colsTrg As Long
      
     colsTrg = 10
     rowMax = Cells(Rows.Count, 1).End(xlUp).Row
     rowsTrg = WorksheetFunction.RoundUp(rowMax / colsTrg, 0)
      
     With Range("B1").Resize(rowsTrg, colsTrg)
         .Formula = "=INDEX($A:$A,10*(ROW()-ROW($B$1))+COLUMN()-COLUMN($B$1)+1)"
         .Copy
         .PasteSpecial xlPasteValues
         Application.CutCopyMode = False
     End With
End Sub
[/vba]

Автор - Gustav
Дата добавления - 01.12.2014 в 17:58
kos-moss Дата: Среда, 03.12.2014, 05:51 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Gustav, Огромное спасибо! Макросы просто летают.
 
Ответить
СообщениеGustav, Огромное спасибо! Макросы просто летают.

Автор - kos-moss
Дата добавления - 03.12.2014 в 05:51
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Ускорение макроса транспонирования (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!