Страницы: 1
RSS
Работа с автофигурами в VBA.
 
Работа с автофигурами в ВБА  
посмотрите пожалуста на код и если можете дайте совет по оптимизации, просто в структуре:  
If nom <> ActiveSheet.Shapes("autoforma1").Name Then  
ActiveSheet.Shapes("autoforma1").Rotation = 0  
End If  
строчку ActiveSheet.Shapes("autoforma1").Name можно на чтото заменить? ато кажетча что пишу 2 раза имя автофигуры. есть какоето генерическое имя для автофигур кроме того что мы ему присвоем?    
 
Код:  
Sub Rote_Autoforma1()  
Call Reset("autoforma1")  
   If ActiveSheet.Shapes("autoforma1").Rotation = 180 Then  
       ActiveSheet.Shapes("autoforma1").Rotation = 0  
   Else  
       ActiveSheet.Shapes("autoforma1").Rotation = 180  
   End If  
End Sub  
 
Sub Rote_Autoforma2()  
Call Reset("autoforma2")  
   If ActiveSheet.Shapes("autoforma2").Rotation = 180 Then  
       ActiveSheet.Shapes("autoforma2").Rotation = 0  
   Else  
       ActiveSheet.Shapes("autoforma2").Rotation = 180  
   End If  
End Sub  
 
Sub Rote_Autoforma3()  
Call Reset("autoforma3")  
   If ActiveSheet.Shapes("autoforma3").Rotation = 180 Then  
       ActiveSheet.Shapes("autoforma3").Rotation = 0  
   Else  
       ActiveSheet.Shapes("autoforma3").Rotation = 180  
   End If  
End Sub  
 
Sub Reset(nom As String)  
If nom <> ActiveSheet.Shapes("autoforma1").Name Then  
ActiveSheet.Shapes("autoforma1").Rotation = 0  
End If  
If nom <> ActiveSheet.Shapes("autoforma2").Name Then  
ActiveSheet.Shapes("autoforma2").Rotation = 0  
End If  
If nom <> ActiveSheet.Shapes("autoforma3").Name Then  
ActiveSheet.Shapes("autoforma3").Rotation = 0  
End If  
End Sub
 
Про "генерическое" имя ничего сказать не могу :-) Наверное, это просто трудности с русским. Ничего страшного. А вот так попробуйте:  
Sub Rote_AutoShape2()  
   With ActiveSheet.Shapes("AutoShape 2")  
       If .Rotation = 180 Then  
           .Rotation = 0  
       Else  
           .Rotation = 180  
       End If  
   End With  
End Sub
 
{quote}{login=Юрий М}{date=24.03.2011 08:09}{thema=}{post}Про "генерическое" имя ничего сказать не могу :-) Наверное, это просто трудности с русским. Ничего страшного. А вот так попробуйте:  
Sub Rote_AutoShape2()  
   With ActiveSheet.Shapes("AutoShape 2")  
       If .Rotation = 180 Then  
           .Rotation = 0  
       Else  
           .Rotation = 180  
       End If  
   End With  
End Sub{/post}{/quote}  
 
спасибо за подсказку, но так уже сделал.  
проблема у меня с Ресет: там много лишнего кода.  
скажем что когда обращаешься к листу всегда можно написать его имя: лист1.селл или шеет("имя листа1 измененное пользователем"), думал можно так с авто-формами, если можно было пробегать все авто-формы на листике, без писать их имя... чтобы убрать тону ИФ что у меня там есть.
 
а    
 
For Each s In ActiveSheet.Shapes  
...  
Next s  
 
или по индексу - Shapes.Item(i) ?  
 
не поможет?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
ЛеСагра, у Вас явно проблемы с формулировками.    
"пишу 2 раза имя автофигуры" - я и сделал вывод, что от этого нужно избавиться. А вот теперь оказывается, что нужно ПЕРЕБРАТЬ все автофигуры на листе... Постарайтесь точнее формулировать.
 
Воспользуйтесь советом ikki:  
Sub Reset()  
Dim x As Shape 'Range  
  For Each x In ActiveSheet.Shapes  
     With x  
       If .Rotation = 180 Then  
          .Rotation = 0  
       Else  
          .Rotation = 180  
       End If  
     End With  
  Next
 
Кручу-верчу.
 
Что-то не очень вертится-крутится :-) А зачем там вообще остальные процедуры? Достаточно одной, приведённой выше.
 
If nom <> Ц.Name Then  
ActiveSheet.Shapes("autoforma1").Rotation = 0  
End If  
в 1й строчке пишу. взять авто-фигуру autoforma1 пойти в ее свойство имя... тоесть 2 раза я прошёлся по ..Name, 1й рас как ее выбирал и 2й рас как сравниваю. вот и спрашивал существует ли другая форма обращается к авто-форме. в вашем примере вы мне показываете как избавится повторения ActiveSheet.Shapes("autoforma1") в каждом из макросов для авто-фигур, я просил обратит внимание именно на строки кода:    
If nom <> ActiveSheet.Shapes("autoforma1").Name Then  
ActiveSheet.Shapes("autoforma1").Rotation = 0  
End If  
чтобы оптимизировать процедуру Ресет, вот ikki это понял и предложил как через фор пройти все авто-фигуры, вы мне с этим написали пример, Большое вам спасибо.
 
Она, конечно, крутит, да не так.
 
:-) Я вот о чём - можно всё одной процедурой.
 
{quote}{login=Юрий М}{date=25.03.2011 12:02}{thema=}{post}:-) Я вот о чём - можно всё одной процедурой.{/post}{/quote}  
Я думаю что короче этого уже дальше некуда :))  
 
 
а вот если все усложнить и сказать что, та по которой клацаем пусть перевернется на 180º(на +180º к актуальному положению, тоесть если она стоит в 0º то после клика станет в 180, и наоборот), а остальные на 270º
 
Одной не сумел. А было бы любопытно посмотреть.
 
{quote}{login=Юрий М}{date=25.03.2011 12:02}{thema=}{post}:-) Я вот о чём - можно всё одной процедурой.{/post}{/quote}  
они скачут все, а нужно только ту на которую клацаеш. на ту на которую клацаеш крутится (на 180º) а остальные становятся в изначальное положение(0º)
 
{quote}{login=ЛеСагра}{date=25.03.2011 12:25}{thema=Re: }{post}{quote}{login=Юрий М}{date=25.03.2011 12:02}{thema=}{post}{/post}{/quote}они скачут все, а нужно только ту на которую клацаеш. {/post}{/quote}  
А где Вы об этом раньше говорили? Покажите мне.
 
{quote}{login=Юрий М}{date=25.03.2011 12:37}{thema=Re: Re: }{post}{quote}{login=ЛеСагра}{date=25.03.2011 12:25}{thema=Re: }{post}{quote}{login=Юрий М}{date=25.03.2011 12:02}{thema=}{post}{/post}{/quote}они скачут все, а нужно только ту на которую клацаеш. {/post}{/quote}  
А где Вы об этом раньше говорили? Покажите мне.{/post}{/quote}  
нигде, но в изначальном моем файле они так делают.
 
Вот в том и дело, что "нигде". См. пример - будет вращаться только та автофигура, по которой кликнули. И опять всего одна процедура.
 
Спасибо ребята, не ламайте над eтим голову. С тем что вы подсказали хватит с головой. СПАСИБО.  
кому не лень - загляните сюда: http://www.planetaexcel.ru/forum.php?thread_id=25856
 
ЛеСагра, посмотрите мой последний файл. Так хотели?
 
{quote}{login=Юрий М}{date=25.03.2011 12:42}{thema=}{post}Вот в том и дело, что "нигде". См. пример - будет вращаться только та автофигура, по которой кликнули. И опять всего одна процедура.{/post}{/quote}  
 
 
у вас тоже авто-фигуры поварачиваются в разные стороны, почему? ведь в ВБА 270º всегра одинаковы... я ошибаюсь?  
 
Sub Reset()  
Dim x As Shape, iName As String  
iName = Application.Caller  
   For Each x In ActiveSheet.Shapes  
       With x  
           If x.Name = iName Then  
               If .Rotation = 180 Then  
                   .Rotation = 0  
               Else  
                   .Rotation = 180  
               End If  
           Else  
               .Rotation = 270  
           End If  
       End With  
   Next  
End Sub
 
{quote}{login=Юрий М}{date=25.03.2011 12:43}{thema=}{post}ЛеСагра, посмотрите мой последний файл. Так хотели?{/post}{/quote}  
 
да так, все правельно вы поняли.
Страницы: 1
Читают тему
Наверх