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

Вход

Регистрация

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

 

= Мир MS Excel/Макрос,что транспонирует данные из столбца в колонки - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Макрос,что транспонирует данные из столбца в колонки
Дашуля Дата: Четверг, 28.08.2014, 16:34 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 40% ±

Excel 2010
Вообщем суть проблемы: имеется БД, состоящая из названия, адреса,телефона. Это БД записана в 1 столбец, а данные расположены поочередно, то есть:


и так далее.. строк несколько тысяч. Требуется разбить этот столбец на три колонки по параметрам (названия в названия и т.д.).
Знаю простой метод - выделяю ячейки с данными для 1 учреждения, потом клацаю на соседнюю с названием ячейку правой кнопкой => cпециальная вставка => транспонирование. В принципе необходимое действие выполнено. Но, т.к. позиций несколько тысяч, вручную это делать очень долго.
Поэтому хотела создать макрос, но проблема в том, что данные могут состоять из разного количества строк для одной компании, хотя последняя строчка всегда одинаково начинается: "Prefix*". Поэтому все ломаю голову как сделать транспонирование с условием проверки до следующей ячейки с записью "Prefix*".

И, вдруг кто-то знает решение, чтобы все телефоны были в одной колонке, emailы в другой.

Пример данных (построчно):


А должно выйти по столбикам (каждая строчка - новый столбик):


Нашла отчасти похожий код:
[vba]
Код
Sub bb()
Dim a As Range, b As Range, c As Range
Set b = [A2]
Set c = [G2]
Do
Set a = b
Set b = b.Offset(1)
Do Until b Like "Prefix*" Or b = "" //Заменила на свою задачу, там было ";"
Set b = b.Offset(1)
Loop
Range(a, b.Offset(-1)).Copy
c.PasteSpecial Transpose:=True
If Left(c, 2) = "; " Then c = Mid(c, 3)
Set c = c.Offset(1)
Loop Until b = ""
Application.CutCopyMode = False
End Sub
[/vba]
К сообщению приложен файл: Example.xlsx (12.4 Kb)


Сообщение отредактировал Serge_007 - Четверг, 28.08.2014, 21:31
 
Ответить
СообщениеВообщем суть проблемы: имеется БД, состоящая из названия, адреса,телефона. Это БД записана в 1 столбец, а данные расположены поочередно, то есть:


и так далее.. строк несколько тысяч. Требуется разбить этот столбец на три колонки по параметрам (названия в названия и т.д.).
Знаю простой метод - выделяю ячейки с данными для 1 учреждения, потом клацаю на соседнюю с названием ячейку правой кнопкой => cпециальная вставка => транспонирование. В принципе необходимое действие выполнено. Но, т.к. позиций несколько тысяч, вручную это делать очень долго.
Поэтому хотела создать макрос, но проблема в том, что данные могут состоять из разного количества строк для одной компании, хотя последняя строчка всегда одинаково начинается: "Prefix*". Поэтому все ломаю голову как сделать транспонирование с условием проверки до следующей ячейки с записью "Prefix*".

И, вдруг кто-то знает решение, чтобы все телефоны были в одной колонке, emailы в другой.

Пример данных (построчно):


А должно выйти по столбикам (каждая строчка - новый столбик):


Нашла отчасти похожий код:
[vba]
Код
Sub bb()
Dim a As Range, b As Range, c As Range
Set b = [A2]
Set c = [G2]
Do
Set a = b
Set b = b.Offset(1)
Do Until b Like "Prefix*" Or b = "" //Заменила на свою задачу, там было ";"
Set b = b.Offset(1)
Loop
Range(a, b.Offset(-1)).Copy
c.PasteSpecial Transpose:=True
If Left(c, 2) = "; " Then c = Mid(c, 3)
Set c = c.Offset(1)
Loop Until b = ""
Application.CutCopyMode = False
End Sub
[/vba]

Автор - Дашуля
Дата добавления - 28.08.2014 в 16:34
Gustav Дата: Четверг, 28.08.2014, 18:24 | Сообщение № 2
Группа: Админы
Ранг: Участник клуба
Сообщений: 2867
Репутация: 1208 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Вижу в файле в ячейках опорные метки типа: Telephone, Facsimile, Email, Prefix(es). Не вижу на что опереться выше этих меток. Или первые пять ячеек (имя, адреса) одного блока, начиная с имени всегда присутствуют в каждом блоке?

В общем, я бы вначале сделал так в колонках В:E на первом листе:

колонка B - сквозная нумерация всех имеющихся строк (так, на всякий случай, будет нелишним)

колонка С - генерируем нумерацию блоков: в ячейке C1: 1 ,
далее, начиная с ячейки C2, формула:
Код
=ЕСЛИ(ЕОШ(ПОИСК("Prefix";A1));C1;C1+1)


колонка D - генерируем нумерацию строк внутри блоков: в ячейке D1: 1 ,
далее, начиная с ячейки D2, формула:
Код
=ЕСЛИ(C2=C1;D1+1;1)


колонка E - для первых 5 (постоянных?) безметочных ячеек внутри блока - просто номер из колонки D,
далее с 6-й ячейки каждого блока индикация одной из меток: Telephone, Facsimile, Email, Prefix(es);
начиная с ячейки E1, формула:
Код
=ЕСЛИ(D1<=5;D1;ЛЕВСИМВ(A1;ПОИСК(":";A1)-1))


Далее я бы подумал далее... А именно - в направлении создания на новом листе таблицы со столбцами - уникальными значениями колонки E, и со строками - номерами блоков, т.е. числами от 1 до максимального из колонки C... Этот лист я назвал "ВытягивающаяТаблица"

Далее в колонке F первого листа можно сцепить номера блока и метки и получить уникальный идентификатор строки
Код
=C1&"_"&E1


Этот идентификатор затем можно сформировать и в ячейках "ВытягивающейТаблицы", окончательная формула для этих ячеек такая:
Код
=ЕСЛИОШИБКА(ИНДЕКС('Что есть'!$A$1:$A$34;ПОИСКПОЗ($A2&"_"&B$1;'Что есть'!$F$1:$F$34;0));"")


Результат можно посмотреть в прилагаемом файле. Вот какой-то такой примерно подход к решению задач подобного рода...
К сообщению приложен файл: Example2.xlsx (18.4 Kb)


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

Сообщение отредактировал Gustav - Четверг, 28.08.2014, 19:09
 
Ответить
СообщениеВижу в файле в ячейках опорные метки типа: Telephone, Facsimile, Email, Prefix(es). Не вижу на что опереться выше этих меток. Или первые пять ячеек (имя, адреса) одного блока, начиная с имени всегда присутствуют в каждом блоке?

В общем, я бы вначале сделал так в колонках В:E на первом листе:

колонка B - сквозная нумерация всех имеющихся строк (так, на всякий случай, будет нелишним)

колонка С - генерируем нумерацию блоков: в ячейке C1: 1 ,
далее, начиная с ячейки C2, формула:
Код
=ЕСЛИ(ЕОШ(ПОИСК("Prefix";A1));C1;C1+1)


колонка D - генерируем нумерацию строк внутри блоков: в ячейке D1: 1 ,
далее, начиная с ячейки D2, формула:
Код
=ЕСЛИ(C2=C1;D1+1;1)


колонка E - для первых 5 (постоянных?) безметочных ячеек внутри блока - просто номер из колонки D,
далее с 6-й ячейки каждого блока индикация одной из меток: Telephone, Facsimile, Email, Prefix(es);
начиная с ячейки E1, формула:
Код
=ЕСЛИ(D1<=5;D1;ЛЕВСИМВ(A1;ПОИСК(":";A1)-1))


Далее я бы подумал далее... А именно - в направлении создания на новом листе таблицы со столбцами - уникальными значениями колонки E, и со строками - номерами блоков, т.е. числами от 1 до максимального из колонки C... Этот лист я назвал "ВытягивающаяТаблица"

Далее в колонке F первого листа можно сцепить номера блока и метки и получить уникальный идентификатор строки
Код
=C1&"_"&E1


Этот идентификатор затем можно сформировать и в ячейках "ВытягивающейТаблицы", окончательная формула для этих ячеек такая:
Код
=ЕСЛИОШИБКА(ИНДЕКС('Что есть'!$A$1:$A$34;ПОИСКПОЗ($A2&"_"&B$1;'Что есть'!$F$1:$F$34;0));"")


Результат можно посмотреть в прилагаемом файле. Вот какой-то такой примерно подход к решению задач подобного рода...

Автор - Gustav
Дата добавления - 28.08.2014 в 18:24
Дашуля Дата: Четверг, 28.08.2014, 19:23 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 40% ±

Excel 2010
Спасибо большое за старание!!
Быть может кому пригодится..
В итоге реализовано все с помощью макроса так (чтобы телефоны, имейлы и веб страницы были по соответствующим колонкам) :
[vba]
Код
Sub Макрос1()
Dim S As Range, i&, k&
i = 1: k = 1
Sheets(2).Cells.ClearContents
For Each S In Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row)
If S Like "*Telephone*" Then
Sheets(2).Cells(i, 6) = S
Else
If S Like "*Email*" Then
Sheets(2).Cells(i, 7) = S
Else
If S Like "http:*" Then
Sheets(2).Cells(i, 9) = S
Else[
If S Like "*Prefix*" Then
Sheets(2).Cells(i, 10) = S
i = i + 1
k = 1
Else
If k = 7 Then k = 8
Sheets(2).Cells(i, k) = S
k = Sheets(2).Cells(i, Columns.Count).End(xlToLeft).Column + 1
End If
End If
End If
End If
Next
End Sub
[/vba]


Сообщение отредактировал Serge_007 - Четверг, 28.08.2014, 21:32
 
Ответить
СообщениеСпасибо большое за старание!!
Быть может кому пригодится..
В итоге реализовано все с помощью макроса так (чтобы телефоны, имейлы и веб страницы были по соответствующим колонкам) :
[vba]
Код
Sub Макрос1()
Dim S As Range, i&, k&
i = 1: k = 1
Sheets(2).Cells.ClearContents
For Each S In Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row)
If S Like "*Telephone*" Then
Sheets(2).Cells(i, 6) = S
Else
If S Like "*Email*" Then
Sheets(2).Cells(i, 7) = S
Else
If S Like "http:*" Then
Sheets(2).Cells(i, 9) = S
Else[
If S Like "*Prefix*" Then
Sheets(2).Cells(i, 10) = S
i = i + 1
k = 1
Else
If k = 7 Then k = 8
Sheets(2).Cells(i, k) = S
k = Sheets(2).Cells(i, Columns.Count).End(xlToLeft).Column + 1
End If
End If
End If
End If
Next
End Sub
[/vba]

Автор - Дашуля
Дата добавления - 28.08.2014 в 19:23
Gustav Дата: Пятница, 29.08.2014, 15:01 | Сообщение № 4
Группа: Админы
Ранг: Участник клуба
Сообщений: 2867
Репутация: 1208 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
В итоге реализовано все с помощью макроса

Лихо! :) В принципе мне понравилось. Со своей стороны посмел немножко Вас упростить и чуть-чуть изменить. Изменить - потому что не очень понял про манипуляции с 7 и 8 столбцами (If k = 7 Then k = 8), а также откуда возник "http" и куда пропал "Facsimile". В итоге отредактированный макрос приводит к такому же результату, что и решение на формулах в моем предыдущем сообщении:
[vba]
Код
Sub Макрос2()
     Dim S As Range, i&, k&, sht As Worksheet, rng As Range
      
     Set sht = Sheets(2) 'чтобы менять в одном месте, если вдруг захотим другой лист
     sht.Cells.ClearContents
     'квалификатор Sheets(1) - чтобы макрос правильно работал при любом активном листе
     Set rng = Sheets(1).Range("A1:A" & Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row)
      
     i = 1: k = 1
     For Each S In rng.Cells 'для наглядности, что перебираем именно ячейки диапазона
         If S Like "*Telephone*" Then
             sht.Cells(i, 6) = S
         ElseIf S Like "*Facsimile*" Then
             sht.Cells(i, 7) = S
         ElseIf S Like "*Email*" Then
             sht.Cells(i, 8) = S
         ElseIf S Like "*Prefix*" Then
             sht.Cells(i, 9) = S
             i = i + 1: k = 1
         Else
             sht.Cells(i, k) = S
             k = k + 1
         End If
     Next
End Sub
[/vba]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
В итоге реализовано все с помощью макроса

Лихо! :) В принципе мне понравилось. Со своей стороны посмел немножко Вас упростить и чуть-чуть изменить. Изменить - потому что не очень понял про манипуляции с 7 и 8 столбцами (If k = 7 Then k = 8), а также откуда возник "http" и куда пропал "Facsimile". В итоге отредактированный макрос приводит к такому же результату, что и решение на формулах в моем предыдущем сообщении:
[vba]
Код
Sub Макрос2()
     Dim S As Range, i&, k&, sht As Worksheet, rng As Range
      
     Set sht = Sheets(2) 'чтобы менять в одном месте, если вдруг захотим другой лист
     sht.Cells.ClearContents
     'квалификатор Sheets(1) - чтобы макрос правильно работал при любом активном листе
     Set rng = Sheets(1).Range("A1:A" & Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row)
      
     i = 1: k = 1
     For Each S In rng.Cells 'для наглядности, что перебираем именно ячейки диапазона
         If S Like "*Telephone*" Then
             sht.Cells(i, 6) = S
         ElseIf S Like "*Facsimile*" Then
             sht.Cells(i, 7) = S
         ElseIf S Like "*Email*" Then
             sht.Cells(i, 8) = S
         ElseIf S Like "*Prefix*" Then
             sht.Cells(i, 9) = S
             i = i + 1: k = 1
         Else
             sht.Cells(i, k) = S
             k = k + 1
         End If
     Next
End Sub
[/vba]

Автор - Gustav
Дата добавления - 29.08.2014 в 15:01
  • Страница 1 из 1
  • 1
Поиск:

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