Excel это не сложно

Основные форумы => Вопросы по Excel и VBA => Тема начата: Valetnina от 12.07.2019, 11:55:39



Название: Положение на листе копируемых с листа на лист кнопок
Отправлено: Valetnina от 12.07.2019, 11:55:39
Здравствуйте.
В приложении файл с кодом, позволяющим копировать кнопки с листа Sheet_Source на лист Sheet_Target приверно в то же место, где они находятся в листе изначальном. Для этого, перед вставкой кнопки, используется строка кода
Код: (vb)
                    Application.Goto reference:=LWt_Worksheet_Target.Range(LSh_Button_Shape.TopLeftCell.Address), scroll:=True
                   LWt_Worksheet_Target.Paste
.
С существующим кодом точность попадания почти неудовлетворительная.Кто-нибудь может помочь ее улучшить ?


Название: Re:Положение на листе копируемых с листа на лист кнопок
Отправлено: vikttur от 12.07.2019, 19:35:31
И много таких кнопок? Может быть, есть смысл пойти другим путем? Какова конечная цель? Кнопки для чего?


Название: Re:Положение на листе копируемых с листа на лист кнопок
Отправлено: Valetnina от 12.07.2019, 21:18:53
Vikktur, спасибо за вопрос. Да, кнопок может быть много (3-10). И после копирования листа через ctrl+A / ctrl+C / ctrl + V  в новом листе оказываются иногда скопированы не все кнопки.


Название: Re:Положение на листе копируемых с листа на лист кнопок
Отправлено: Valetnina от 12.07.2019, 21:19:57
Нашла более точное решение : через свойства .Top и .Left. Ниже код полностью, может кому будет полезен :
Код: (vb)
Sub V_Sub_Buttons_Copy()

Dim LSh_Button_Source As Shape
Dim LO_Button_Target As Object
Dim LWt_Worksheet_Source As Worksheet
Dim LWt_Worksheet_Target As Worksheet
Dim LS_Shape_Source_TopLeftCell_Address As String
Dim LL_Shape_Source_Top_Position As Long
Dim LL_Shape_Source_Left_Position As Long
Dim LS_Button_Name As String
Dim LC_Comment_Number As Long

Set LWt_Worksheet_Target = Application.Worksheets("Sheet_Target")
Set LWt_Worksheet_Source = Application.Worksheets("Sheet_Source")

'Application.ScreenUpdating = false
For Each LSh_Button_Source In LWt_Worksheet_Target.Shapes
        LSh_Button_Source.Delete
Next LSh_Button_Source 'In LWt_Worksheet_Target.Shapes

Debug.Print "Number of Shapes in Sheet_Source : " & LWt_Worksheet_Source.Shapes.Count
Debug.Print "Number of Shapes in Sheet_Target blank : " & LWt_Worksheet_Target.Shapes.Count
LC_Comment_Number = 0
For Each LSh_Button_Source In LWt_Worksheet_Source.Shapes
'            LWt_Worksheet_Source.Activate
'    Debug.Print LSh_Button_Source.TopLeftCell.Address
    LS_Button_Name = LSh_Button_Source.Name
        If Not LS_Button_Name Like "Comment*" Then
           
        LSh_Button_Source.Copy
            LS_Shape_Source_TopLeftCell_Address = LSh_Button_Source.TopLeftCell.Address
            LL_Shape_Source_Top_Position = LSh_Button_Source.Top
            LL_Shape_Source_Left_Position = LSh_Button_Source.Left
'            Debug.Print LSh_Button_Source.Name & " Top= " & LL_Shape_Source_Top_Position & " Left = " & LL_Shape_Source_Left_Position
                       
    '                    Application.Goto reference:=LWt_Worksheet_Target.Range(LSh_Button_Source.TopLeftCell.Address, LL_Shape_Source_Top_Position), scroll:=True
    '                    Stop
                            LWt_Worksheet_Target.Activate
                            LWt_Worksheet_Target.Paste
                           
                           Set LO_Button_Target = Selection
                            LO_Button_Target.Top = LL_Shape_Source_Top_Position
                            LO_Button_Target.Left = LL_Shape_Source_Left_Position
'            Debug.Print LO_Button_Target.Name & " Top= " & LL_Shape_Source_Top_Position & " Left = " & LL_Shape_Source_Left_Position
                           
    Else
        LC_Comment_Number = 1 + LC_Comment_Number
    End If 'f Not LS_Button_Name Like "Comment*" Then
        Next LSh_Button_Source
       
Debug.Print "Number of Comments (Comments are the Shapes not to be copied) : " & LC_Comment_Number
Debug.Print "Number of Shapes in Sheet_Source : "; LWt_Worksheet_Source.Shapes.Count
Debug.Print "Number of Shapes in Sheet_Target after the Sub execution : " & LWt_Worksheet_Target.Shapes.Count
'Application.ScreenUpdating = True

End Sub 'V_Sub_Buttons_Copy


Название: Re:Положение на листе копируемых с листа на лист кнопок
Отправлено: vikttur от 12.07.2019, 21:54:05
Какова конечная цель? Кнопки для чего?
Спасибо сказали, но ответить забыли. Хотя, если Вам не интересны другие возможные варианты, то и ответы не нужны


Название: Re:Положение на листе копируемых с листа на лист кнопок
Отправлено: Valetnina от 17.07.2019, 18:08:36
Для чего кнопки ? Разные цели у них : пересчет данных на листе, перевод  листа в защищенный режим и обратно, вызов польз.форм, отправка пользовательской версии файла эл.сообщением и тому подобное.


Название: Re:Положение на листе копируемых с листа на лист кнопок
Отправлено: vikttur от 17.07.2019, 20:44:54
Понятно. Были подозрения, что кнопки для одинаковых операций в разных диапазонах.
В Вашем случае имеет смысл разместить все это на форме. Вызывать форму или одной кнопкой на листе, или событием листа (например, двойной клик на ячейке в шапке таблицы). Кнопки формы будут активировать макросы для активного листа