Страницы: 1
RSS
Коллекция элементов управления рабочего листа
 
Добрый вечер(день)!  
Возник следующий вопрос. Имеется рабочий лист с некоторым количеством элементов управления на нем. В ходе выполнения макроса vba элементы меняют свое местоположение. Задача заключается в том, чтобы после выполнения программы вернуть все контролы на свое первоначальное место.    
Для этого я решил с помощью цикла for...each перед началом выполнения программы сохранить свойство left каждого элемента в массив, а после аналогичным способом присвоить их обратно.    
Начал так  
For each ctl in Лист11.controls  
CLeft(n) = ctl.left  
n = n +1  
Next    
 
Однако обнаружилось, что у листа такой коллекции не имеется. Как решить проблему? Неужели придется присваивать свойство каждого элемента по отдельности? Хотелось бы более красивое решение.  
 
И еще попутный вопрос.    
Чтобы сослаться на листбокс рабочего листа приходится делать так  
Лист11.ListBox1  
А хотелось бы вот так  
Sheets("ACTUAL").ListBox1  
Но так не получается  
Поведуйте пожалуйста, в чем разница между такими записями?
 
Sub КонтролыНаЛисте()  
Dim x As OLEObject  
   For Each x In ActiveSheet.OLEObjects  
       MsgBox x.Name & " слева " & x.Left  
   Next  
End Sub
 
Если я Вас понял правильно, то речь идет об элементах ActiveX. Если они внедрены непосредственно на лист, то обращаться к ним немного сложнее чем к элементам на форме. Все они являются объектами, вот к примеру команда создания ComboBox на листе:    
 
Set oleObj = Me.OLEObjects.Add( _  
           ClassType:="Forms.ComboBox.1", Left:=Target.Left, _  
           Top:=Target.Top, Width:=Target.Width, Height:=HeightOfString)  
Полагаю можно их опросить циклом, но вот вопрос: как вы собираетесь обратиться к каждому и присвоить по сути уникальное значение .Left не зная их имени (.Name)? Задача усложнится в разы, если вы в процессе выполнения Вашей процедуры удаляете и создаете элементы заново.  
 
Совет: если вы создаете элементы, то не удаляйте их а меняйте размер до 0 или используйте свойство .Visible. При создании элемента присваивайте ему имя, чтобы затем иметь возможность обатиться к нему.    
 
Собственно все, что я могу сказать Вам не видя Вашего проекта.
 
{quote}{login=Юрий М}{date=18.07.2011 08:23}{thema=}{post}Sub КонтролыНаЛисте()  
Dim x As OLEObject  
   For Each x In ActiveSheet.OLEObjects  
       MsgBox x.Name & " слева " & x.Left  
   Next  
End Sub{/post}{/quote}спасибо, возьму на заметку. OLE-OLE ; )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Юрий М, спасибо, теперь все работает так как и хотелось!  
Vovak, у меня в проекте все проще, уже имеется необходимые контролы на листе, необходимо лишь спозиционировать их циклом. Спасибо Вам за развернутый ответ и за совет, всегда интересовался как создавать элементы во время выполнения программы))
 
{quote}{login=adiodas}{date=18.07.2011 08:05}{thema=Коллекция элементов управления рабочего листа}{post}И еще попутный вопрос.    
Чтобы сослаться на листбокс рабочего листа приходится делать так  
Лист11.ListBox1  
А хотелось бы вот так  
Sheets("ACTUAL").ListBox1  
Но так не получается{/post}{/quote}  
Почему не получается?  
Sub Test()  
Sheets("Лист1").TextBox1.Value = "Test"  
End Sub
 
Действительно работает. Странно, видимо я что-то перепутал))
Страницы: 1
Читают тему
Loading...