Поиск поизиции для массива в коде
fanat1k90
Дата: Суббота, 02.05.2020, 20:34 |
Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 12
Репутация:
0
±
Замечаний:
0% ±
Excel 2016
Всем здравствуйте! Мне необходимо прописать в коде VBA формулу аналог этой:
{=ПОИСКПОЗ(1;--(A1:C1 <=0,33);0)}
Написал такой код, но в нем ошибка:
Application.CutCopyMode = False
ActiveWorkbook.Worksheets(6 ).Cells.ClearContents
For k = 8 To 9
For i = 1 To ActiveWorkbook.Worksheets(5 ).Cells(k, 51 ) - 1
For j = 1 To ActiveWorkbook.Worksheets(5 ).Cells(k, 51 )
ActiveWorkbook.Worksheets(5 ).Cells(k, 42 ) = i
ActiveWorkbook.Worksheets(5 ).Cells(k, 43 ) = j
ActiveWorkbook.Worksheets(6 ).Cells(i + 1 + (k - 8 ) * 21 , 1 ) = k
ActiveWorkbook.Worksheets(6 ).Cells(i + 1 + (k - 8 ) * 21 , 2 ) = i
ActiveWorkbook.Worksheets(6 ).Cells(1 + (k - 8 ) * 21 , 21 - j + 4 ) = j
ActiveWorkbook.Worksheets(6 ).Cells(1 + i + (k - 8 ) * 21 , ActiveWorkbook.Worksheets(5 ).Cells(k, 51 ) - j + 4 ) = CDbl (Trim (ActiveWorkbook.Worksheets(5 ).Cells(k, 49 )))
ActiveWorkbook.Worksheets(6 ).Cells(1 + i + (k - 8 ) * 21 , 25 ) = Application.CountIfs(Range(Cells(1 + i + (k - 8 ) * 21 , 4 ), Cells(1 + i + (k - 8 ) * 21 , 25 )), ">=0" , Range(Cells(1 + i + (k - 8 ) * 21 , 4 ), Cells(1 + i + (k - 8 ) * 21 , 25 )), "<=0.33" )
Next j
Тут ошибка:
ActiveWorkbook.Worksheets(6 ).Cells(1 + i + (k - 8 ) * 21 , 3 ).FormulaArray = Application.Match(1 , --(Range(Cells(1 + i + (k - 8 ) * 21 , 4 ), Cells(1 + i + (k - 8 ) * 21 , 25 ) <= 0.33 )), 0 )
Next i
Next k
End Sub
Буду очень благодарен за помощь!
Всем здравствуйте! Мне необходимо прописать в коде VBA формулу аналог этой:
{=ПОИСКПОЗ(1;--(A1:C1 <=0,33);0)}
Написал такой код, но в нем ошибка:
Application.CutCopyMode = False
ActiveWorkbook.Worksheets(6 ).Cells.ClearContents
For k = 8 To 9
For i = 1 To ActiveWorkbook.Worksheets(5 ).Cells(k, 51 ) - 1
For j = 1 To ActiveWorkbook.Worksheets(5 ).Cells(k, 51 )
ActiveWorkbook.Worksheets(5 ).Cells(k, 42 ) = i
ActiveWorkbook.Worksheets(5 ).Cells(k, 43 ) = j
ActiveWorkbook.Worksheets(6 ).Cells(i + 1 + (k - 8 ) * 21 , 1 ) = k
ActiveWorkbook.Worksheets(6 ).Cells(i + 1 + (k - 8 ) * 21 , 2 ) = i
ActiveWorkbook.Worksheets(6 ).Cells(1 + (k - 8 ) * 21 , 21 - j + 4 ) = j
ActiveWorkbook.Worksheets(6 ).Cells(1 + i + (k - 8 ) * 21 , ActiveWorkbook.Worksheets(5 ).Cells(k, 51 ) - j + 4 ) = CDbl (Trim (ActiveWorkbook.Worksheets(5 ).Cells(k, 49 )))
ActiveWorkbook.Worksheets(6 ).Cells(1 + i + (k - 8 ) * 21 , 25 ) = Application.CountIfs(Range(Cells(1 + i + (k - 8 ) * 21 , 4 ), Cells(1 + i + (k - 8 ) * 21 , 25 )), ">=0" , Range(Cells(1 + i + (k - 8 ) * 21 , 4 ), Cells(1 + i + (k - 8 ) * 21 , 25 )), "<=0.33" )
Next j
Тут ошибка:
ActiveWorkbook.Worksheets(6 ).Cells(1 + i + (k - 8 ) * 21 , 3 ).FormulaArray = Application.Match(1 , --(Range(Cells(1 + i + (k - 8 ) * 21 , 4 ), Cells(1 + i + (k - 8 ) * 21 , 25 ) <= 0.33 )), 0 )
Next i
Next k
End Sub
Буду очень благодарен за помощь! fanat1k90
Сообщение отредактировал fanat1k90 - Суббота, 02.05.2020, 20:35
Ответить
Сообщение Всем здравствуйте! Мне необходимо прописать в коде VBA формулу аналог этой:
{=ПОИСКПОЗ(1;--(A1:C1 <=0,33);0)}
Написал такой код, но в нем ошибка: [vba]
Application.CutCopyMode = FalseActiveWorkbook.Worksheets(6).Cells.ClearContentsFor k = 8 To 9For i = 1 To ActiveWorkbook.Worksheets(5).Cells(k ; 51) - 1For j = 1 To ActiveWorkbook.Worksheets(5).Cells(k ; 51)ActiveWorkbook.Worksheets(5).Cells(k ; 42) = iActiveWorkbook.Worksheets(5).Cells(k ; 43) = jActiveWorkbook.Worksheets(6).Cells(i + 1 + (k - 8) * 21; 1) = kActiveWorkbook.Worksheets(6).Cells(i + 1 + (k - 8) * 21; 2) = iActiveWorkbook.Worksheets(6).Cells(1 + (k - 8) * 21; 21 - j + 4) = jActiveWorkbook.Worksheets(6).Cells(1 + i + (k - 8) * 21; ActiveWorkbook.Worksheets(5).Cells(k ; 51) - j + 4) = CDbl(Тrim(ActiveWorkbook.Worksheets(5).Cells(k ; 49)))ActiveWorkbook.Worksheets(6).Cells(1 + i + (k - 8) * 21; 25) = Application.CountIfs(Range(Cells(1 + i + (k - 8) * 21; 4); Cells(1 + i + (k - 8) * 21; 25)); ">=0"; Range(Cells(1 + i + (k - 8) * 21; 4); Cells(1 + i + (k - 8) * 21; 25)); "<=0.33")Next jТут ошибка :ActiveWorkbook.Worksheets(6).Cells(1 + i + (k - 8) * 21; 3).FormulaArray = Application.Match(1; --(Range(Cells(1 + i + (k - 8) * 21; 4); Cells(1 + i + (k - 8) * 21; 25) <= 0,33)); 0)Next iNext kEnd Sub
[/vba] Буду очень благодарен за помощь! Автор - fanat1k90 Дата добавления - 02.05.2020 в 20:34
Dmitriy_37
Дата: Суббота, 02.05.2020, 21:05 |
Сообщение № 2
Группа: Пользователи
Ранг: Новичок
Сообщений: 26
Репутация:
4
±
Замечаний:
0% ±
Excel 2010
здравствуйте! Попробуйте заменить на
.FormulaArray = Evaluate("=ПОИСКПОЗ(1;--(A1:C1<=0,33);0)")
здравствуйте! Попробуйте заменить на
.FormulaArray = Evaluate("=ПОИСКПОЗ(1;--(A1:C1<=0,33);0)")
Dmitriy_37
Ответить
Сообщение здравствуйте! Попробуйте заменить на
.FormulaArray = Evaluate("=ПОИСКПОЗ(1;--(A1:C1<=0,33);0)")
Автор - Dmitriy_37 Дата добавления - 02.05.2020 в 21:05
Hugo
Дата: Суббота, 02.05.2020, 21:12 |
Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3854
Репутация:
814
±
Замечаний:
0% ±
365
.FormulaArray = "=MATCH(1,--(" & Range(Cells(1 + i + (k - 8 ) * 21 , 4 ), Cells(1 + i + (k - 8 ) * 21 , 25 )).Address & "<=0.33), 0)"
.FormulaArray = "=MATCH(1,--(" & Range(Cells(1 + i + (k - 8 ) * 21 , 4 ), Cells(1 + i + (k - 8 ) * 21 , 25 )).Address & "<=0.33), 0)"
Hugo
webmoney: E265281470651 Z422237915069 USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
Сообщение отредактировал Hugo - Суббота, 02.05.2020, 21:14
Ответить
Сообщение [vba]
.FormulaArray = "=ПОИСКПОЗ(1,--(" & Range(Cells(1 + i + (k - 8) * 21; 4); Cells(1 + i + (k - 8) * 21; 25)).Address & "<=0.33), 0)"
[/vba] Автор - Hugo Дата добавления - 02.05.2020 в 21:12
fanat1k90
Дата: Суббота, 02.05.2020, 22:22 |
Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 12
Репутация:
0
±
Замечаний:
0% ±
Excel 2016
.FormulaArray = "=MATCH(1,--(" & Range(Cells(1 + i + (k - 8) * 21, 4), Cells(1 + i + (k - 8) * 21, 25)).Address & "<=0.33), 0)"
все равно выдает ошибку
.FormulaArray = "=MATCH(1,--(" & Range(Cells(1 + i + (k - 8) * 21, 4), Cells(1 + i + (k - 8) * 21, 25)).Address & "<=0.33), 0)"
все равно выдает ошибкуfanat1k90
Ответить
Сообщение .FormulaArray = "=MATCH(1,--(" & Range(Cells(1 + i + (k - 8) * 21, 4), Cells(1 + i + (k - 8) * 21, 25)).Address & "<=0.33), 0)"
все равно выдает ошибкуАвтор - fanat1k90 Дата добавления - 02.05.2020 в 22:22
Pelena
Дата: Суббота, 02.05.2020, 22:36 |
Сообщение № 5
Группа: Админы
Ранг: Местный житель
Сообщений: 19511
Репутация:
4620
±
Замечаний:
±
Excel 365 & Mac Excel
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
Ответить
Сообщение покажите в файлеАвтор - Pelena Дата добавления - 02.05.2020 в 22:36
Hugo
Дата: Суббота, 02.05.2020, 22:52 |
Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3854
Репутация:
814
±
Замечаний:
0% ±
365
У меня ошибки нет, но для чистоты - нужно Address(0, 0)
У меня ошибки нет, но для чистоты - нужно Address(0, 0) Hugo
webmoney: E265281470651 Z422237915069 USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
Ответить
Сообщение У меня ошибки нет, но для чистоты - нужно Address(0, 0) Автор - Hugo Дата добавления - 02.05.2020 в 22:52
fanat1k90
Дата: Суббота, 02.05.2020, 23:42 |
Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 12
Репутация:
0
±
Замечаний:
0% ±
Excel 2016
Файл на рабочем компьютере. А в моём варианте
.FormulaArray = Application.Match(1 , --(Range(Cells(1 + i + (k - 8 ) * 21 , 4 ), Cells(1 + i + (k - 8 ) * 21 , 25 ) <= 0.33 )), 0 )
где ошибка? Или может у вас вообще есть идеи как проще прописать? нужно вывести порядковый номер первого значения в строке, которое меньше либо равно 0,33 в этом диапазоне
(Range(Cells(1 + i + (k - 8 ) * 21 , 4 ), Cells(1 + i + (k - 8 ) * 21 , 25 )
Файл на рабочем компьютере. А в моём варианте
.FormulaArray = Application.Match(1 , --(Range(Cells(1 + i + (k - 8 ) * 21 , 4 ), Cells(1 + i + (k - 8 ) * 21 , 25 ) <= 0.33 )), 0 )
где ошибка? Или может у вас вообще есть идеи как проще прописать? нужно вывести порядковый номер первого значения в строке, которое меньше либо равно 0,33 в этом диапазоне
(Range(Cells(1 + i + (k - 8 ) * 21 , 4 ), Cells(1 + i + (k - 8 ) * 21 , 25 )
fanat1k90
Сообщение отредактировал fanat1k90 - Суббота, 02.05.2020, 23:49
Ответить
Сообщение Файл на рабочем компьютере. А в моём варианте [vba]
.FormulaArray = Application.Match(1, --(Range(Cells(1 + i + (k - 8) * 21, 4), Cells(1 + i + (k - 8) * 21, 25) <= 0.33)), 0)
[/vba] где ошибка? Или может у вас вообще есть идеи как проще прописать? нужно вывести порядковый номер первого значения в строке, которое меньше либо равно 0,33 в этом диапазоне [vba]
(Range(Cells(1 + i + (k - 8) * 21, 4), Cells(1 + i + (k - 8) * 21, 25)
[/vba] Автор - fanat1k90 Дата добавления - 02.05.2020 в 23:42
Hugo
Дата: Воскресенье, 03.05.2020, 10:03 |
Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3854
Репутация:
814
±
Замечаний:
0% ±
365
В Вашем варианте ошибка в том, что это будет не формула массива, а значение, и в том, что в выражении со скобками промахнулись, но это не имеет значения... А если нужно макросом вывести номер - то макросом можно и пройтись в цикле по строке с анализом значений:
For Each c In Range(Cells(1 + i + (k - 8 ) * 21 , 4 ), Cells(1 + i + (k - 8 ) * 21 , 25 ))
x = x + 1
If c <= 0.33 Then MsgBox x: Exit For
Next
или например взять готовую формулу
MsgBox Evaluate("MATCH(1,--(" & Range(Cells(1 + i + (k - 8 ) * 21 , 4 ), Cells(1 + i + (k - 8 ) * 21 , 25 )).Address(0 , 0 ) & "<=0.33), 0)" )
Хотя вот странно - на листе работает только как формула массива, а для evaluate это не важно, в чём подвох?
В Вашем варианте ошибка в том, что это будет не формула массива, а значение, и в том, что в выражении со скобками промахнулись, но это не имеет значения... А если нужно макросом вывести номер - то макросом можно и пройтись в цикле по строке с анализом значений:
For Each c In Range(Cells(1 + i + (k - 8 ) * 21 , 4 ), Cells(1 + i + (k - 8 ) * 21 , 25 ))
x = x + 1
If c <= 0.33 Then MsgBox x: Exit For
Next
или например взять готовую формулу
MsgBox Evaluate("MATCH(1,--(" & Range(Cells(1 + i + (k - 8 ) * 21 , 4 ), Cells(1 + i + (k - 8 ) * 21 , 25 )).Address(0 , 0 ) & "<=0.33), 0)" )
Хотя вот странно - на листе работает только как формула массива, а для evaluate это не важно, в чём подвох? Hugo
webmoney: E265281470651 Z422237915069 USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
Сообщение отредактировал Hugo - Воскресенье, 03.05.2020, 10:04
Ответить
Сообщение В Вашем варианте ошибка в том, что это будет не формула массива, а значение, и в том, что в выражении со скобками промахнулись, но это не имеет значения... А если нужно макросом вывести номер - то макросом можно и пройтись в цикле по строке с анализом значений: [vba]
For Each c In Range(Cells(1 + i + (k - 8) * 21, 4), Cells(1 + i + (k - 8) * 21, 25)) x = x + 1 If c <= 0.33 Then MsgBox x : Exit For Next
[/vba] или например взять готовую формулу [vba]
MsgBox Evaluate("ПОИСКПОЗ(1,--(" & Range(Cells(1 + i + (k - 8) * 21; 4); Cells(1 + i + (k - 8) * 21; 25)).Address(0; 0) & "<=0.33), 0)")
[/vba] Хотя вот странно - на листе работает только как формула массива, а для evaluate это не важно, в чём подвох? Автор - Hugo Дата добавления - 03.05.2020 в 10:03