Проверьте, находится ли объект в пределах диапазона ячеек - PullRequest
0 голосов
/ 11 апреля 2019

Я строю интерактивный расчет в Excel.Пользователь переместит изображение и нажмет кнопку расчета.Если изображение находится в пределах определенного диапазона ячеек, то диапазон («c2») должен идентифицировать, в каком диапазоне находится объект (имеется только 4 области, они представляют собой квадраты года, Q1, Q2, Q3 И Q4. Q1 находится в пределах e1: j14) enter image description here

Мне уже удалось переместить объект через VBA, но я не могу проверить, в каком диапазоне он находится:

ActiveSheet.Shapes("Grupo 24").Top = ActiveSheet.Range("B5").Offset(0, 4).Top
ActiveSheet.Shapes("Grupo 24").Left = ActiveSheet.Range("B5").Offset(3, 4).Left

Приведенный выше VBA переместит объект в положение (изображение выше) справа от ячейки ("E5"), но я не могу проверить, находится ли изображение внутри ("E1: J14").

Когда я пытаюсь проверить, как тест, я получаю сообщение об ошибке: Ошибка 13 несовместимых типов:

If ActiveSheet.Shapes("Grupo 24").Top = ActiveSheet.Range("e1:j14") Then
 MsgBox ("Within")
 Else
 MsgBox ("Outside")

 End If

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 11 апреля 2019

Предположим, что мы уже присвоили блокам Names quad1 , quad2 , quad3 и quad4 ячеек:

enter image description here

Мы определяем, какая ячейка связана с Shape, а затем перебираем блоки, чтобы найти, в каком блоке находится ячейка:

Sub quadFinder()
    Dim s As Shape, r As Range, i As Long

    Set s = ActiveSheet.Shapes("Grupo 24")
    Set r = s.TopLeftCell

    For i = 1 To 4
        If Not Intersect(r, Range("quad" & i)) Is Nothing Then
            MsgBox quad & i
            Exit Sub
        End If
    Next i

    MsgBox "not in a quad"
End Sub
1 голос
/ 11 апреля 2019

Ниже вы можете увидеть пример того, что вы могли бы сделать:

Dim horizontalAxis As Boolean
Dim verticalAxis As Boolean
Dim sht As Worksheet
Dim testRng As Range

Set sht = ThisWorkbook.Worksheets("Sheet3")
Set testRng = sht.Range("N1:S22")

horizontalAxis = sht.Shapes("Rectangle 1").Left >= testRng.Left And sht.Shapes("Rectangle 1").Left + sht.Shapes("Rectangle 1").Width <= testRng.Left + testRng.Width
Debug.Print horizontalAxis
verticalAxis = sht.Shapes("Rectangle 1").Top + sht.Shapes("Rectangle 1").Height <= testRng.Height
Debug.Print verticalAxis 
Debug.Print horizontalAxis And verticalAxis 

В демонстрационных целях я использую прямоугольник и случайный диапазон.

Приведенный выше код проверяет, является ли форма строго внутри диапазона. Наименьшее перекрытие с соседним диапазоном вернет false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...