Страницы: 1
RSS
Преобразование макроса Если в Цикл и определение исходной ячейки
 
Тема такая, есть таблица (см. вложение), в которой находятся блоки идентичные друг другу через одинаковое друг от друга расстояние.
Написал макрос чтобы он копировал блок, в котором находится активная ячейка, со смещением вниз на 132 строки (не спрашвайте зачем 132, так надо просто).
Групп блоков всего 7 (поэтому и прописано соответствующее кол-во условий If). Суть в том, что макрос высчитывает активную ячейку, прибавляет к ней 132 и, если номер строки будет больше 920, макрос должен остановиться.
Ну так вот, макрос вроде делает все как надо, но я хотел бы добавить в него чтобы он возвращался в исходную ячейку (потому что можно запустить макрос не с 1 блока, а, допустим, с 7-8 итд), с которой начал. Ни как не соображу как это сделать.
Еще я хотел сделать цикл (чтобы макрос не был таким огромным), но не получилось что-то... Может есть у кого какие идеи?
Файл прикладываю.

А вот макрос:
Код
'Этой функцией вычисляю в каком именованом диапазоне находится активная ячейка
Function arnm(cell As Range) As String
Dim x
On Error Resume Next
For Each x In Application.Names
If Intersect(x.RefersToRange, cell) Is Nothing Then
Else
arnm = arnm & x.Name & " "
End If
Next
arnm = Trim(arnm)
End Function

'Здесь вычисляю активную ячейку
Private Sub stat()
Dim s
s = arnm(Cells(ActiveCell.Row, ActiveCell.Column))
Range(s).Select
End Sub

'Эта функция при нажатии на кнопку запускает макрос заполнения
Private Sub cmbutton_Click()
stat
Selection.Copy
acr = ActiveCell.Row + 132

'Здесь описываю что делать при ошибке
On Error GoTo Err_Handler

'А тут начинается перечисление условий
If acr < 920 Then
ActiveCell.Offset(132, 0).Select
stat
ActiveSheet.Paste
acr = ActiveCell.Row + 132

If acr < 920 Then
ActiveCell.Offset(132, 0).Select
stat
ActiveSheet.Paste
acr = ActiveCell.Row + 132

If acr < 920 Then
ActiveCell.Offset(132, 0).Select
stat
ActiveSheet.Paste
acr = ActiveCell.Row + 132

If acr < 920 Then
ActiveCell.Offset(132, 0).Select
stat
ActiveSheet.Paste
acr = ActiveCell.Row + 132

If acr < 920 Then
ActiveCell.Offset(132, 0).Select
stat
ActiveSheet.Paste
acr = ActiveCell.Row + 132

If acr < 920 Then
ActiveCell.Offset(132, 0).Select
stat
ActiveSheet.Paste
Application.CutCopyMode = False
Else
Application.CutCopyMode = False
Cells(ActiveCell.Row, ActiveCell.Column).Select
Exit Sub
End If
End If
End If
End If
End If
End If


Err_Handler:
Application.CutCopyMode = False
Cells(ActiveCell.Row, ActiveCell.Column).Select
Exit Sub

Cells(ActiveCell.Row, ActiveCell.Column).Select
End Sub
 
Цитата
Cells(ActiveCell.Row, ActiveCell.Column).Select
Зачем такая конструкция, если активная ячейка и так выделена?
 
В конце функции это добавлено для того чтобы с диапазона выделенного последнего снималось выделение.
 
Цитата
andrey062006 пишет: чтобы с диапазона выделенного последнего снималось выделение.
А зачем его выделять?
 
Ну да, надо заменить Range(s).Select на Range(s).Copy
Но суть вопроса то не в этом же)))
 
А в чём суть? И Вам правильно сказал Kuzmich по поводу активной ячейки: если нужно запомнить её адрес, то присвойте переменной её адрес:
Код
Переменная = activecell.address
 
А если Вы не будете использовать Select'ы, то и запоминать ничего не нужно
Также не могу понять, зачем многократно проверять одно и то же условие и что-то выделять:

Код
 If acr < 920 Then
ActiveCell.Offset(132, 0).Select
 
Цитата
Юрий М пишет: зачем многократно проверять одно и то же условие и что-то выделять
А как сделать чтобы не проверять?
Я хотел цикл сделать но не получилось(
Может быть подскажете как сделать лучше?
 
Если так..
 
это не совсем то, что нужно, макрос должен вычислить в каком диапазоне находится активная ячейка, скопировать его и вставить в другой диапазон который находится на 132 строки ниже, при чем не только в следующий диапазон, который ниже текущего на 132 строки, но и в следующие диапазоны, каждый из которых смещается на 132 строки, но не дальше чем 920 строка
Изменено: andrey062006 - 24.01.2015 18:43:15
 
Попробуйте так:

Код
Sub Макрос1()
stat
  n = 1
  Do
    acr = ActiveCell.Row + 132 * n
        Selection.Copy Cells(acr, 2)
        n = n + 1
  Loop While acr < 920
 
Ваша конструкция Cells(ActiveCell.Row, ActiveCell.Column) это просто ActiveCell
 
Дурна задачка
Код
Sub Мяв()
    Dim aRange As Range, aCell As Range
    Dim nm As Name
    Set aCell = ActiveCell
    Do While aCell.Row < 920 'aCell.Offset(132).Row < 920
        For Each nm In Application.Names
            If Not Intersect(nm.RefersToRange, aCell) Is Nothing Then
                Set aRange = Range(nm)
            End If
        Next
        If aRange Is Nothing Then Exit Sub
        Set aCell = Cells(aRange.Offset(132).Row, 2)
        aRange.Copy aCell
    Loop
End Sub
 
Kuzmich, Ваш макрос хорош, но он получается только 1 раз проверяет, входит ли, смещенная на 132 строки, ячейка в именованный диапазон или нет, а дальше просто штампует без проверки на вхождение в именованный диапазон. А мне нужно чтобы он именно проверял каждый раз входит ли ячейка, куда будут вставляться данные в хоть какой-то диапазон...

RAN, Ваш макрос почему то у меня не сработал(
 
Если правильно понял задачу..
 
Маугли, ну да, супер! То что нужно) Спасибо! А как сделать чтобы она не по маске zzz+1 искала а просто по вхождению в диапазон? Или тут фишка именно в том что все блоки в диспетчере имен проименованны по порядку?

Попробовал присвоить кнопке формы, не получилось. Форма запускается с параметром (ByVal Target As Range, Cancel As Boolean) по клику на листе, а при клике на кнопку такое прописать не дает((((((((((((
Изменено: andrey062006 - 26.01.2015 17:59:10
 
Если у Вас одна вкладка, то вместо target Activecell
 
Маугли, тогда она смещается на 2 строки почему то + выходит на ошибку...
 
У меня не смещается..
Обычно я решаю, когда у меня что-то не получается )
Это интересней и заводит.
 
Маугли, да, не смещается, я извиняюсь, у себя ошибку нашел. Спасибо ОГРОМНОЕ за макрос!)
Изменено: andrey062006 - 01.02.2015 13:49:23
 
Маугли, а можно как то ограничить вручную количество диапазонов, в которые копируются, ну допустим я хочу скопировать первый диапазон первого блока в 1 диапазон второго и третьего блока, а в четвертый блок мне уже не надо копировать. Я допустим ставлю в ячейку значение сколько диапазонов мне нужно заполнить вперед и макрос заполняет и останавливается...
Просто в Вашем коде нет обсчета блоков, а идет смещение при копирование каждый раз на 5 диапазонов вниз...
 
Попробуйте так..
 
Маугли, ОГРОМНЕЙШЕЕ спасибо!
Страницы: 1
Наверх