Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2011, 16:51   #1
GoreProgrammist
Пользователь
 
Регистрация: 13.07.2009
Сообщений: 52
По умолчанию Вопрос по транспонированию массива.

Добрый день.

Просьба подсказать как мне побороть такую вещь:
на листе есть массив состоящий из строк с разным кол-ом заполненных ячеек.
Нужно все данные привести в один столбец.

т.е. было так, ячейки через запятую:
A,B,C,D,E,F
1 строка: 1,2,ок,нет,5
2 строка: 5,7
3 строка: ок,8,123

а должно быть всё в столбце А:

1
2
ок
нет
5
5
7
ок
8
123

верю, что есть какое то простое решение отличное от транспонирования вручную 1700 строк.
GoreProgrammist вне форума Ответить с цитированием
Старый 29.11.2011, 17:05   #2
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

\немножко благотворительности : )

Код:
Sub io()
Dim v, x, j(), i As Long
With ActiveSheet.UsedRange
    ReDim j(1 To .Rows.Count * 7, 1 To 1) ' Размер массива. Если не хватит, можете увеличить
    For Each v In .Value
        For Each x In Split(v, ",")
            If x <> "" Then i = i + 1: j(i, 1) = x
        Next
    Next
    .Parent.Next.[A1].Resize(i) = j() ' Вывод результатов на следующий лист после активного
End With
End Sub
Тишина – самый громкий звук
nerv вне форума Ответить с цитированием
Старый 29.11.2011, 17:13   #3
GoreProgrammist
Пользователь
 
Регистрация: 13.07.2009
Сообщений: 52
По умолчанию

Цитата:
Сообщение от nerv Посмотреть сообщение
\немножко благотворительности : )

Код:
Sub io()
Dim v, x, j(), i As Long
With ActiveSheet.UsedRange
    ReDim j(1 To .Rows.Count * 7, 1 To 1) ' Размер массива. Если не хватит, можете увеличить
    For Each v In .Value
        For Each x In Split(v, ",")
            If x <> "" Then i = i + 1: j(i, 1) = x
        Next
    Next
    .Parent.Next.[A1].Resize(i) = j() ' Вывод результатов на следующий лист после активного
End With
End Sub
Спасибо! Работает, только возможно сделать так что бы если в ячейке есть "," она не разваливалась на 2. То есть не зависимо от того что записано в ячейку, всё её содержимое не менялось.
И ещё вопрос по поводу размера массива, как выставить 15 столбцов на 1710 строк?
GoreProgrammist вне форума Ответить с цитированием
Старый 29.11.2011, 17:21   #4
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

как понял. Больше переделывать не буду.

Код:
Sub io()
Dim v, x(), i&
With ActiveSheet.UsedRange
    ReDim x(1 To .Rows.Count * .Columns.Count, 1 To 1)
    For Each v In .Value
        If v <> "" Then i = i + 1: x(i, 1) = v
    Next
    .Parent.Next.[A1].Resize(i) = x()
End With
End Sub
Тишина – самый громкий звук
nerv вне форума Ответить с цитированием
Старый 29.11.2011, 17:38   #5
GoreProgrammist
Пользователь
 
Регистрация: 13.07.2009
Сообщений: 52
По умолчанию

Цитата:
Сообщение от nerv Посмотреть сообщение
как понял. Больше переделывать не буду.

Код:
Sub io()
Dim l, v, x(), i&
With ActiveSheet.UsedRange
    ReDim x(1 To .Rows.Count * .Columns.Count, 1 To 1)
    For Each v In .Value
        If v <> "" Then i = i + 1: x(i, 1) = v

    Next
    .Parent.Next.[A1].Resize(i) = x()
End With
End Sub
Ясно, спасибо. Только не работает ни тот, ни этот код, при выполнении кода транспонируются только первые ячейки из строки, то есть просто происходит копирование столбца одного листа в столбец следующего. Я так понимаю цикл должен идти по ячейкам строки слева-напрво, и в случае если следующая по счёту ячейка пустая, переходить на след строку...
GoreProgrammist вне форума Ответить с цитированием
Старый 29.11.2011, 20:16   #6
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

Ответ на Ваш вопрос здесь http://programmersforum.ru/announcement.php?f=20
Тишина – самый громкий звук
nerv вне форума Ответить с цитированием
Старый 30.11.2011, 11:22   #7
GoreProgrammist
Пользователь
 
Регистрация: 13.07.2009
Сообщений: 52
По умолчанию

Цитата:
Сообщение от nerv Посмотреть сообщение
Ответ на Ваш вопрос здесь http://programmersforum.ru/announcement.php?f=20
Вот, залил пример в формате Excel 2007. Нужно все ячейки в неизменном виде расположить в столбец на другом листе. Буду благодарен, если кто нибудь откликнется и поможет.
Вложения
Тип файла: rar пример.rar (58.4 Кб, 9 просмотров)
GoreProgrammist вне форума Ответить с цитированием
Старый 30.11.2011, 12:19   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Код:
Sub tt()
    Dim cc As Range, i&
    Application.ScreenUpdating = False
    For Each cc In Sheets(1).UsedRange
        If Len(cc.Value) Then
            i = i + 1
            Sheets(2).Cells(i, 1).Value = cc.Value
        End If
    Next
    Application.ScreenUpdating = True
End Sub
Мой вариант и вариант nerv дают одинакове количество строк - 2819, но вариант nerv работает конечно быстрее.
А разница в порядке перебора данных - интересно, почему?
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 30.11.2011 в 12:29.
Hugo121 вне форума Ответить с цитированием
Старый 30.11.2011, 12:24   #9
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

Цитата:
Сообщение от GoreProgrammist Посмотреть сообщение
Вот, залил пример в формате Excel 2007. Нужно все ячейки в неизменном виде расположить в столбец на другом листе. Буду благодарен, если кто нибудь откликнется и поможет.
Второй мой код с этим справлялся. НАДО ГОВОРИТЬ ТОЧНЕЕ ЧТО ВАМ НУЖНО И ПРИКЛАДЫВАТЬ ПРИМЕР В ФАЙЛЕ.
Это как понимать?
Цитата:
Сообщение от GoreProgrammist Посмотреть сообщение
Спасибо! Работает, только возможно сделать так...
Цитата:
Сообщение от GoreProgrammist Посмотреть сообщение
Ясно, спасибо. Только не работает ни тот, ни этот код...
Код:
Sub io()
Dim v, z, x(), i&
With ActiveSheet.UsedRange
    ReDim x(1 To .Rows.Count * .Columns.Count, 1 To 1)
    For Each z In .Rows
        For Each v In z.Value
            If v <> "" Then i = i + 1: x(i, 1) = v
        Next
    Next
    .Parent.Next.[A1].Resize(i) = x()
End With
End Sub
Тишина – самый громкий звук

Последний раз редактировалось nerv; 30.11.2011 в 12:32.
nerv вне форума Ответить с цитированием
Старый 30.11.2011, 13:46   #10
GoreProgrammist
Пользователь
 
Регистрация: 13.07.2009
Сообщений: 52
По умолчанию

Цитата:
Сообщение от nerv Посмотреть сообщение
Второй мой код с этим справлялся. НАДО ГОВОРИТЬ ТОЧНЕЕ ЧТО ВАМ НУЖНО И ПРИКЛАДЫВАТЬ ПРИМЕР В ФАЙЛЕ.
Это как понимать?


Код:
Sub io()
Dim v, z, x(), i&
With ActiveSheet.UsedRange
    ReDim x(1 To .Rows.Count * .Columns.Count, 1 To 1)
    For Each z In .Rows
        For Each v In z.Value
            If v <> "" Then i = i + 1: x(i, 1) = v
        Next
    Next
    .Parent.Next.[A1].Resize(i) = x()
End With
End Sub
Класс, ребята, вы асы, спасибо вам большое!
GoreProgrammist вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по сортировке многомерного массива monbaln PHP 3 06.09.2010 22:59
Вопрос. Про передачу массива DartDayring Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 29.03.2010 02:27
Вопрос про циклический сдвиг массива С++ Юлия12 Общие вопросы C/C++ 4 08.02.2010 08:52
Небольшой вопрос по транспонированию Deman4eg Microsoft Office Excel 11 21.02.2008 11:09
Возник вопрос при заполнении массива.. SnakeMan Помощь студентам 8 15.01.2008 12:31