В этом макросе не указано, в какие ячейки листов вставляются данные. Просто активируется лист и вставляется куда попало Следовательно, для того чтобы вставлялось в столбик, нужно это "куда попало" двигать. Можно двигать до, можно после. Синтаксис: [vba]
Code
Selection.Offset(1).Select
[/vba] Т.е. активировали лист, подвинули активную ячейку, вставили. Или сперва вставили, потом подвинули для следующего раза. Но правильнее конечно действовать без активаций и селектов - конкретно в коде указываем, в какую ячейку какого листа пишем данные. А сдвиг можно считать в переменной (если два листа, то можно объявить две переменные и их увеличивать на каждом шаге), или динамически определять последнюю заполненную ячейку. Ну а если данных много, то берём сразу все исходные данные в одну "переменную", т.е в массив, объявляем ещё два/три таких же пустых массива, перебираем исходный массив и перекладываем из одного в другие, потом выгружаем массивы по местам. Просто и быстро.
В этом макросе не указано, в какие ячейки листов вставляются данные. Просто активируется лист и вставляется куда попало Следовательно, для того чтобы вставлялось в столбик, нужно это "куда попало" двигать. Можно двигать до, можно после. Синтаксис: [vba]
Code
Selection.Offset(1).Select
[/vba] Т.е. активировали лист, подвинули активную ячейку, вставили. Или сперва вставили, потом подвинули для следующего раза. Но правильнее конечно действовать без активаций и селектов - конкретно в коде указываем, в какую ячейку какого листа пишем данные. А сдвиг можно считать в переменной (если два листа, то можно объявить две переменные и их увеличивать на каждом шаге), или динамически определять последнюю заполненную ячейку. Ну а если данных много, то берём сразу все исходные данные в одну "переменную", т.е в массив, объявляем ещё два/три таких же пустых массива, перебираем исходный массив и перекладываем из одного в другие, потом выгружаем массивы по местам. Просто и быстро.Hugo
И то. Тут речь о замене формулы, а не изменении в ней. Изменить в формуле можно критерий, диапазон и т.д. Т.е. изменить аргументы. Мне кажется, тут Божьего дара не нать. В большинстве случаев, даже если не понимаешь - справочку почитал, поэкспериментировал, сделал. Я предпочитаю так поступать. Так лучше запоминается и в следующий раз уже легче.
Quote (Serge_007)
Пример конечно не самый лучший
И то. Тут речь о замене формулы, а не изменении в ней. Изменить в формуле можно критерий, диапазон и т.д. Т.е. изменить аргументы. Мне кажется, тут Божьего дара не нать. В большинстве случаев, даже если не понимаешь - справочку почитал, поэкспериментировал, сделал. Я предпочитаю так поступать. Так лучше запоминается и в следующий раз уже легче.KuklP
Ну с НДС и мы чего-то стoим! kuklp60@gmail.com WM Z206653985942, R334086032478, U238399322728
Сообщение отредактировал KuklP - Вторник, 03.01.2012, 00:40
если данных много, то берём сразу все исходные данные в одну "переменную", т.е в массив, объявляем ещё два/три таких же пустых массива, перебираем исходный массив и перекладываем из одного в другие, потом выгружаем массивы по местам. Просто и быстро.
Для формул это убийственно Логика абсолютна другая...
Quote (Hugo)
если данных много, то берём сразу все исходные данные в одну "переменную", т.е в массив, объявляем ещё два/три таких же пустых массива, перебираем исходный массив и перекладываем из одного в другие, потом выгружаем массивы по местам. Просто и быстро.
Для формул это убийственно Логика абсолютна другая...Serge_007
Вторая попытка. Записал опять макрорекордером, но добавил if, хотя и не правильно: матом VBA ругается
Code
Sub Ïåðåíîñ2() ' ' Ïåðåíîñ2 Ìàêðîñ '
' If "B:B" = "Äà" Then Range("A1").Select Selection.Cut Sheets("Äà").Select Selection.Insert Shift:=xlDown Sheets("Äàííûå").Select Selection.Delete Shift:=xlUp Range("B1").Select Selection.ClearContents End If If "B:B" = "Íåò" Then Range("A1").Select Selection.Cut Sheets("Íåò").Select Range("A1").Select Selection.Insert Shift:=xlDown Sheets("Äàííûå").Select End If End Sub
Вторая попытка. Записал опять макрорекордером, но добавил if, хотя и не правильно: матом VBA ругается
Code
Sub Ïåðåíîñ2() ' ' Ïåðåíîñ2 Ìàêðîñ '
' If "B:B" = "Äà" Then Range("A1").Select Selection.Cut Sheets("Äà").Select Selection.Insert Shift:=xlDown Sheets("Äàííûå").Select Selection.Delete Shift:=xlUp Range("B1").Select Selection.ClearContents End If If "B:B" = "Íåò" Then Range("A1").Select Selection.Cut Sheets("Íåò").Select Range("A1").Select Selection.Insert Shift:=xlDown Sheets("Äàííûå").Select End If End Sub
Вот так можно с селектами. Пройдите в пошаговом режиме (F8), все будет понятно. [vba]
Code
Sub Перенос2() Dim r As Range For Each r In Range("B1:B23") r.Select Select Case r.Value Case "да" r.Previous.Select Selection.Cut Sheets("Да").Activate Range("A1000").Select Selection.End(xlUp).Offset(1).Select Selection.Insert Shift:=xlDown Sheets("Данные").Activate r.Select Selection.ClearContents Case "нет" r.Previous.Select Selection.Cut Sheets("Нет").Activate Range("A1000").Select Selection.End(xlUp).Offset(1).Select Selection.Insert Shift:=xlDown Sheets("Данные").Activate r.Select Selection.ClearContents End Select Next Range("A1:A23").SpecialCells(xlCellTypeBlanks).Select Selection.Delete Shift:=xlUp End Sub
[/vba] А где кнопочка с тегами для красивых кодов?
Вот так можно с селектами. Пройдите в пошаговом режиме (F8), все будет понятно. [vba]
Code
Sub Перенос2() Dim r As Range For Each r In Range("B1:B23") r.Select Select Case r.Value Case "да" r.Previous.Select Selection.Cut Sheets("Да").Activate Range("A1000").Select Selection.End(xlUp).Offset(1).Select Selection.Insert Shift:=xlDown Sheets("Данные").Activate r.Select Selection.ClearContents Case "нет" r.Previous.Select Selection.Cut Sheets("Нет").Activate Range("A1000").Select Selection.End(xlUp).Offset(1).Select Selection.Insert Shift:=xlDown Sheets("Данные").Activate r.Select Selection.ClearContents End Select Next Range("A1:A23").SpecialCells(xlCellTypeBlanks).Select Selection.Delete Shift:=xlUp End Sub
[/vba] А где кнопочка с тегами для красивых кодов?nilem
Яндекс.Деньги 4100159601573
Сообщение отредактировал nilem - Вторник, 03.01.2012, 14:38
Что за апострофы в начале кода? Они лишние? Их можно удалять?
Code
Sub Перенос2() ' ' Перенос2 макрос '
'
В чем тут ошибка? или я вообще неправильно применил if/then. Их тут нельзя использовать?
Code
Sub Перенос2() ' ' Перенос2 макрос '
' If "B:B" = "Да" Then Range("A1").Select Selection.Cut Sheets("Да").Select Selection.Insert Shift:=xlDown Sheets("Данные").Select Selection.Delete Shift:=xlUp Range("B1").Select Selection.ClearContents End If If "B:B" = "Нет" Then Range("A1").Select Selection.Cut Sheets("Нет").Select Range("A1").Select Selection.Insert Shift:=xlDown Sheets("Данные").Select End If End Sub
[/code]
Что за апострофы в начале кода? Они лишние? Их можно удалять?
Code
Sub Перенос2() ' ' Перенос2 макрос '
'
В чем тут ошибка? или я вообще неправильно применил if/then. Их тут нельзя использовать?
Code
Sub Перенос2() ' ' Перенос2 макрос '
' If "B:B" = "Да" Then Range("A1").Select Selection.Cut Sheets("Да").Select Selection.Insert Shift:=xlDown Sheets("Данные").Select Selection.Delete Shift:=xlUp Range("B1").Select Selection.ClearContents End If If "B:B" = "Нет" Then Range("A1").Select Selection.Cut Sheets("Нет").Select Range("A1").Select Selection.Insert Shift:=xlDown Sheets("Данные").Select End If End Sub
"B:B" = "Да" - это сравнение двух строковых значений. Понятно, что они не равны.
Code
Sub Перенос2() Dim i& With Sheets("Данные") For i = .UsedRange.Rows.Count To 1 Step -1 If .Cells(i, 2).Value = "да" Then .Cells(i, 1).Copy _ Sheets("Да").[a65536].End(xlUp).Offset(1) .Cells(i, 2).EntireRow.Delete ElseIf .Cells(i, 2) = "нет" Then .Cells(i, 1).Copy _ Sheets("Нет").[a65536].End(xlUp).Offset(1) .Cells(i, 2).EntireRow.Delete End If Next End With End Sub
Но быстрей будет автофильтром отбирать и копировать видимые. П. С. здесь: http://www.excelworld.ru/forum/3-511-1 в самом конце первого поста Алексей рассказывает, как радикально побороть кракозябры. То Serge_007: Серег, мож его в самом деле выделить, как советует Андрей в той теме? Народ не замечает.
Quote (light26)
В чем тут ошибка?
"B:B" = "Да" - это сравнение двух строковых значений. Понятно, что они не равны.
Code
Sub Перенос2() Dim i& With Sheets("Данные") For i = .UsedRange.Rows.Count To 1 Step -1 If .Cells(i, 2).Value = "да" Then .Cells(i, 1).Copy _ Sheets("Да").[a65536].End(xlUp).Offset(1) .Cells(i, 2).EntireRow.Delete ElseIf .Cells(i, 2) = "нет" Then .Cells(i, 1).Copy _ Sheets("Нет").[a65536].End(xlUp).Offset(1) .Cells(i, 2).EntireRow.Delete End If Next End With End Sub
Но быстрей будет автофильтром отбирать и копировать видимые. П. С. здесь: http://www.excelworld.ru/forum/3-511-1 в самом конце первого поста Алексей рассказывает, как радикально побороть кракозябры. То Serge_007: Серег, мож его в самом деле выделить, как советует Андрей в той теме? Народ не замечает.KuklP
Ну с НДС и мы чего-то стoим! kuklp60@gmail.com WM Z206653985942, R334086032478, U238399322728
Сообщение отредактировал KuklP - Среда, 04.01.2012, 12:25
Прошел. Синий текст поочередно выделяется желтым маркером. Но понятней от этого мне не стало.
Сделайте так. В левой половине экрана (монитора) отрываем книгу с активным листом Данные, в правой половине - редактор VBE (Project Explorer в редакторе можно закрыть, чтобы не мешал). И теперь пошагово проходим код, наблюдая одновременно изменения, происходящие на листе. Очень наглядно. Предполагалось, что далее будем избавляться от селектов, потом повесим это дело на событие Worksheet_Change и попытаемся использовать массивы. Нумерация строк макроса в посте - не в курсе. Видимо, промежуточный этап. Используйте пока обычные теги для кода.
Quote (light26)
Прошел. Синий текст поочередно выделяется желтым маркером. Но понятней от этого мне не стало.
Сделайте так. В левой половине экрана (монитора) отрываем книгу с активным листом Данные, в правой половине - редактор VBE (Project Explorer в редакторе можно закрыть, чтобы не мешал). И теперь пошагово проходим код, наблюдая одновременно изменения, происходящие на листе. Очень наглядно. Предполагалось, что далее будем избавляться от селектов, потом повесим это дело на событие Worksheet_Change и попытаемся использовать массивы. Нумерация строк макроса в посте - не в курсе. Видимо, промежуточный этап. Используйте пока обычные теги для кода.nilem