Страницы: 1
RSS
Некоторые вопросы по RefEdit
 
Добрый день, уважаемые!  
Столкнулся с RefEdit по необходимости, и что то не могу найти в литературе ответы на свои вопросы, как то скудненько его описывают.  
Вопросы такие:  
1) Можно ли запретить ввод с клавиатуры в поле RefEdit, а выбирать диапазон только через кнопку.  
2) Не могу найти событие которое возникает когда мы уже выбрали диапазон и нажимаем на кнопку что бы вернуться в форму.  
3) Можно ли запретить выбор больше одной ячейки.  
4) Что за событие RefEdit - AfterUpdate - когда оно наступает, никак не могу его словить. (Мне нужно после того как я изменил адрес с помощью RefEdit и вернулся в форму, на форме отобразилась например заливка выбранной ячейки.)  
Если есть какието наброски, буду благодарен, так же если есть полное описание свойств RefEdit, скиньте ссылу плз.
Редко но метко ...
 
1 вопрос:  
Эта процедура запретит ввол любого символа  
Private Sub RefEdit1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)  
       KeyAscii = 0  
   End Sub  
Эта процедура запретит копирование  
   Private Sub RefEdit1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)  
       If KeyCode = vbKeyV And Shift = 2 Then KeyCode = 0  
   End Sub  
2. BeforeUpdate  
3. Думаю только логикой, потому как выделение мышкой осуществляется внутренним кодом Excel. Хотя возможно я ошибаюсь.  
4.  AfterUpdate – это когда редактирование текстового окна завершено пользователем и он нажал Enter. Change в отличии от AfterUpdate откликается на ввод каждого символа.  
А вообще соберите все возможные процедуры событий (с объявлением переменной к примеру) и поставьте  Brakepoint  на  каждой и вы сможете сами отследить все реакции.
 
{quote}{login=VovaK}{date=21.04.2011 09:34}{thema=}{post}1 вопрос:  
2. BeforeUpdate  
4.  AfterUpdate – это когда редактирование текстового окна завершено пользователем и он нажал Enter. Change в отличии от AfterUpdate откликается на ввод каждого символа.  
А вообще соберите все возможные процедуры событий (с объявлением переменной к примеру) и поставьте  Brakepoint  на  каждой и вы сможете сами отследить все реакции.{/post}{/quote}  
Спасибо что откликнулись.  
RE: 2. BeforeUpdate - насколько я понимаю это событие должно срабатывать перед обновлением, а не срабатывает (.  
В том то все и дело, что я собрал все продцедуры, и что бы я не делал не выскакивает ни BeforeUpdate не AfterUpdate. Может я чего не так делаю ?
Редко но метко ...
 
Для наглядности пример.    
В нем нужно при выборе с помощью RefEdit ячейки, на форме отобразилась ее заливка. Не могу придумать на какое событие RefEdit прицепить следующий оператор : Label2.BackColor = Range(RefEdit1.Text).Interior.Color - который сменит цвет лабела на форме ?
Редко но метко ...
 
1) Я сжимаю RefEdit до размеров DropButton и прячу под TextBox, а в него вставляю  текст рефэдит'а.  
3) См. код формы в файле.
 
{quote}{login=С.М.}{date=21.04.2011 10:37}{thema=Re: }{post}1) Я сжимаю RefEdit до размеров DropButton и прячу под TextBox, а в него вставляю  текст рефэдит'а.  
3) См. код формы в файле.{/post}{/quote}  
 
Спасибо за вариант, поэксперементирую.  
Риторический вопрос: почему не сделать в самом Refedite например в свойствах мол, выбирать одну или несколько ячеек (или может я проглядел), и еще таки событие BeforeUpdate у меня не срабатывает, в чем загвоздка не пойму?
Редко но метко ...
 
Событие Change
 
По вопросу № 3. А событие Worksheet_SelectionChange, в котором подсчитывать к-во выделенных ячеек, разве нельзя прикрутить?
 
Попробуйте так, но есть ошибка. Если будете выбирать ячейки через форму - нормально, шелкать сразу по листу - тоже, но чередовать - сбой, RefEdit не очищается и не знаю как это сделать.  
 
Private Sub UserForm_Initialize()  
 RefEdit1 = Selection.Address(0, 0)  
   Label2.BackColor = Range(RefEdit1).Interior.Color  
End Sub  
 
Private Sub RefEdit1_Change()  
   On Error Resume Next  
 RefEdit1 = Range(RefEdit1).Address(0, 0)  
   Label2.BackColor = Range(RefEdit1).Interior.Color  
 
End Sub
 
{quote}{login=VovaK}{date=21.04.2011 11:03}{thema=}{post}Событие Change{/post}{/quote}  
В вашем варианте если выбирать по одной ячейке то работает, а если один раз выбрать несколько ячеек, то уже не все так гладко.
Редко но метко ...
 
Действительно в отличии от textboxa, где BeforeUpdate и AfterUpdate исправно работают в Refedit тишина... Конфуз однако.
 
{quote}{login=Юрий М}{date=21.04.2011 11:06}{thema=}{post}По вопросу № 3. А событие Worksheet_SelectionChange, в котором подсчитывать к-во выделенных ячеек, разве нельзя прикрутить?{/post}{/quote}  
 
Не пробовал. Тоже мысль, единственное как прикрутить вот в чем вопрос ?
Редко но метко ...
 
{quote}{login=VovaK}{date=21.04.2011 11:20}{thema=}{post}Действительно в отличии от textboxa, где BeforeUpdate и AfterUpdate исправно работают в Refedit тишина... Конфуз однако.{/post}{/quote}  
 
И я об этом :)
Редко но метко ...
 
{quote}{login=Igor67}{date=21.04.2011 11:13}{thema=}{post}Попробуйте так, но есть ошибка. Если будете выбирать ячейки через форму - нормально, шелкать сразу по листу - тоже, но чередовать - сбой, RefEdit не очищается и не знаю как это сделать.  
 
Private Sub UserForm_Initialize()  
 RefEdit1 = Selection.Address(0, 0)  
   Label2.BackColor = Range(RefEdit1).Interior.Color  
End Sub  
 
Private Sub RefEdit1_Change()  
   On Error Resume Next  
 RefEdit1 = Range(RefEdit1).Address(0, 0)  
   Label2.BackColor = Range(RefEdit1).Interior.Color  
 
End Sub{/post}{/quote}  
 
Опять же после выделения не одной а нескольких ячеек все сбивается, шо ж за напасть ё-моё.
Редко но метко ...
 
А как Вы хотели? Выделяете несколько ячеек, а у них разная заливка. Какую Excel должен выбрать? Выделяйте по одной.
 
А в чем идея зачем Вам вообще Refedit?
 
> Опять же после выделения не одной а нескольких ячеек все сбивается, шо ж за напасть ё-моё.  
Re:  
А если брать цвет только первой ячейки:  
'  
Private Sub RefEdit1_Change()  
   On Error Resume Next  
   Label2.BackColor = Range(RefEdit1.Text).Cells(1).Interior.Color  
   If Err <> 0 Then Err.Clear  
End Sub  
'  
Private Sub UserForm_Initialize()  
   RefEdit1.Text = ActiveWindow.RangeSelection(1).Address  
   Label2.BackColor = ActiveWindow.RangeSelection(1).Cells(1).Interior.Color  
End Sub
 
{quote}{login=VovaK}{date=21.04.2011 11:45}{thema=}{post}А в чем идея зачем Вам вообще Refedit?{/post}{/quote}  
 
Идея в следующем.  
Имеем форму на которой отображаются чекбоксы с параметрами ячейки (шрифт, выравнивание, заливка и т. д.) , пользователь выбирает ячейку, по идее с помощью Refedit, после выбора на форме должны обновиться эти параметры, потом пользователь выбирает нужные ему чекбоксы, и производит определенные действия над всеми ячейками с нужными ему параметрами (например банально выделяет все ячейки с одинаковой заливкой). Так вот именно в выборе одной ячейки, и передаче в форму адреса именно одной ячейки и загвоздка. Я так понимаю что при выборе более чем одной ячейки в Refedit нужно записать адрес левой верхней и все былобы нормально, но как это сделать, к какому событию приклеть, неужели только к Change, но тогда чекбоксы будут пересчитываться всю дорогу пока юзер будет выделять диапазон. Помоему это не вариант.
Редко но метко ...
 
Ура, йес, прорыв, заработало, вау!  
Долой глючный RefEdit, да здравствует Application.InputBox !!!  
Решилась проблема с выделением больше одной ячейки.  
Пример реализации моей задачи см. в файле.  
Хотелось бы улсышать мнение уважаемых профи, по поводу такого решения.
Редко но метко ...
 
{quote}{login=GIG_ant}{date=22.04.2011 09:22}{thema=Re: }{post}  
Идея в следующем.  
Имеем форму на которой отображаются чекбоксы с параметрами ячейки (шрифт, выравнивание, заливка и т. д.) , пользователь выбирает ячейку, по идее с помощью Refedit, после выбора на форме должны обновиться эти параметры, потом пользователь выбирает нужные ему чекбоксы, и производит определенные действия над всеми ячейками с нужными ему параметрами (например банально выделяет все ячейки с одинаковой заливкой).{/post}{/quote}  
GIG_ant, вот попытался воплотить:
Страницы: 1
Читают тему
Наверх