Уважаемые знатоки! В VBA не силен, но возникла необходимость разбираться в "чужих" листингах :(. Прошу помочь в решении следующей задачи: 26 автофигур с определенной прозрачностью (ячейки AK9:AK34) - назовем их "старые данные". Ежемесячно появляются данные об изменении прозрачности (заносятся в ячейки AM9:AM34) - "новые данные". Макросом "Значение_приобретения1" заносятся значения из AM в AK. Решил "облегчить" макрос - получилось (Дай Бог Здоровья _Boroda_!)? но "прозрачность слетела :(" Что хотелось бы получить? В Идеале: Данные из вне заносятся в ячейки AK9:AK34 и прозрачность меняется автоматом. Пробовал разными способами (УВЫ не получилось :() Хотя бы так: Данные из вне заносятся в AM9:AM34 и макросом переносятся в AK9:AK34 с изменением прозрачности. Файл прилагаю. Заранее благодарен.
Уважаемые знатоки! В VBA не силен, но возникла необходимость разбираться в "чужих" листингах :(. Прошу помочь в решении следующей задачи: 26 автофигур с определенной прозрачностью (ячейки AK9:AK34) - назовем их "старые данные". Ежемесячно появляются данные об изменении прозрачности (заносятся в ячейки AM9:AM34) - "новые данные". Макросом "Значение_приобретения1" заносятся значения из AM в AK. Решил "облегчить" макрос - получилось (Дай Бог Здоровья _Boroda_!)? но "прозрачность слетела :(" Что хотелось бы получить? В Идеале: Данные из вне заносятся в ячейки AK9:AK34 и прозрачность меняется автоматом. Пробовал разными способами (УВЫ не получилось :() Хотя бы так: Данные из вне заносятся в AM9:AM34 и макросом переносятся в AK9:AK34 с изменением прозрачности. Файл прилагаю. Заранее благодарен.mkotik
Private Sub Worksheet_Change(ByVal Target As Range) Dim d_ As Range, d1_ As Range Set d_ = Intersect(Range("ak9:ak34"), Target) If Not d_ Is Nothing Then For Each d1_ In d_ With ActiveSheet.Shapes(d1_.Row - 8).Fill Select Case d1_.Value Case Is < 15 .Transparency = 0.92 Case Is < 20 .Transparency = 0.74 Case Is < 50 .Transparency = 0.52 Case Else .Transparency = 0.37 End Select End With Next d1_ End If End Sub
[/vba]
Так нужно?
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim d_ As Range, d1_ As Range Set d_ = Intersect(Range("ak9:ak34"), Target) If Not d_ Is Nothing Then For Each d1_ In d_ With ActiveSheet.Shapes(d1_.Row - 8).Fill Select Case d1_.Value Case Is < 15 .Transparency = 0.92 Case Is < 20 .Transparency = 0.74 Case Is < 50 .Transparency = 0.52 Case Else .Transparency = 0.37 End Select End With Next d1_ End If End Sub
В макросе события не отключаем, ячейки перебираем:[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range Dim i As Integer
Set rng = Intersect(Range("ak9:ak34"), Target) If Not rng Is Nothing Then For i = 1 To rng.Count With ActiveSheet.Shapes(Target.Row - 8).Fill Select Case Target.Value Case Is < 15 .Transparency = 0.92 Case Is < 20 .Transparency = 0.74 Case Is < 50 .Transparency = 0.52 Case Else .Transparency = 0.37 End Select End With Next i End If
End Sub
[/vba]
В макросе события не отключаем, ячейки перебираем:[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range Dim i As Integer
Set rng = Intersect(Range("ak9:ak34"), Target) If Not rng Is Nothing Then For i = 1 To rng.Count With ActiveSheet.Shapes(Target.Row - 8).Fill Select Case Target.Value Case Is < 15 .Transparency = 0.92 Case Is < 20 .Transparency = 0.74 Case Is < 50 .Transparency = 0.52 Case Else .Transparency = 0.37 End Select End With Next i End If
У Вас массив рукотворный необъявленной размерности и без предварительных указаний на номер первого элемента, следовательно, он начинался с нуля, а у меня массив значений из ячеек, он начинается с 1. А номера строк начинаются с 9-й строки. Поэтому, чтобы попасть на элемент массива, соответствующий строке, Вы у себя писали "Row -9", а я пишу "Row -8"
StoTisteg, Вы б хоть в файле проверяли написанное, что ли. Не будет так работать
У Вас массив рукотворный необъявленной размерности и без предварительных указаний на номер первого элемента, следовательно, он начинался с нуля, а у меня массив значений из ячеек, он начинается с 1. А номера строк начинаются с 9-й строки. Поэтому, чтобы попасть на элемент массива, соответствующий строке, Вы у себя писали "Row -9", а я пишу "Row -8"
StoTisteg, Вы б хоть в файле проверяли написанное, что ли. Не будет так работать_Boroda_
Прошу прощения, за неопытность VBA... Я запутался в трех соснах.
Насколько я разобрался, изначально был массив: "1","2"..."26" к которому была привязка по названию автофигур. После всех изменений, возникли вопросы: 1. Правильно ли я понял, что массив автофигур стал d1_ ? 2. Как добавить/изменить/удалить в(/в/из) массив(/в/а) d1_ автофигуру (например автофигуру Проба26 (зелёного цвета))? 3. Какие действия нужно сделать, чтобы сформировать массив d1_ из других автофигур? Спасибо заранее за понимание
Прошу прощения, за неопытность VBA... Я запутался в трех соснах.
Насколько я разобрался, изначально был массив: "1","2"..."26" к которому была привязка по названию автофигур. После всех изменений, возникли вопросы: 1. Правильно ли я понял, что массив автофигур стал d1_ ? 2. Как добавить/изменить/удалить в(/в/из) массив(/в/а) d1_ автофигуру (например автофигуру Проба26 (зелёного цвета))? 3. Какие действия нужно сделать, чтобы сформировать массив d1_ из других автофигур? Спасибо заранее за пониманиеmkotik
1. Нет. d1_ - это одна из ячеек диапазона d_ 2. Не нужно никуда ничего добавлять. Просто обзовите новую фигуру следующим порядковым номером - 27. И немного измените макросы [vba]
Код
Sub Значение_Приобретения() r1_ = Range("AM" & Rows.Count).End(3).Row 'здесь Range("AK9:AK" & r1_) = Range("AM9:AM" & r1_).Value 'здесь End Sub
Private Sub Worksheet_Change(ByVal Target As Range) Dim d_ As Range, d1_ As Range r1_ = Range("AM" & Rows.Count).End(3).Row 'здесь Set d_ = Intersect(Range("ak9:ak" & r1_), Target) 'здесь If Not d_ Is Nothing Then For Each d1_ In d_ With ActiveSheet.Shapes(CStr(d1_.Row - 8)).Fill 'здесь Select Case d1_.Value Case Is < 15 .Transparency = 0.92 Case Is < 20 .Transparency = 0.74 Case Is < 50 .Transparency = 0.52 Case Else .Transparency = 0.37 End Select End With Next d1_ End If End Sub
[/vba]
1. Нет. d1_ - это одна из ячеек диапазона d_ 2. Не нужно никуда ничего добавлять. Просто обзовите новую фигуру следующим порядковым номером - 27. И немного измените макросы [vba]
Код
Sub Значение_Приобретения() r1_ = Range("AM" & Rows.Count).End(3).Row 'здесь Range("AK9:AK" & r1_) = Range("AM9:AM" & r1_).Value 'здесь End Sub
Private Sub Worksheet_Change(ByVal Target As Range) Dim d_ As Range, d1_ As Range r1_ = Range("AM" & Rows.Count).End(3).Row 'здесь Set d_ = Intersect(Range("ak9:ak" & r1_), Target) 'здесь If Not d_ Is Nothing Then For Each d1_ In d_ With ActiveSheet.Shapes(CStr(d1_.Row - 8)).Fill 'здесь Select Case d1_.Value Case Is < 15 .Transparency = 0.92 Case Is < 20 .Transparency = 0.74 Case Is < 50 .Transparency = 0.52 Case Else .Transparency = 0.37 End Select End With Next d1_ End If End Sub
Спасибо за оперативность, проблема в том, что в первоначальном массиве, который я обозначил для простоты: "1","2"..."26" стоят определенные названия, которые сложно менять (большой массив, в котором забиты кадастровые номера) Ух, надо открывать новую тему?
Спасибо за оперативность, проблема в том, что в первоначальном массиве, который я обозначил для простоты: "1","2"..."26" стоят определенные названия, которые сложно менять (большой массив, в котором забиты кадастровые номера) Ух, надо открывать новую тему?mkotik
mkotik, но простите, тогда у Вас индекс фигуры привязан к кадастровому номеру. То есть Ваш макрос будет менять прозрачность фигуры с совершенно непредсказуемым (и скорее всего несуществующим) индексом.
mkotik, но простите, тогда у Вас индекс фигуры привязан к кадастровому номеру. То есть Ваш макрос будет менять прозрачность фигуры с совершенно непредсказуемым (и скорее всего несуществующим) индексом.StoTisteg
Интуитивно понятный код - это когда интуитивно понятно, что это код.
Сообщение отредактировал StoTisteg - Вторник, 18.09.2018, 17:14
проблема в том, что в первоначальном массиве, который я обозначил для простоты
Другими словами - все, что мы раньше делали - нафиг никому не нужно. Не, сделать-то не вопрос, но потом Вы еще что-нибудь не вспомните, что "для простоты" сделали? В Правилах специально прописано
Цитата
старайтесь сохранить структуру, расположение таблиц, имена листов
Короче - кладите реальный файл (можно кусок файла, можно часть картинок, но в оставшемся ничего не меняйте, кроме конф. инфы, которую замените на нейтральную)
проблема в том, что в первоначальном массиве, который я обозначил для простоты
Другими словами - все, что мы раньше делали - нафиг никому не нужно. Не, сделать-то не вопрос, но потом Вы еще что-нибудь не вспомните, что "для простоты" сделали? В Правилах специально прописано
Цитата
старайтесь сохранить структуру, расположение таблиц, имена листов
Короче - кладите реальный файл (можно кусок файла, можно часть картинок, но в оставшемся ничего не меняйте, кроме конф. инфы, которую замените на нейтральную)_Boroda_
Уважаемые знатоки! Извините пожалуйста за проблемы, которые я вам доставил! Выкладываю сокращённый файл (файл "настоящий" содержит более 1млн строк) с данными без изменений. В колонку AM данные заносятся функцией ВПР из куба (длинная формула). Макросом Значение_приобретения1() переносятся данные из AM в AK. Макрос делает следующее: Копировать->Вставить значение. В зависимости от значения для автофигур меняется значения прозрачности Значения Прозрачность <15 92% >=15<20 74% >=20<50 52% >=50 37% Долгое выполнение процедуры вынудило меня обратиться к вам. Еще раз извините.
Уважаемые знатоки! Извините пожалуйста за проблемы, которые я вам доставил! Выкладываю сокращённый файл (файл "настоящий" содержит более 1млн строк) с данными без изменений. В колонку AM данные заносятся функцией ВПР из куба (длинная формула). Макросом Значение_приобретения1() переносятся данные из AM в AK. Макрос делает следующее: Копировать->Вставить значение. В зависимости от значения для автофигур меняется значения прозрачности Значения Прозрачность <15 92% >=15<20 74% >=20<50 52% >=50 37% Долгое выполнение процедуры вынудило меня обратиться к вам. Еще раз извините.mkotik
Вот, прекрасно, это совсем меняет дело - у Вас же все написано в столбце AJ [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim d_ As Range, d1_ As Range r1_ = Range("AM" & Rows.Count).End(3).Row Set d_ = Intersect(Range("ak9:ak" & r1_), Target) If Not d_ Is Nothing Then For Each d1_ In d_ Select Case d1_.Value Case Is < 15 zn_ = 0.92 Case Is < 20 zn_ = 0.74 Case Is < 50 zn_ = 0.52 Case Else zn_ = 0.37 End Select ActiveSheet.Shapes(d1_.Offset(, -1)).Fill.Transparency = zn_ Next d1_ End If End Sub
Sub Значение_Приобретения() r0_ = 9 r1_ = Range("AM" & Rows.Count).End(3).Row If r1_ < r0_ Then Exit Sub n_ = r1_ - r0_ + 1 ar = Range("AJ" & r0_).Resize(n_) ar1 = Range("AM" & r0_).Resize(n_) Application.EnableEvents = 0 Range("AK" & r0_).Resize(n_) = ar1 Application.EnableEvents = 1 For i = 1 To n_ Select Case ar1(i, 1) Case Is < 15 zn_ = 0.92 Case Is < 20 zn_ = 0.74 Case Is < 50 zn_ = 0.52 Case Else zn_ = 0.37 End Select ActiveSheet.Shapes(ar(i, 1)).Fill.Transparency = zn_ Next i End Sub
[/vba]
Вот, прекрасно, это совсем меняет дело - у Вас же все написано в столбце AJ [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim d_ As Range, d1_ As Range r1_ = Range("AM" & Rows.Count).End(3).Row Set d_ = Intersect(Range("ak9:ak" & r1_), Target) If Not d_ Is Nothing Then For Each d1_ In d_ Select Case d1_.Value Case Is < 15 zn_ = 0.92 Case Is < 20 zn_ = 0.74 Case Is < 50 zn_ = 0.52 Case Else zn_ = 0.37 End Select ActiveSheet.Shapes(d1_.Offset(, -1)).Fill.Transparency = zn_ Next d1_ End If End Sub
Sub Значение_Приобретения() r0_ = 9 r1_ = Range("AM" & Rows.Count).End(3).Row If r1_ < r0_ Then Exit Sub n_ = r1_ - r0_ + 1 ar = Range("AJ" & r0_).Resize(n_) ar1 = Range("AM" & r0_).Resize(n_) Application.EnableEvents = 0 Range("AK" & r0_).Resize(n_) = ar1 Application.EnableEvents = 1 For i = 1 To n_ Select Case ar1(i, 1) Case Is < 15 zn_ = 0.92 Case Is < 20 zn_ = 0.74 Case Is < 50 zn_ = 0.52 Case Else zn_ = 0.37 End Select ActiveSheet.Shapes(ar(i, 1)).Fill.Transparency = zn_ Next i End Sub