макрос для копирования набора столбцов один под другим

Автор Светлана512, 05.04.2011, 16:09

« назад - далее »

Светлана512

Добрый день, подскажите, пожалуйста, возможно ли сделать так, чтобы макрос копировал набор столбцов один под другим?
Иными словами, хочу сделать обратное действие по сравнению с собиранием данных в сводную таблицу
Очень надеюсь на скорую помощь!
спасибо

GWolf

Цитата: Светлана512 от 05.04.2011, 16:09
Добрый день, подскажите, пожалуйста, возможно ли сделать так, чтобы макрос копировал набор столбцов один под другим?
Иными словами, хочу сделать обратное действие по сравнению с собиранием данных в сводную таблицу
Очень надеюсь на скорую помощь!
спасибо

Добрый вечер!

А примерчиком не озадачите нас?  ;)
Путей к вершине - множество. Этот один из многих!

Светлана512

А вот и пример - на листе 1 то что есть
а на листе 2 - то что должно получиться (все данные должны оказаться с одном столбце, а не в матрице, а также уйти все нулевые значения)

спасибо!

Wasilic

Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.

Светлана512

А если исходные данные чуть-чуть модифицированы, можете посмотреть ?  :-\
что-то не получается тогда...  :-[

задача та же, только даты и названия сдвинуты

GWolf

Цитата: Светлана512 от 06.04.2011, 11:50
А если исходные данные чуть-чуть модифицированы, можете посмотреть ?  :-\
что-то не получается тогда...  :-[

задача та же, только даты и названия сдвинуты

Ну как я и думал: - Следует определить координаты крайних ячеек таблицы, а уж потом модифицировать!!!
От себя могу предложить: как определить крайнюю-правую ячейку, а вот как с наименьшей кровью определить верхнюю-левую?

Итак, для крайней-правой (если на листе только эта таблица!):

Sub proba()
    Dim blok As Range
   
    With ThisWorkbook.ActiveSheet
        'определяем занятую данными область листа == Start ==
        Set blok = .UsedRange
        nREnd = blok.Row + blok.Rows.Count - 1
        nCEnd = blok.Column + blok.Columns.Count
        Set blok = Nothing
        'определяем занятую данными область листа == Stop ==
   
    End With
End Sub


Путей к вершине - множество. Этот один из многих!

Wasilic

Комментарии в макросе.
Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.

GWolf

Доброго дня, ув. Wasilic!
Я то имел в виду нечто другое:

Есть прямоугольная область листа, не начинающаяся в ячейке A1, как определить ее границы?
Крайние нижнюю-правую - определим, а вот как определить верхнюю-левую?
Как вариант перебирать ячейки, пока не встретим .Text=""? Может есть другие варианты.

Мне кажется, что решив этот вопрос, мы действительно сможем предложить пользователю УНИВЕРСАЛЬНЫЙ макрос, имеющий лишь одно ограничение: Таблица на листе должна быть ОДНА!

Или я не прав?
Путей к вершине - множество. Этот один из многих!

_Boroda_

#8
Если на листе только таблица и только одна, то можно так:
Sub ttt()
r1_ = Range("A1").SpecialCells(xlLastCell).Row
c1_ = Range("A1").SpecialCells(xlLastCell).Column
r0_ = Range("A1").SpecialCells(xlLastCell).CurrentRegion.Row
c0_ = Range("A1").SpecialCells(xlLastCell).CurrentRegion.Column
End Sub
Скажи мне, кудесник, любимец ба'гов...



Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995

GWolf

Цитата: _Boroda_ от 07.04.2011, 11:28
Если на листе только таблица и только одна, то можно так:
Sub ttt()
r1_ = Range("A1").SpecialCells(xlLastCell).Row
c1_ = Range("A1").SpecialCells(xlLastCell).Column
r0_ = Range("G12").SpecialCells(xlLastCell).CurrentRegion.Row
c0_ = Range("G12").SpecialCells(xlLastCell).CurrentRegion.Column
End Sub


А вот так не лучше будет?

Sub kanvas()
    Dim nRIn As Long, nCIn As Long, nROu As Long, nCOu As Long

    '=== определяем границы == Start ===
    With ThisWorkbook.ActiveSheet
        'определяем крайние:
        nROu = Range(.Cells(1, 1), .Cells(1, 1)).SpecialCells(xlLastCell).Row
        nCOu = Range(.Cells(1, 1), .Cells(1, 1)).SpecialCells(xlLastCell).Column
        'стартовые
        nRIn = Range(.Cells(nROu, nCOu), .Cells(nROu, nCOu)).SpecialCells(xlLastCell).CurrentRegion.Row
        nCIn = Range(.Cells(nROu, nCOu), .Cells(nROu, nCOu)).SpecialCells(xlLastCell).CurrentRegion.Column
    End With
    '=== определяем границы == Stop ====
End Sub
Путей к вершине - множество. Этот один из многих!

_Boroda_

Это у меня ошибка случайная закралась в код
Не G12, а A1 должно быть в 2-х последних строках. Поменял в посте выше
Скажи мне, кудесник, любимец ба'гов...



Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995

GWolf

#11
Цитата: _Boroda_ от 07.04.2011, 12:11
Это у меня ошибка случайная закралась в код
Не G12, а A1 должно быть в 2-х последних строках. Поменял в посте выше

Прикольно! Но так как у меня тоже работает! Хотя Вы правы Маэстро! Единственное - не люблю я абсолютные ссылки, но в данном примере А1 он и в Африке А1!

P.S.
Порылся в help ... Как вы коллеги думаете? Не правельнее ли будет вот такой код:

Sub kanvas()
    Dim nRIn As Long, nCIn As Long, nROu As Long, nCOu As Long

    '=== определяем границы == Start ===
    With ThisWorkbook.ActiveSheet
        'определяем крайние:
        nROu = Range(.Cells(1, 1), .Cells(1, 1)).SpecialCells(xlLastCell).Row
        nCOu = Range(.Cells(1, 1), .Cells(1, 1)).SpecialCells(xlLastCell).Column
        'стартовые
        nRIn = Range(.Cells(nROu, nCOu), .Cells(nROu, nCOu)).CurrentRegion.Row
        nCIn = Range(.Cells(nROu, nCOu), .Cells(nROu, nCOu)).CurrentRegion.Column
    End With
    '=== определяем границы == Stop ====
End Sub


Хотя все три варианта определяют вроде правильные значения, но чисто МЕТОДОЛОГИЧЕСКИ? Хотелось бы узнать!
Путей к вершине - множество. Этот один из многих!

Wasilic

#12
Цитата: GWolf от 07.04.2011, 11:08
Мне кажется, что решив этот вопрос, мы действительно сможем предложить пользователю УНИВЕРСАЛЬНЫЙ макрос, имеющий лишь одно ограничение: Таблица на листе должна быть ОДНА!

Или я не прав?
Прав конечно. Но, дайте же и пользователью возможность пошевелить серым веществом.
Был первый пример. Я подсказал путь решения задачи. Оказывается, это "путь в темном лесу".
В следующем примере я описал "каждое дерево этого леса".
Ну а вы решили еще и просеку прорубить.  ;D  А что же пользователю останется.  :)
ИМХО. Пока пользователь не поймет сам принцип работы макроса.  То и универсальный ему не поможет. Такой вот юмор! Без обид! И пользователь  тоже.
ЗЫ. А ведь в примере цикл нужен все же не из первой строки и не из первого столбца таблицы. А еще у кого-то потребуется еще иначе. Вот Вам и универсальность.
Без серого вешества никак.
Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.

GWolf

Цитата: Wasilic от 08.04.2011, 11:14
... Но, дайте же и пользователью возможность пошевелить серым веществом.
Был первый пример. Я подсказал путь решения задачи. Оказывается, это "путь в темном лесу".
В следующем примере я описал "каждое дерево этого леса".
Ну а вы решили еще и просеку прорубить.  ;D  А что же пользователю останется.  :)
ИМХО. Пока пользователь не поймет сам принцип работы макроса.  То и универсальный ему не поможет. Такой вот юмор!

А пользователи у нас, задав вопрос - нервно курят в кустах! Или чего они еще там делают?!  >:( Стало почти среднестат нормой задавать конкретный вопрос без примера; помалкивать пока мы тут делаем попытки - отвечаем, получается сами себе на заявленную тему. Я не хочу никого обидеть, но ГАСПАДА, майте совесть! Задали тему, так курируйте ее. Ну хотя бы напишите что типа Ваш, товарищь который ответил, макрос не работает. А то сколь раз ужо было: предлагаем -  предлагаем, а в результате на 18-20 сообщении: - Я не очень волоку в макросах ... Ну воот и приехали! С этого следовало бы начать.
А позвольте спросить: - Почему не волоку, то? Мы ведь тоже не с макросами родились. Единственное наше желание, это повышать свой уровень обмениваясь накопленным багажом. А вот решать задачки для лентяев - это к фрилансерам.

Извините если что не так.
Путей к вершине - множество. Этот один из многих!

Wasilic

Цитата: GWolf от 08.04.2011, 11:28
Мы ведь тоже не с макросами родились. Единственное наше желание, это повышать свой уровень обмениваясь накопленным багажом. А вот решать задачки для лентяев - это к фрилансерам.
sm_clap
Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.