Страницы: 1
RSS
Запуск макроса по событию в форме
 
Пытаюсь сделать макрос по перемещению ячеек на строку вверх/вниз.  
Если жать на кнопку ОК все работает, но хочу найти событие:(  
Изменение Spinbutton не запускает процедуру, только меняет значение (или не правильно Ф1 понял).  
При этом попытка прописать запуск на изменение TextBox тоже не дает результата. Не ловит программное изменение :(.
 
Я бы написал код примерно в таком виде:  
 
 
Sub MoveRange(ByVal k As Integer)  
   Dim altRng As Range, newRng As Range  
   Set altRng = Application.Evaluate(Me.RefEdit1.Value)  
   If altRng Is Nothing Then MsgBox "Вы не указали диапазон!", 48, "Ошибка": Exit Sub  
   If altRng.Rows.Count > 1 Then MsgBox "Вы указали диапазон! А нужно строку!", 48, "Ошибка": Exit Sub  
 
   Set newRng = altRng.Offset(k)  
   altRng.Copy  
   newRng.Insert Shift:=xlDown  
   altRng.Delete Shift:=xlUp  
 
   newRng.Offset(-1).Select  
   Me.RefEdit1.Value = Selection.Address(, , , -1)  
   SpinButton1.Value = 0  
End Sub  
 
 
Private Sub SpinButton1_SpinDown()  
   MsgBox "Перемещение ячеек вниз"  
   ' MoveRange -1  
End Sub  
 
Private Sub SpinButton1_SpinUp()  
   MsgBox "Перемещение ячеек вверх"  
   'MoveRange 2  
End Sub  
 
Private Sub UserForm_Initialize()  
   Me.RefEdit1.Value = Selection.Address  
End Sub
 
И вообще, я бы реализовал это без формы - назначил бы 2 макроса на клавиатурные комбинации    
(типа как в Ворде - комбинации Alt + Shift + стрелка вверх\вниз перемещают выделенные абзацы текста)
 
EducatedFool, если правильно понял  
MoveRange(ByVal k As Integer) - в модуль  
 
а так должен запускаться макрос с параметром при изменении SpinButton1  
Private Sub SpinButton1_SpinUp()  
MsgBox "Перемещение ячеек вверх"  
MoveRange 2  
End Sub  
 
Но не получается у меня:((  
MsgBox получаю, а перемещение нет.  
Что делаю неправильно?  
---------  
2 The_Prist, задумка поменять данные, буду посмотреть вариант, пока не понял...
 
2 The_Prist, думаю вариант с перемещением данных на строку выше/ниже, т.е. изменение порядка следования данных:(
 
Игорь, посмотрите, устроит ли приложенный вариант.  
Перемещать можно как одну, так и несколько строк.
 
{quote}{login=ZVI}{date=11.10.2009 04:41}{thema=}{post}Игорь, посмотрите, устроит ли приложенный вариант.  
Перемещать можно как одну, так и несколько строк.{/post}{/quote}  
 
Уважаемый ZVI. ваш макрос мне очень интересен. я так понимаю ячейки тут перемещаются. а можно ли сделать чтобы копировались? дело в том, что если на перемещаемые ячейки сделать ссылки то после перемещения они становятся некорректными. ну т.е. ссылка тоже изменяется. а нужно чтоб оставалась как и была.
 
{quote}{login=ZVI}{date=11.10.2009 04:41}{thema=}{post}Игорь, посмотрите, устроит ли приложенный вариант.  
Перемещать можно как одну, так и несколько строк.{/post}{/quote}  
 
------------------  
Это то, что не смог решить сам. Буду смотреть и учиться дальше:))
 
2 EducatedFool, оказывается Ваш код должен быть в форме?  
С помощью ZVI  нашел почему он не запускался. 2 события конфликтовали между собой и Do Events помогло убрать ошибку.  
 
-------------  
2 ZVI боюсь что погорячился когда написал что постараюсь понять Ваш код. Все кажется расписано, но почему так - принимаю просто на веру.  
PS Еще с момента Вашей первой адресной помощи http://www.planetaexcel.ru/forum.php?thread_id=2154 периодически пытаюсь воспроизвести нечто подобное.  
Понимаю что идет контроль события листа, вот где то так мне и надо. Но пока :((  
--------  
Большое спасибо Всем за примеры. Это моя первая форма:))
 
{quote}{login=Petr}{date=11.10.2009 07:51}{thema=Re: }{post}  
Уважаемый ZVI. ваш макрос мне очень интересен. я так понимаю ячейки тут перемещаются. а можно ли сделать чтобы копировались? дело в том, что если на перемещаемые ячейки сделать ссылки то после перемещения они становятся некорректными. ну т.е. ссылка тоже изменяется. а нужно чтоб оставалась как и была.{/post}{/quote}  
Приложен вариант, в котором адреса зависимых ссылок не меняются.
 
{quote}{login=ZVI}{date=11.10.2009 07:40}{thema=Shift_Range_01.xls}{post}{quote}{login=Petr}{date=11.10.2009 07:51}{thema=Re: }{post}  
Уважаемый ZVI. ваш макрос мне очень интересен. я так понимаю ячейки тут перемещаются. а можно ли сделать чтобы копировались? дело в том, что если на перемещаемые ячейки сделать ссылки то после перемещения они становятся некорректными. ну т.е. ссылка тоже изменяется. а нужно чтоб оставалась как и была.{/post}{/quote}  
Приложен вариант, в котором адреса зависимых ссылок не меняются.{/post}{/quote}  
 
спасибо))
 
{quote}{login=Igor67}{date=11.10.2009 11:03}{thema=}{post}  
...  
2 ZVI боюсь что погорячился когда написал что постараюсь понять Ваш код.  
Все кажется расписано, но почему так - принимаю просто на веру.  
... Это моя первая форма:)){/post}{/quote}  
Игорь, поздравляю с первой формой, непростую же Вы её себе выбрали для первого случая :-)  
Конфликт RefEdit-а с добавлением ячеек был совсем не очевиден.    
 
----  
Чтобы проще понять смысл манипуляций, можно сначала позабыть про VBA и посмотреть, как поступает Excel со ссылками в формулах при вставке и при переносе ячеек.  
 
1. Поведение формул в Excel  
 
1.1 Предположим, есть 2 ячейки A4 и A5, между которыми мы собираемся  добавить пустую строку. Пусть также формула в E4 будет =A4 , а формула в E4 будет =A5  
 
1.2 Выделяем ячейку A5, нажимаем правую кнопку мышки  и выбираем "Добавить ячейки" жмем OK. A4 остается на месте (формула в E4 не меняется), бывшая A5 перемещается в A6 (формула в E5 меняется на =A6), а в A5 добавляется новая ячейка.  
 
1.3. Если теперь, например, перенести (Вырезать – Скопировать или просто перетащить мышкой) ячейку A4 в A5, то ссылки на неё также переместится: формула в E4 теперь станет =A5  
 
----  
В VBA происходит то же самое. Предположим, что мы будем выполнять действия п.п.1.2 и 1.3 с помощью кода, и не станем заморачиваться, как это делается (можно подсмотреть код макрорекодера), а рассмотрим лишь последствия для VBA-переменных:  
 
2. Поведение переменных в VBA  
 
2.1. Вернемся в ситуацию п.1.1 и предположим, есть 2 ячейки A4 и A5, между которыми мы собираемся  добавить пустую строку. Пусть в коде будут переменные, ссылающиеся на A4 и на A5:  
Set Rng1 = Range("A4")  
Set Rng2 = Range("A5")  
' А это - переменные изначальных адресов Rng1 и Rng2  
Addr1 = Rng1.Address(0,0)  
Addr2 = Rng2.Address(0,0)  
 
2.2. Будем считать, что кодом мы сделали то же, что и в п. 1.2. Посмотрим, что получится с переменными:  
Debug.Print Rng1.Address(0,0) выдаст  A4, адрес ссылки не изменился аналогично формуле E4  
Debug.Print Rng2.Address(0,0) выдаст  A6, адрес ссылки изменился аналогично формуле E5  
Debug.Print Addr1 выдаст E4 - адрес не изменился (он и не будет больше меняться)  
Debug.Print Addr2 выдаст E5 - адрес не изменился, в отличие от Rng2.Address(0,0)    
 
2.3. Выполнив кодом перенос ячейки A4 в A5, получим:  
Debug.Print Rng1.Address(0,0) выдаст  A5, адрес ссылки изменился аналогично формуле E4  
Debug.Print Rng2.Address(0,0) выдаст  A6, адрес ссылки не изменился аналогично формуле E5  
Debug.Print Addr1 выдаст E4 - адрес не изменился, в отличие от Rng1.Address(0,0)    
Debug.Print Addr2 выдаст E5 - адрес, как и ожидалось, не изменился    
 
----  
Вывод: ссылки на диапазоны ячеек в VBA ведут себя аналогично ссылкам на эти же диапазоны в ячейках.  
Поэтому алгоритм манипуляции с переменными в коде можно продумать и без VBA, выполняя эти манипуляции сначала с ячейками и анализируя, что происходит со ссылками на перемещаемые ячейки.  
 
Удачных Вам форм и содержаний!
Страницы: 1
Наверх