Макрос размещает на листе рисунки. Макрос в плане порядка отображения этих размещаемых объектов - действует так : какой прямоугольник первым размещен - тот стоит позади всех, а тот который последним размещен - тот впереди всех.
Как разместить объекты - в соответствии с индексом отображения (записанным в строке "8") ?
В начале строки 8 - есть ячейка с числом. Чем выше число - тем выше порядок ее отображения. Допустим в строке 8 - есть три ячейки с индексами 0,1,2. Впереди всех - будут стоять фигуры из строки с индексом 2. Ниже них - фигуры из строки с индексом 1. Ну и нулевые а затем и отрицательные значения (типа "-5") - самые последние в порядке отображения.
Форумчане, помогите решить вопрос.
Макрос размещает на листе рисунки. Макрос в плане порядка отображения этих размещаемых объектов - действует так : какой прямоугольник первым размещен - тот стоит позади всех, а тот который последним размещен - тот впереди всех.
Как разместить объекты - в соответствии с индексом отображения (записанным в строке "8") ?
В начале строки 8 - есть ячейка с числом. Чем выше число - тем выше порядок ее отображения. Допустим в строке 8 - есть три ячейки с индексами 0,1,2. Впереди всех - будут стоять фигуры из строки с индексом 2. Ниже них - фигуры из строки с индексом 1. Ну и нулевые а затем и отрицательные значения (типа "-5") - самые последние в порядке отображения.ВасилисаЛукьянчикова
ВасилисаЛукьянчикова, Добавьте сортировку, и всё будет ок. [vba]
Код
Sub Макрос1()
Dim lastcol& Dim Shps() Dim sp As Shape
lastcol = Cells(2, Columns.Count).End(xlToLeft).Column ReDim Shps(1 To lastcol - 1) For i = 1 To lastcol - 1 Set Shps(i) = Cells(1, i + 1).Resize(8) Next i Call sort1(Shps) For i = 1 To lastcol - 1 Set sp = ActiveSheet.Shapes.AddShape(msoShapeRectangle, Shps(i)(2, 1), Shps(i)(3, 1), Shps(i)(5, 1), Shps(i)(6, 1)) With sp.Fill .Visible = msoTrue .ForeColor.RGB = Shps(i)(7, 1).Interior.Color .Transparency = 0 End With
Next i End Sub Function sort1(Arr1 As Variant) As Variant Dim tmp For i = 1 To UBound(Arr1) For j = 1 To UBound(Arr1) - 1 If (Arr1(j)(8, 1) > Arr1(j + 1)(8, 1)) Then tmp = Arr1(j)(8, 1) Arr1(j)(8, 1) = Arr1(j + 1)(8, 1) Arr1(j + 1)(8, 1) = tmp End If Next j Next i sort1 = Arr1 End Function
[/vba]
ВасилисаЛукьянчикова, Добавьте сортировку, и всё будет ок. [vba]
Код
Sub Макрос1()
Dim lastcol& Dim Shps() Dim sp As Shape
lastcol = Cells(2, Columns.Count).End(xlToLeft).Column ReDim Shps(1 To lastcol - 1) For i = 1 To lastcol - 1 Set Shps(i) = Cells(1, i + 1).Resize(8) Next i Call sort1(Shps) For i = 1 To lastcol - 1 Set sp = ActiveSheet.Shapes.AddShape(msoShapeRectangle, Shps(i)(2, 1), Shps(i)(3, 1), Shps(i)(5, 1), Shps(i)(6, 1)) With sp.Fill .Visible = msoTrue .ForeColor.RGB = Shps(i)(7, 1).Interior.Color .Transparency = 0 End With
Next i End Sub Function sort1(Arr1 As Variant) As Variant Dim tmp For i = 1 To UBound(Arr1) For j = 1 To UBound(Arr1) - 1 If (Arr1(j)(8, 1) > Arr1(j + 1)(8, 1)) Then tmp = Arr1(j)(8, 1) Arr1(j)(8, 1) = Arr1(j + 1)(8, 1) Arr1(j + 1)(8, 1) = tmp End If Next j Next i sort1 = Arr1 End Function
Roman777, нет - на листе - ничего сортировать не надо. Поскольку данные в ячейках - обновляются из других источников. Если вы их отсортируете - значит данные будут обновляться - не в тех ячейках.
Речь идет о том, чтобы назначить объектам уровень видимости - в соответствии с индексом отображения (записанным в строке "8").
Roman777, нет - на листе - ничего сортировать не надо. Поскольку данные в ячейках - обновляются из других источников. Если вы их отсортируете - значит данные будут обновляться - не в тех ячейках.
Речь идет о том, чтобы назначить объектам уровень видимости - в соответствии с индексом отображения (записанным в строке "8").ВасилисаЛукьянчикова
ВасилисаЛукьянчикова, На листе ничего и не сортируется. Ваши данные для создание шейпов записываются в массив, в котором они сортируются по значению в 8й строке и уже по порядку из этого массива рисуются... Так и получается уровень перекрытия одного объекта другим.
ВасилисаЛукьянчикова, На листе ничего и не сортируется. Ваши данные для создание шейпов записываются в массив, в котором они сортируются по значению в 8й строке и уже по порядку из этого массива рисуются... Так и получается уровень перекрытия одного объекта другим.Roman777
в котором они сортируются по значению в 8й строке и уже по порядку из этого массива рисуются
Так смысл-то тогда какой у этой сортировки, если индекс отображения присваивается в итоге - не тем фигурам ?
Вот я присваиваю для столбца C (который рисует красный прямоугольник) - индекс "20". То есть самый большой из всех. По идее данный прямоугольник - должен быть поверх всех прочих фигур.
Но ваш код в результате сортировки - смещает этот индекс - куда-то в конец восьмой строки. А столбцу C - макрос таким образом самостоятельно присваивает индекс "6".
И этот прямоугольник, который вроде бы должен отображаться поверх всех остальных - после этой сортировки отображается на заднем плане.
в котором они сортируются по значению в 8й строке и уже по порядку из этого массива рисуются
Так смысл-то тогда какой у этой сортировки, если индекс отображения присваивается в итоге - не тем фигурам ?
Вот я присваиваю для столбца C (который рисует красный прямоугольник) - индекс "20". То есть самый большой из всех. По идее данный прямоугольник - должен быть поверх всех прочих фигур.
Но ваш код в результате сортировки - смещает этот индекс - куда-то в конец восьмой строки. А столбцу C - макрос таким образом самостоятельно присваивает индекс "6".
И этот прямоугольник, который вроде бы должен отображаться поверх всех остальных - после этой сортировки отображается на заднем плане.ВасилисаЛукьянчикова
ВасилисаЛукьянчикова, вот теперь вижу, действительно я лапухнулся с функцией...). Замените её на эту: [vba]
Код
Function sort1(Arr1 As Variant) Dim tmp For i = 1 To UBound(Arr1) For j = 1 To UBound(Arr1) - 1 If (Arr1(j)(8, 1) > Arr1(j + 1)(8, 1)) Then Set tmp = Arr1(j) Set Arr1(j) = Arr1(j + 1) Set Arr1(j + 1) = tmp End If Next j Next i sort1 = Arr1 End Function
[/vba] [p.s.] спать бежал...[/p.s.]
ВасилисаЛукьянчикова, вот теперь вижу, действительно я лапухнулся с функцией...). Замените её на эту: [vba]
Код
Function sort1(Arr1 As Variant) Dim tmp For i = 1 To UBound(Arr1) For j = 1 To UBound(Arr1) - 1 If (Arr1(j)(8, 1) > Arr1(j + 1)(8, 1)) Then Set tmp = Arr1(j) Set Arr1(j) = Arr1(j + 1) Set Arr1(j + 1) = tmp End If Next j Next i sort1 = Arr1 End Function