Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Поиск поизиции для массива в коде - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, Manyasha, SLAVICK, китин  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск поизиции для массива в коде (Макросы/Sub)
Поиск поизиции для массива в коде
fanat1k90 Дата: Суббота, 02.05.2020, 20:34 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Всем здравствуйте!
Мне необходимо прописать в коде VBA формулу аналог этой:
Код
{=ПОИСКПОЗ(1;--(A1:C1<=0,33);0)}


Написал такой код, но в нем ошибка:

[vba]
Код
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]
Буду очень благодарен за помощь!


Сообщение отредактировал fanat1k90 - Суббота, 02.05.2020, 20:35
 
Ответить
СообщениеВсем здравствуйте!
Мне необходимо прописать в коде VBA формулу аналог этой:
Код
{=ПОИСКПОЗ(1;--(A1:C1<=0,33);0)}


Написал такой код, но в нем ошибка:

[vba]
Код
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]
Буду очень благодарен за помощь!

Автор - fanat1k90
Дата добавления - 02.05.2020 в 20:34
Dmitriy_37 Дата: Суббота, 02.05.2020, 21:05 | Сообщение № 2
Группа: Пользователи
Ранг: Новичок
Сообщений: 24
Репутация: 4 ±
Замечаний: 0% ±

Excel 2010
здравствуйте!

Попробуйте заменить на
Код
.FormulaArray = Evaluate("=ПОИСКПОЗ(1;--(A1:C1<=0,33);0)")
 
Ответить
Сообщениездравствуйте!

Попробуйте заменить на
Код
.FormulaArray = Evaluate("=ПОИСКПОЗ(1;--(A1:C1<=0,33);0)")

Автор - Dmitriy_37
Дата добавления - 02.05.2020 в 21:05
Hugo Дата: Суббота, 02.05.2020, 21:12 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2944
Репутация: 649 ±
Замечаний: 0% ±

[vba]
Код
.FormulaArray = "=MATCH(1,--(" & Range(Cells(1 + i + (k - 8) * 21, 4), Cells(1 + i + (k - 8) * 21, 25)).Address & "<=0.33), 0)"
[/vba]


excel@nxt.ru
webmoney: E265281470651 R418926282008 Z422237915069


Сообщение отредактировал Hugo - Суббота, 02.05.2020, 21:14
 
Ответить
Сообщение[vba]
Код
.FormulaArray = "=MATCH(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
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 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
Дата добавления - 02.05.2020 в 22:22
Pelena Дата: Суббота, 02.05.2020, 22:36 | Сообщение № 5
Группа: Админы
Ранг: Местный житель
Сообщений: 15750
Репутация: 3432 ±
Замечаний: ±

Excel 2010, 2016 & Mac Excel
все равно выдает ошибку

покажите в файле


"Черт возьми, Холмс! Но как??!!"
ЯД 41001765434816
 
Ответить
Сообщение
все равно выдает ошибку

покажите в файле

Автор - Pelena
Дата добавления - 02.05.2020 в 22:36
Hugo Дата: Суббота, 02.05.2020, 22:52 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2944
Репутация: 649 ±
Замечаний: 0% ±

У меня ошибки нет, но для чистоты - нужно Address(0, 0)


excel@nxt.ru
webmoney: E265281470651 R418926282008 Z422237915069
 
Ответить
СообщениеУ меня ошибки нет, но для чистоты - нужно Address(0, 0)

Автор - Hugo
Дата добавления - 02.05.2020 в 22:52
fanat1k90 Дата: Суббота, 02.05.2020, 23:42 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Файл на рабочем компьютере.
А в моём варианте
[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: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
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2944
Репутация: 649 ±
Замечаний: 0% ±

В Вашем варианте ошибка в том, что это будет не формула массива, а значение, и в том, что в выражении со скобками промахнулись, но это не имеет значения...
А если нужно макросом вывести номер - то макросом можно и пройтись в цикле по строке с анализом значений:
[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("MATCH(1,--(" & Range(Cells(1 + i + (k - 8) * 21, 4), Cells(1 + i + (k - 8) * 21, 25)).Address(0, 0) & "<=0.33), 0)")
[/vba]
Хотя вот странно - на листе работает только как формула массива, а для evaluate это не важно, в чём подвох?


excel@nxt.ru
webmoney: E265281470651 R418926282008 Z422237915069


Сообщение отредактировал 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("MATCH(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
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск поизиции для массива в коде (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс цитирования
© 2010-2020 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!