Добрый день. Помогите выполнить алгоритм в экселе с помощью VBA.
Сперва на листе экселя есть только три зеленые точки треугольника - в виде числовых величин (это исходные данные).
Нужно заполнить область внутри этого треугольника - усредненными значениями.
1) Определяются средние арифметические - в серединах сторон треугольника (желтые ячейки)
2) Затем от этих желтых точек проводятся линии к другим известным точкам и определяются усредненные значения уже там (оранжевые ячейки).
3) Аналогичным образом проводимых линий становится все больше и определяются все усредненные значения внутри внутри области треугольника.
Алгоритм примерно такой:
Сперва на листе экселя есть только три зеленые точки треугольника - в виде числовых величин (это исходные данные).
Нужно заполнить область внутри этого треугольника - усредненными значениями.
1) Определяются средние арифметические - в серединах сторон треугольника (желтые ячейки)
2) Затем от этих желтых точек проводятся линии к другим известным точкам и определяются усредненные значения уже там (оранжевые ячейки).
3) Аналогичным образом проводимых линий становится все больше и определяются все усредненные значения внутри внутри области треугольника.
Алгоритм примерно такой:
Код |
---|
Sub TEST() Dim RngA As Range, RngB As Range, RngC As Range Dim Ax#, Ay#, Bx#, By#, Cx#, Cy# Sheets.Add Cells.RowHeight = 12.75 Cells.ColumnWidth = 2.29 Set RngA = Cells(13, 17) Set RngB = Cells(10, 32) Set RngC = Cells(21, 29) RngA.Interior.Color = vbGreen: RngA.Value = 12 RngB.Interior.Color = vbGreen: RngB.Value = 35 RngC.Interior.Color = vbGreen: RngC.Value = -8 Ax = (RngA.Left + RngA.Offset(0, 1).Left) / 2 Ay = (RngA.Top + RngA.Offset(1, 0).Top) / 2 Bx = (RngB.Left + RngB.Offset(0, 1).Left) / 2 By = (RngB.Top + RngB.Offset(1, 0).Top) / 2 Cx = (RngC.Left + RngC.Offset(0, 1).Left) / 2 Cy = (RngC.Top + RngC.Offset(1, 0).Top) / 2 With ActiveSheet.Shapes .AddConnector(msoConnectorStraight, Ax, Ay, Bx, By).Select .AddConnector(msoConnectorStraight, Bx, By, Cx, Cy).Select .AddConnector(msoConnectorStraight, Cx, Cy, Ax, Ay).Select End With Call CentrOtrezka(Ax, Ay, Bx, By, RngA.Value, RngB.Value) Call CentrOtrezka(Bx, By, Cx, Cy, RngB.Value, RngC.Value) Call CentrOtrezka(Cx, Cy, Ax, Ay, RngC.Value, RngA.Value) End Sub Sub CentrOtrezka(x1#, y1#, x2#, y2#, v1&, v2&) Dim x#, y# x = (x1 + x2) / 2 y = (y1 + y2) / 2 With ActiveSheet.Shapes.AddLine(x, y, x, y) .TopLeftCell.Select .Delete End With Selection.Interior.Color = vbYellow Selection.Value = CLng((v1 + v2) / 2) End Sub |