Доброго дня. Помогите с решением непростого вопроса.
У меня есть макрос. Суть его в том, что он выписывает в столбец P5:P20 - названия тех фигур, которые пересекает луч (бесконечная прямая). Луч задается отрезком по координатам, представленным в таблице L4:M5.
Посоветуйте - как изменить макрос, чтобы он определял названия фигур, которые пересекает не луч, а сам отрезок ? [vba]
Код
Option Explicit Private shp As Shape, sh As Shape, s$, k#, a#, x#, y#, ok As Boolean, x1#, x2#, y1#, y2#
Sub Линия1() 'Dim shp As Shape, sh As Shape, s$, k#, a#, x#, y#, ok As Boolean, x1#, x2#, y1#, y2# s = Empty Range("P5:P33").ClearContents Dim i&
x1 = Range("L4"): y1 = Range("M4") x2 = Range("L5"): y2 = Range("M5") k = (y2 - y1) / (x2 - x1): a = y1 - k * x1 Set shp = ActiveSheet.Shapes.AddLine(x1, y1, x2, y2) shp.Line.EndArrowheadStyle = msoArrowheadTriangle shp.Line.Weight = 2 shp.Line.ForeColor.RGB = RGB(255, 0, 0) For Each sh In ActiveSheet.Shapes If sh.Name <> shp.Name Then x = sh.Left: y = k * x + a: ok = IsBetween(y, sh.Top, sh.Top + sh.Height) If Not ok Then x = sh.Left + sh.Width: y = k * x + a: ok = IsBetween(y, sh.Top, sh.Top + sh.Height) If Not ok Then y = sh.Top: x = (a - y) / k: ok = IsBetween(x, sh.Left, sh.Left + sh.Width) If Not ok Then y = sh.Top + sh.Height: x = (a - y) / k: ok = IsBetween(x, sh.Left, sh.Left + sh.Width) If ok Then s = s & vbLf & sh.Name
End If Next 'MsgBox shp.Name & " intersect next:" & vbLf & s, , "Look at this" 'Range("P5:P10").Value = Application.Transpose(s) 'Debug.Print s
Function IsBetween(x#, x1#, x2#) IsBetween = x >= x1 And x <= x2 End Function
Sub Delete1() shp.Delete Range("P5:P33").ClearContents ActiveSheet.Calculate End Sub
[/vba]
Доброго дня. Помогите с решением непростого вопроса.
У меня есть макрос. Суть его в том, что он выписывает в столбец P5:P20 - названия тех фигур, которые пересекает луч (бесконечная прямая). Луч задается отрезком по координатам, представленным в таблице L4:M5.
Посоветуйте - как изменить макрос, чтобы он определял названия фигур, которые пересекает не луч, а сам отрезок ? [vba]
Код
Option Explicit Private shp As Shape, sh As Shape, s$, k#, a#, x#, y#, ok As Boolean, x1#, x2#, y1#, y2#
Sub Линия1() 'Dim shp As Shape, sh As Shape, s$, k#, a#, x#, y#, ok As Boolean, x1#, x2#, y1#, y2# s = Empty Range("P5:P33").ClearContents Dim i&
x1 = Range("L4"): y1 = Range("M4") x2 = Range("L5"): y2 = Range("M5") k = (y2 - y1) / (x2 - x1): a = y1 - k * x1 Set shp = ActiveSheet.Shapes.AddLine(x1, y1, x2, y2) shp.Line.EndArrowheadStyle = msoArrowheadTriangle shp.Line.Weight = 2 shp.Line.ForeColor.RGB = RGB(255, 0, 0) For Each sh In ActiveSheet.Shapes If sh.Name <> shp.Name Then x = sh.Left: y = k * x + a: ok = IsBetween(y, sh.Top, sh.Top + sh.Height) If Not ok Then x = sh.Left + sh.Width: y = k * x + a: ok = IsBetween(y, sh.Top, sh.Top + sh.Height) If Not ok Then y = sh.Top: x = (a - y) / k: ok = IsBetween(x, sh.Left, sh.Left + sh.Width) If Not ok Then y = sh.Top + sh.Height: x = (a - y) / k: ok = IsBetween(x, sh.Left, sh.Left + sh.Width) If ok Then s = s & vbLf & sh.Name
End If Next 'MsgBox shp.Name & " intersect next:" & vbLf & s, , "Look at this" 'Range("P5:P10").Value = Application.Transpose(s) 'Debug.Print s