Вопрос или проблема
Из-за этой проблемы с изменением размера объектов ActiveX я не группирую свои объекты ActiveX в своей таблице Excel. Группировка их вызывает мой хак решения, который не работает, что довольно раздражает.
Однако я часто хочу иметь возможность, по сути, использовать мышь для выделения области, а затем выбирать все объекты ActiveX, содержащиеся в этой области. Это также будет полезно для легкого выбора объектов для их первоначальной группировки.
В общем:
- Используйте мышь для выбора области
- Автоматически выберите все компоненты ActiveX в области
Я не против решения на VBA, если это необходимо.
Как я могу это сделать?
Рассмотрите:
Sub ShapePicker()
Dim sh As Shape, st As Variant, Llist As String
Dim ty As String
Dim nm As String
Dim r As Range
Dim ary As Variant
For Each sh In ActiveSheet.Shapes
ty = sh.Type
nm = sh.name
Set r = sh.TopLeftCell
If ty = msoOLEControlObject Then
If Not Intersect(r, Selection) Is Nothing Then
If Llist = "" Then
Llist = nm
Else
Llist = Llist & "," & nm
End If
End If
End If
Next sh
ary = Split(Llist, ",")
ActiveSheet.Shapes.Range((ary)).Select
End Sub
Ответ или решение
Чтобы выбрать все объекты ActiveX в определённой области (регионе) в Excel с использованием мыши, можно воспользоваться языком программирования VBA. Рассмотрим, как это сделать, применяя приведённый код и развивая его с учётом особенностей работы с ActiveX объектами.
Когда вы работаете с ActiveX элементами в Excel, важно понимать, что они могут изменять свой размер и поведение в зависимости от установленных свойств. Подход с использованием VBA позволяет легко выбирать несколько объектов без необходимости группировать их, что может привести к другим проблемам.
Основные шаги решения задачи
- Определение области выбора. Вы можете использовать мышь для выделения области на листе в Excel.
- Поиск всех ActiveX объектов внутри выбранной области. Код будет проходить по всем объектам на листе и проверять, находятся ли они в пределах указанной области.
- Выделение найденных объектов. Если объекты найдены, они будут выделены и готовы к дальнейшим действиям, таким как группировка.
Пример кода на VBA
Вот пример кода, который выполняет задачи, описанные выше:
Sub SelectActiveXObjectsInRange()
Dim sh As Shape
Dim selectedShapes As String
Dim targetRange As Range
Dim area As Range
' Сохраняем выделенную область
Set targetRange = Selection
' Перебираем все формы на активном листе
For Each sh In ActiveSheet.Shapes
' Проверяем, является ли объект ActiveX
If sh.Type = msoOLEControlObject Then
' Устанавливаем область, которая включает объект
Set area = sh.TopLeftCell
' Проверяем пересечение с выделенной областью
If Not Intersect(targetRange, area) Is Nothing Then
' Добавляем имя формы в список
If selectedShapes = "" Then
selectedShapes = sh.Name
Else
selectedShapes = selectedShapes & "," & sh.Name
End If
End If
End If
Next sh
' Если были найдены подходящие формы, выделяем их
If selectedShapes <> "" Then
Dim shapeArray As Variant
shapeArray = Split(selectedShapes, ",")
ActiveSheet.Shapes.Range(shapeArray).Select
Else
MsgBox "Нет объектов ActiveX в выделенной области.", vbInformation
End If
End Sub
Как использовать данный код
- Откройте редактор VBA. В Excel нажмите
Alt + F11
, чтобы открыть редактор Visual Basic for Applications. - Создайте новый модуль. В меню слева щелкните правой кнопкой мыши на
VBAProject
, затем выберитеInsert
>Module
. - Вставьте код. Скопируйте приведённый выше код и вставьте его в открывшееся окно модуля.
- Запустите макрос. Вернитесь в Excel, выделите область с помощью мыши и запустите макрос, нажав
Alt + F8
, выберитеSelectActiveXObjectsInRange
и нажмитеRun
.
Заключение
Этот код позволяет эффективно находить и выделять все ActiveX объекты внутри выбранного диапазона на листе Excel. Как IT-эксперт, вы можете дополнить его дополнительными функциями, такими как распределение объектов, изменение их свойств и другие административные операции. Использование данного подхода помогает избежать проблем с изменением размеров и улучшает взаимодействие с элементами управления на листе.