транспортировать из столбца в строку по заданию

Автор verkon, 20 июня 2016, 19:16

0 Пользователи и 1 гость просматривают эту тему.

verkon

Здравствуйте, помогите пожалуйста. Не знаю как фильтром или макросом или еще как.
Есть данные, все в столбце. Нужно все строки которые находятся под той что начинается на "а" переносились, потом следующая "а" также, как в примере. Вместо "а" может быть определенное слово.

пример прикрепляю.

Спасибо.

economist

При переменном числе элементов - только макрос.
Иначе хватило бы формулы с автозаполнением.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

verkon

Цитата: economist от 20 июня 2016, 19:24
При переменном числе элементов - только макрос.
Иначе хватило бы формулы с автозаполнением.
Да количество строк под "а" разное от 3 до 6.  А с макросом можете помочь?

economist

Это все на одном листе (исходные данные и трансформер) или д.б. на разных?
Исх. данные всегда в столбце А?
Результат всегда со столбца С вправо и вниз?

Я не люблю StarBasic из-за многословности, поэтому буду писать на гибриде SB+VBA.
Он работает в LibreOffice, насчет OO скажу завтра. 

Код получается в 5 раз компактнее и в 10 раз понятнее.
Такая задача должна решаться за 10 минут, не более. Утром займемся...   
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

verkon

Цитата: economist от 20 июня 2016, 20:24
Это все на одном листе (исходные данные и трансформер) или д.б. на разных?
Исх. данные всегда в столбце А?
Результат всегда со столбца С вправо и вниз?
Лучше на другой лист.  Но можно и на одном. Справа внизу или вверху.  Лишь бы результат был. Исходные, да, в столбце А.
Спасибо!

economist


Option VBASupport 1
Option Compatible
'-----------------------------------------------
Sub Transponiruem ' (c) economist' OpenOffice 412 и LibreOffice 5 - 100% ОК!
' транспонирует таблицу с нормализацией (строки - в столбцы, число любое)
' новая строка/секция - при нахождении "a11111"

' для совместимости OpenOffice и LibreOffice с VBA нужно один раз выполнить
' эту строку, потом можно ее закомментировать
ThisComponent.BasicLibraries.VBACompatibilityMode=true

For each n in Range("A2:A1048576") ' сразу с 2-й строки, без заголовоков
If n.value="" then exit for ' досрочно выйдем из цикла, если данные кончились

If n.value="a11111" then ' если нашли признак секции
stroka=stroka+1 ' счетчик строк+1, он не сбрасывается
k=0 ' сбросили счетчик столбцов, т.к. нашли новую секцию
End if

k=k+1 ' т.к. сделали все в однмо цикле - счетчик растет все время 
Cells(1+stroka,2+k).value=n.value ' пишем
'1 - это смещение строки - т.е. со 2-й, 2 - это смещение столбцов - т.е. С

Next N
End Sub

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

#6
Немного пояснений:
1) т.к. данных мизер - можно не использовать массивы значений и диапазоны (это быстрее раз в 10)
2) т.к. таблица плоская - можно обойтись без вложенных циклов
3) в начале модуля

Option VBASupport 1
Option Compatible

позволяют писать на "смеси" StarBasic+VBA. А  это лаконично (А также ...дешево, удобно и практично. (с) Сергей Папанов)

4) ThisComponent.BasicLibraries.VBACompatibilityMode=true
- позволяет программировать пользовательские функции даже названные на кириллице, например:


Option VBASupport 1
Option Compatible
'-----------------------------------------------
Function СУММ(a as range) as double
ThisComponent.BasicLibraries.VBACompatibilityMode=true  
For each n in a
s = s + n.value
Next n
СУММ=s
End Function


Правда работают такие функции только в LibreOffice Calc.
PS - ушло на все минут двадцать, комментировал код, но зато уверен что вы сможете доработать его как надо.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

Вообще, очень много сложных вещей на StarBasic - после перевода на язык VBA
выглядят просто, и работают в OpenOffice и LibreOffice без проблем. Главное - что
объектная модель MS Excel и его основные методы довольно неплохо реализована, например:


Workbooks.Open (ActiveWorkbook.Path & "Далбица.ods") ' так можно открыть файл
Msgbox(ActiveWorkbook.Path) ' прочесть путь
Msgbox(Application.Average(1,3,3)) ' использовать функцию =СРЗНАЧ() или =AVERAGE() 
Application.ScreenUpdating = False 'заморозка - аналог ThisComponent.LockControllers
Application.ScreenUpdating = True 'отморозка - аналог ThisComponent.UnlockControllers
MsgBox(ActiveCell.offset(0,1).value) ' сместиться
Sheets(1).Activate ' перейти на лист
Sheets("Лист2").Select ' выбрать ячейку
[A1]=123 ' записать 123 в ячейку
[ААА].Select ' выбрать именованный диапазон, ААА - это имя
Application.StatusBar = "123" ' вывод чегой-та в статус бар
[ААА].clearcontents ' очистить содержимое без геморроя (на чистом SB - на это нужно 4 отдельные команды!!!)


Когда это пробуешь впервые - слезы радости накатывают, как будто на чужбине встретил русского впервые лет за десять  :roll:
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

verkon

Цитата: economist от 21 июня 2016, 09:31

Option VBASupport 1
Option Compatible
'-----------------------------------------------
Sub Transponiruem ' (c) economist' OpenOffice 412 и LibreOffice 5 - 100% ОК!
' транспонирует таблицу с нормализацией (строки - в столбцы, число любое)
' новая строка/секция - при нахождении "a11111"

' для совместимости OpenOffice и LibreOffice с VBA нужно один раз выполнить
' эту строку, потом можно ее закомментировать
ThisComponent.BasicLibraries.VBACompatibilityMode=true

For each n in Range("A2:A1048576") ' сразу с 2-й строки, без заголовоков
If n.value="" then exit for ' досрочно выйдем из цикла, если данные кончились

If n.value="a11111" then ' если нашли признак секции
stroka=stroka+1 ' счетчик строк+1, он не сбрасывается
k=0 ' сбросили счетчик столбцов, т.к. нашли новую секцию
End if

k=k+1 ' т.к. сделали все в однмо цикле - счетчик растет все время 
Cells(1+stroka,2+k).value=n.value ' пишем
'1 - это смещение строки - т.е. со 2-й, 2 - это смещение столбцов - т.е. С

Next N
End Sub



Спасибо. А как сделать так чтоб именно по букве а или слову начинающемуся на а также работало.  Т.е. на везде а11111, а может быть а22222 а33333   and2344:,  abc5h5. Т.е. находит именно букву а в начале ячейки или определенное слово в начале ячейки.

economist

Вместо строки:

If n.value="a11111" then ' если нашли признак секции


надо поставить


If left(n.value, 1)="a" then ' если первый левый символ - а, то мы нашли признак секции


Условия можно соединять через OR, AND, NOT, можно анализировать длину слова, регистр букв, наличие подстроки в строке (руб содержится в "Сумма 1200 рублей") итп.     
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...