Как получить ширину и высоту фигуры в Excel для использования в формулах?
Как получить ширину и высоту фигуры в Excel
Основным способом получения ширины и высоты фигуры в Excel является программирование на VBA, поскольку Excel не предоставляет встроенных функций рабочего листа для прямого доступа к размерам фигур. Наиболее распространенный подход включает создание пользовательских функций (UDF) в VBA, которые затем можно использовать в формулах рабочего листа.
Содержание
- Методы VBA для размеров фигур
- Создание UDF-функций для использования в формулах
- Альтернативные подходы
- Распространенные проблемы и решения
- Практические примеры
Методы VBA для размеров фигур
Excel предоставляет несколько свойств и методов VBA для доступа к размерам фигур. Основными свойствами являются:
Базовые свойства фигур:
Shape.Width- Возвращает ширину фигуры в пунктахShape.Height- Возвращает высоту фигуры в пунктах
Пример кода 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-функции
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-функция с преобразованием единиц
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")- Высота в дюймах
Альтернативные подходы
Использование ссылок на ячейки для позиции и размера фигуры
Некоторые пользователи создали обходные пути, связывая позиции фигур с позициями ячеек:
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
Динамическое изменение размера фигур на основе значений ячеек
Вы можете создавать фигуры, размер которых динамически изменяется в зависимости от значений ячеек:
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:
Function PointsToColumnWidth(points As Double) As Double
' Это приближение - вам нужно откалибровать это для вашей системы
PointsToColumnWidth = points * 0.13 ' Пример коэффициента преобразования
End Function
Проблема 2: Получение точных размеров фигур
Проблема: Пользователи сообщают о проблемах с получением точных размеров фигур, особенно при попытке установить точные размеры, такие как 12x12 пунктов источник.
Решение: Используйте следующий подход для обеспечения точного размера:
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-функции могут не работать, когда макросы отключены источник.
Решение:
- Сохраните вашу рабочую книгу как Книгу Excel с поддержкой макросов (.xlsm)
- Включите макросы при открытии файла
- Рассмотрите возможность использования надстроек COM Excel в качестве альтернативного решения
Практические примеры
Пример 1: Создание динамического дашборда
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: Калькулятор площади фигуры
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: Условное форматирование на основе размера фигуры
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 дюйма. Вам потребуется преобразовать эти единицы измерения, если вам нужны измерения в сантиметрах, дюймах или других единицах для ваших формул.
Источники
- How to auto change shape size based on specified cell value in Excel? - ExtendOffice
- How to change the size of a shape based on Cell width - Stack Overflow
- Show dimensions of Excel shape in column widths and row heights vba - Stack Overflow
- Shape.GetHeight method (Publisher) | Microsoft Learn
- How can I get the width/height of a shape? - Stack Overflow
- Shape.Width property (Excel) | Microsoft Learn
- VBA - Shape Height/Width - How to anchor shape - Reddit
- Size cell to fit shape - Excel Forum
- Retrieving the Actual Size of a Shape - MrExcel Message Board
- Trying to adjust size of shapes in VBA script but cannot get to size precisely - Stack Overflow
Заключение
Получение значений ширины и высоты фигур в Excel для использования в формулах требует программирования на VBA, поскольку для этой цели нет встроенных функций рабочего листа. Ключевые выводы:
-
Используйте UDF-функции VBA для создания пользовательских формул, которые могут обращаться к свойствам фигур, таким как
.Widthи.Height, которые возвращают значения в пунктах. -
Правильно обрабатывайте преобразования единиц измерения, поскольку Excel измеряет фигуры в пунктах (1/72 дюйма), в то время как пользователям часто нужны сантиметры или дюймы для вычислений.
-
Учитывайте последствия безопасности макросов - ваша рабочая книга должна быть сохранена как .xlsm, а макросы должны быть включены для работы UDF-функций.
-
Решайте проблемы точности с помощью правильных методов VBA, таких как
LockAspectRatio = msoFalseперед установкой точных размеров. -
Понимайте взаимосвязь между фигурами и ячейками - хотя фигуры можно позиционировать относительно ячеек, их изменение размера не следует простой линейной зависимости от ширин столбцов.
Реализуя эти решения VBA, вы можете эффективно интегрировать размеры фигур в свои формулы Excel и создавать динамические, отзывчивые таблицы, которые реагируют на свойства фигур.