НейроАгент

Excel VBA: Получение размеров фигур для формул

Освойте Excel VBA для получения ширины и высоты фигур для динамических формул. Создавайте пользовательские функции UDF, которые обращаются к свойствам фигур и интегрируют их в ваши таблицы. Полное руководство с практическими примерами.

Как получить ширину и высоту фигуры в Excel для использования в формулах?

НейроАгент

Как получить ширину и высоту фигуры в Excel

Основным способом получения ширины и высоты фигуры в Excel является программирование на VBA, поскольку Excel не предоставляет встроенных функций рабочего листа для прямого доступа к размерам фигур. Наиболее распространенный подход включает создание пользовательских функций (UDF) в VBA, которые затем можно использовать в формулах рабочего листа.

Содержание

Методы VBA для размеров фигур

Excel предоставляет несколько свойств и методов VBA для доступа к размерам фигур. Основными свойствами являются:

Базовые свойства фигур:

  • Shape.Width - Возвращает ширину фигуры в пунктах
  • Shape.Height - Возвращает высоту фигуры в пунктах

Пример кода VBA для получения размеров фигуры:

vba
Sub GetShapeDimensions()
    Dim sh As Shape
    Set sh = ActiveSheet.Shapes("Rectangle 1")
    
    Debug.Print "Ширина: " & sh.Width & " пунктов"
    Debug.Print "Высота: " & sh.Height & " пунктов"
End Sub

Расширенные методы:

  • GetWidth(Unit As MsoMeasurementUnit) - Возвращает ширину в указанных единицах измерения
  • GetHeight(Unit As MsoMeasurementUnit) - Возвращает высоту в указанных единицах измерения

Эти методы позволяют указать единицы измерения, такие как пункты, сантиметры, дюймы или пиксели для измерения источник.

Создание UDF-функций для использования в формулах

Для использования размеров фигур в формулах рабочего листа необходимо создать пользовательские функции (UDF) в VBA. Вот наиболее распространенные подходы:

Базовые UDF-функции

vba
Function GetShapeWidth(shapeName As String) As Double
    On Error Resume Next
    GetShapeWidth = ActiveSheet.Shapes(shapeName).Width
    On Error GoTo 0
End Function

Function GetShapeHeight(shapeName As String) As Double
    On Error Resume Next
    GetShapeHeight = ActiveSheet.Shapes(shapeName).Height
    On Error GoTo 0
End Function

Использование в формулах:

  • =GetShapeWidth("Rectangle 1") - Возвращает ширину в пунктах
  • =GetShapeHeight("Circle 1") - Возвращает высоту в пунктах

Расширенная UDF-функция с преобразованием единиц

vba
Function GetShapeSize(shapeName As String, dimension As String, Optional unit As String = "pt") As Double
    Dim sh As Shape
    On Error Resume Next
    Set sh = ActiveSheet.Shapes(shapeName)
    
    If sh Is Nothing Then
        GetShapeSize = 0
        Exit Function
    End If
    
    Select Case LCase(unit)
        Case "cm"
            If LCase(dimension) = "width" Then
                GetShapeSize = sh.Width / 28.3464567 ' Преобразование пунктов в см
            ElseIf LCase(dimension) = "height" Then
                GetShapeSize = sh.Height / 28.3464567 ' Преобразование пунктов в см
            End If
        Case "in"
            If LCase(dimension) = "width" Then
                GetShapeSize = sh.Width / 72 ' Преобразование пунктов в дюймы
            ElseIf LCase(dimension) = "height" Then
                GetShapeSize = sh.Height / 72 ' Преобразование пунктов в дюймы
            End If
        Case Else ' По умолчанию в пунктах
            If LCase(dimension) = "width" Then
                GetShapeSize = sh.Width
            ElseIf LCase(dimension) = "height" Then
                GetShapeSize = sh.Height
            End If
    End Select
    On Error GoTo 0
End Function

Примеры использования:

  • =GetShapeSize("Rectangle 1", "width") - Ширина в пунктах
  • =GetShapeSize("Rectangle 1", "width", "cm") - Ширина в сантиметрах
  • =GetShapeSize("Rectangle 1", "height", "in") - Высота в дюймах

Альтернативные подходы

Использование ссылок на ячейки для позиции и размера фигуры

Некоторые пользователи создали обходные пути, связывая позиции фигур с позициями ячеек:

vba
Function GetShapePositionInfo(shapeName As String) As String
    Dim sh As Shape
    On Error Resume Next
    Set sh = ActiveSheet.Shapes(shapeName)
    
    If sh Is Nothing Then
        GetShapePositionInfo = "Фигура не найдена"
        Exit Function
    End If
    
    GetShapePositionInfo = "Ширина: " & sh.Width & " пт, Высота: " & sh.Height & " пт" & _
                          " | Слева: " & sh.Left & " пт, Сверху: " & sh.Top & " пт"
    On Error GoTo 0
End Function

Динамическое изменение размера фигур на основе значений ячеек

Вы можете создавать фигуры, размер которых динамически изменяется в зависимости от значений ячеек:

vba
Sub SizeCircle(Name As String, Diameter)
    Dim xCenterX As Single
    Dim xCenterY As Single
    Dim xCircle As Shape
    Dim xDiameter As Single
    
    On Error GoTo ExitSub
    xDiameter = Diameter
    
    If xDiameter > 10 Then xDiameter = 10
    If xDiameter < 1 Then xDiameter = 1
    
    Set xCircle = ActiveSheet.Shapes(Name)
    With xCircle
        xCenterX = .Left + (.Width / 2)
        xCenterY = .Top + (.Height / 2)
        .Width = Application.CentimetersToPoints(xDiameter)
        .Height = Application.CentimetersToPoints(xDiameter)
        .Left = xCenterX - (.Width / 2)
        .Top = xCenterY - (.Height / 2)
    End With
    
ExitSub:
End Sub

Распространенные проблемы и решения

Проблема 1: Проблемы соотношения ширины фигуры и ячейки

Проблема: Ширины столбцов Excel не имеют фиксированного соотношения с ширинами фигур. Отношение между шириной фигуры и шириной столбца ячейки описывает кривая, а не прямая линия источник.

Решение: Используйте эмпирическое тестирование для установления коэффициентов преобразования для ваших конкретных настроек Excel:

vba
Function PointsToColumnWidth(points As Double) As Double
    ' Это приближение - вам нужно откалибровать это для вашей системы
    PointsToColumnWidth = points * 0.13 ' Пример коэффициента преобразования
End Function

Проблема 2: Получение точных размеров фигур

Проблема: Пользователи сообщают о проблемах с получением точных размеров фигур, особенно при попытке установить точные размеры, такие как 12x12 пунктов источник.

Решение: Используйте следующий подход для обеспечения точного размера:

vba
Sub SetPreciseShapeSize()
    Dim sh As Shape
    For Each sh In ActiveSheet.Shapes
        sh.LockAspectRatio = msoFalse
        sh.Height = 12
        sh.Width = 12
        sh.Placement = xlMove
        sh.LockAspectRatio = msoTrue
    Next sh
End Sub

Проблема 3: Безопасность макросов и отключенный функционал

Проблема: UDF-функции могут не работать, когда макросы отключены источник.

Решение:

  1. Сохраните вашу рабочую книгу как Книгу Excel с поддержкой макросов (.xlsm)
  2. Включите макросы при открытии файла
  3. Рассмотрите возможность использования надстроек COM Excel в качестве альтернативного решения

Практические примеры

Пример 1: Создание динамического дашборда

vba
Function GetDashboardMetrics() As Variant
    Dim metrics(1 To 4) As Double
    Dim statusShape As Shape
    
    On Error Resume Next
    Set statusShape = ActiveSheet.Shapes("StatusIndicator")
    
    If Not statusShape Is Nothing Then
        metrics(1) = statusShape.Width ' Ширина в пунктах
        metrics(2) = statusShape.Height ' Высота в пунктах
        metrics(3) = statusShape.Left / 72 ' Позиция слева в дюймах
        metrics(4) = statusShape.Top / 72 ' Позиция сверху в дюймах
    End If
    
    GetDashboardMetrics = metrics
    On Error GoTo 0
End Function

Пример 2: Калькулятор площади фигуры

vba
Function CalculateShapeArea(shapeName As String) As Double
    Dim sh As Shape
    On Error Resume Next
    Set sh = ActiveSheet.Shapes(shapeName)
    
    If sh Is Nothing Then
        CalculateShapeArea = 0
        Exit Function
    End If
    
    CalculateShapeArea = sh.Width * sh.Height / 144 ' Преобразование в квадратные дюймы
    On Error GoTo 0
End Function

Пример 3: Условное форматирование на основе размера фигуры

vba
Sub CheckShapeSizes()
    Dim sh As Shape
    Dim outputRange As Range
    
    Set outputRange = Range("A1:A10")
    outputRange.ClearContents
    
    For Each sh In ActiveSheet.Shapes
        outputRange.Cells(1, 1).Value = sh.Name
        outputRange.Cells(1, 2).Value = sh.Width
        outputRange.Cells(1, 3).Value = sh.Height
        outputRange.Cells(1, 4).Value = sh.Width * sh.Height
        
        Set outputRange = outputRange.Offset(1, 0)
    Next sh
End Sub

Помните, что все размеры фигур по умолчанию возвращаются в пунктах, где 1 пункт = 1/72 дюйма. Вам потребуется преобразовать эти единицы измерения, если вам нужны измерения в сантиметрах, дюймах или других единицах для ваших формул.

Источники

  1. How to auto change shape size based on specified cell value in Excel? - ExtendOffice
  2. How to change the size of a shape based on Cell width - Stack Overflow
  3. Show dimensions of Excel shape in column widths and row heights vba - Stack Overflow
  4. Shape.GetHeight method (Publisher) | Microsoft Learn
  5. How can I get the width/height of a shape? - Stack Overflow
  6. Shape.Width property (Excel) | Microsoft Learn
  7. VBA - Shape Height/Width - How to anchor shape - Reddit
  8. Size cell to fit shape - Excel Forum
  9. Retrieving the Actual Size of a Shape - MrExcel Message Board
  10. Trying to adjust size of shapes in VBA script but cannot get to size precisely - Stack Overflow

Заключение

Получение значений ширины и высоты фигур в Excel для использования в формулах требует программирования на VBA, поскольку для этой цели нет встроенных функций рабочего листа. Ключевые выводы:

  1. Используйте UDF-функции VBA для создания пользовательских формул, которые могут обращаться к свойствам фигур, таким как .Width и .Height, которые возвращают значения в пунктах.

  2. Правильно обрабатывайте преобразования единиц измерения, поскольку Excel измеряет фигуры в пунктах (1/72 дюйма), в то время как пользователям часто нужны сантиметры или дюймы для вычислений.

  3. Учитывайте последствия безопасности макросов - ваша рабочая книга должна быть сохранена как .xlsm, а макросы должны быть включены для работы UDF-функций.

  4. Решайте проблемы точности с помощью правильных методов VBA, таких как LockAspectRatio = msoFalse перед установкой точных размеров.

  5. Понимайте взаимосвязь между фигурами и ячейками - хотя фигуры можно позиционировать относительно ячеек, их изменение размера не следует простой линейной зависимости от ширин столбцов.

Реализуя эти решения VBA, вы можете эффективно интегрировать размеры фигур в свои формулы Excel и создавать динамические, отзывчивые таблицы, которые реагируют на свойства фигур.