Добрый день! Прошу Вас помочь с вопросом по созданию функций: нужен полный аналог функции Индекс(диапазон;Поискпоз(Ячейка;Диапазон поиска;0);Поискпоз(ЗначениеЛистБокс[i];Диапазон столбца;0))
Суть задачи. Дано меню ЛистБокс2, в нем собираются критерии для поиска по столбцам значений. Критериев может быть несколько, необходимо собрать формулу на VBA которая в цикле (цикл зависит от количества значений в листбокс2) просуммирует все значения и выдаст результат. Критерии - Это заголовки таблицы
Не могу разобраться с базовыми понятиями того, как именно в функцию передать значения из ячейки.
Примерное, схематичное решение вижу так: Количество Значений в ЛистБоксе определяет количество итераций в цикле. 1 - Создаем массив данных, Размерность массива определяется колчеством значений в ЛистБокс 2 - Используем Функцию : Индекс(ИндексируемыйДиапазон;Поискпоз(ВыделяемЯчейкуПоиска;ДиапазонПоискаСтроки;0);Поискпоз(ЗначениеЛистБокс[i];ДиапазонПоискаСтолбца;0)) 3 - Найденное Значение записываем в Массив, 4 - Считаем сумму значений Массива, и Записываем как результат в ячейку. Как все это реализовать технически ума не хватает. не понимаю базового принципа того, как свои значения подставить через WorksheetFunction Если Возможно, пожалуйста подскажите. Я очень старался, читал много тем, но не получается.
VBA что-то очень тяжело дается, с формулами могу реализовать что угодно, но тут именно итерация нужна. листБоксы создал, набор данных в них получил. Дальше ну никак. [vba]
Код
Function ПоискП(Table As Range,) '...Дальше ума не хватило
Dim i As Long Dim result As String
' Создаем массив данных для хранения найденной позиции Dim MyArray(0 To ListBox2.ListCount) As Variant
' Работаем с итерациями (количество значений в листбоксе - количество итераций) For i = 1 To ListBox2.ListCount
'Тут передаем найденное значение в Массив. MyArray(i) = i
Exit For
' Тут вытаскиваем из массива данные, и суммируем, и передаем в Результат
For i = 1 To ListBox2.ListCount s = s + MyArray(i) Next
result = s
ПоискП = CLng(result) End Sub
[/vba]
Ради бога извините но я не могу прикрепить фаил, он размером больше положенного Поэтому прикрепляю сторонним сервисом https://u.to/LSlhFg
Добрый день! Прошу Вас помочь с вопросом по созданию функций: нужен полный аналог функции Индекс(диапазон;Поискпоз(Ячейка;Диапазон поиска;0);Поискпоз(ЗначениеЛистБокс[i];Диапазон столбца;0))
Суть задачи. Дано меню ЛистБокс2, в нем собираются критерии для поиска по столбцам значений. Критериев может быть несколько, необходимо собрать формулу на VBA которая в цикле (цикл зависит от количества значений в листбокс2) просуммирует все значения и выдаст результат. Критерии - Это заголовки таблицы
Не могу разобраться с базовыми понятиями того, как именно в функцию передать значения из ячейки.
Примерное, схематичное решение вижу так: Количество Значений в ЛистБоксе определяет количество итераций в цикле. 1 - Создаем массив данных, Размерность массива определяется колчеством значений в ЛистБокс 2 - Используем Функцию : Индекс(ИндексируемыйДиапазон;Поискпоз(ВыделяемЯчейкуПоиска;ДиапазонПоискаСтроки;0);Поискпоз(ЗначениеЛистБокс[i];ДиапазонПоискаСтолбца;0)) 3 - Найденное Значение записываем в Массив, 4 - Считаем сумму значений Массива, и Записываем как результат в ячейку. Как все это реализовать технически ума не хватает. не понимаю базового принципа того, как свои значения подставить через WorksheetFunction Если Возможно, пожалуйста подскажите. Я очень старался, читал много тем, но не получается.
VBA что-то очень тяжело дается, с формулами могу реализовать что угодно, но тут именно итерация нужна. листБоксы создал, набор данных в них получил. Дальше ну никак. [vba]
Код
Function ПоискП(Table As Range,) '...Дальше ума не хватило
Dim i As Long Dim result As String
' Создаем массив данных для хранения найденной позиции Dim MyArray(0 To ListBox2.ListCount) As Variant
' Работаем с итерациями (количество значений в листбоксе - количество итераций) For i = 1 To ListBox2.ListCount
'Тут передаем найденное значение в Массив. MyArray(i) = i
Exit For
' Тут вытаскиваем из массива данные, и суммируем, и передаем в Результат
For i = 1 To ListBox2.ListCount s = s + MyArray(i) Next
result = s
ПоискП = CLng(result) End Sub
[/vba]
Ради бога извините но я не могу прикрепить фаил, он размером больше положенного Поэтому прикрепляю сторонним сервисом https://u.to/LSlhFglostandleft
lostandleft, так ли необходимо использовать два листбокса? Может, достаточно в одном флажками выбрать нужные позиции? Или вообще обойтись флажками на листе, а расчёт сделать формулами? Или у Вас ещё какие-то планы на эти листбоксы?
И да, файл надо сократить и приложить сюда, внешние ссылки на файлы на форуме запрещены. Уберите всё лишнее, формулы превратите в значения, удалите скрытые листы, ну и архиваторы никто не отменял.
lostandleft, так ли необходимо использовать два листбокса? Может, достаточно в одном флажками выбрать нужные позиции? Или вообще обойтись флажками на листе, а расчёт сделать формулами? Или у Вас ещё какие-то планы на эти листбоксы?
И да, файл надо сократить и приложить сюда, внешние ссылки на файлы на форуме запрещены. Уберите всё лишнее, формулы превратите в значения, удалите скрытые листы, ну и архиваторы никто не отменял.Pelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
так ли необходимо использовать два листбокса? Может, достаточно в одном флажками выбрать нужные позиции? Или вообще обойтись флажками на листе, а расчёт сделать формулами? Или у Вас ещё какие-то планы на эти листбоксы?
Для меня принципиально желтое в файле создать формулой. Так как строк может быть много, и к тому же столбцы могут меняться местами. Поэтому я подумал о возможности написания собственной функции в ВБА
Будет реализация через ЛистБокс, или через выключатели, для меня не принципиально. Но. В реальном документе складов будет более 20. И выбирать галочки было бы не очень удобно. Поэтому сделан ЛистБокс, в который и выбираем те склады, которые мы хотим просуммировать. ЛистБоксы нужны только для набора складов, никаких других идей для них нет.
О реализации через сводные таблицы думал - это не удобно и топорно. Если возможно, то хотелось бы видеть более изящное решение через самописную функцию, которую можно применить к любой ячейке.
так ли необходимо использовать два листбокса? Может, достаточно в одном флажками выбрать нужные позиции? Или вообще обойтись флажками на листе, а расчёт сделать формулами? Или у Вас ещё какие-то планы на эти листбоксы?
Для меня принципиально желтое в файле создать формулой. Так как строк может быть много, и к тому же столбцы могут меняться местами. Поэтому я подумал о возможности написания собственной функции в ВБА
Будет реализация через ЛистБокс, или через выключатели, для меня не принципиально. Но. В реальном документе складов будет более 20. И выбирать галочки было бы не очень удобно. Поэтому сделан ЛистБокс, в который и выбираем те склады, которые мы хотим просуммировать. ЛистБоксы нужны только для набора складов, никаких других идей для них нет.
О реализации через сводные таблицы думал - это не удобно и топорно. Если возможно, то хотелось бы видеть более изящное решение через самописную функцию, которую можно применить к любой ячейке.lostandleft
На листе "Склады" дал примерное решение на формулах. Функция СУММПРОИЗВ - наше всё! (см. в колонке L). Склады "выбираются" в колонке O путем проставления в ячейках любого символа. При этом над колонкой склада в диапазоне D1:K1 загораются "иксики" как символ выбора (трансляция через функцию ТРАНСП).
Никаких тебе явных итераций и нудятины с ЛистБоксом (уж, извините! ). Если надо отобразить значение из колонки L на другом листе, то можно вполне обойтись простым ВПРом или простым ИНДЕКС/ПОИСКПОЗ, без монстроидальных формул с их неоднократным использованием. Может, сгодится механизм в таком прозрачном виде? Понятно, что список выбора склада можно вынести на другой лист, а результатом из колонки L воспользоваться еще на каком-нибудь третьем.
На листе "Склады" дал примерное решение на формулах. Функция СУММПРОИЗВ - наше всё! (см. в колонке L). Склады "выбираются" в колонке O путем проставления в ячейках любого символа. При этом над колонкой склада в диапазоне D1:K1 загораются "иксики" как символ выбора (трансляция через функцию ТРАНСП).
Никаких тебе явных итераций и нудятины с ЛистБоксом (уж, извините! ). Если надо отобразить значение из колонки L на другом листе, то можно вполне обойтись простым ВПРом или простым ИНДЕКС/ПОИСКПОЗ, без монстроидальных формул с их неоднократным использованием. Может, сгодится механизм в таком прозрачном виде? Понятно, что список выбора склада можно вынести на другой лист, а результатом из колонки L воспользоваться еще на каком-нибудь третьем.Gustav
На листе "Склады" дал примерное решение на формулах. Функция СУММПРОИЗВ - наше всё! (см. в колонке L). Склады "выбираются" в колонке O путем проставления в ячейках любого символа. При этом над колонкой склада в диапазоне D1:K1 загораются "иксики" как символ выбора (трансляция через функцию ТРАНСП).
Интересное решение, проблема лишь в том, что склады динамичные. В том файле что я отправил на файлообменник это хорошо видно. Таблица сводная со складами формируется из косого-кривого документа 1с. Лист Склады - динамичный лист, он меняетя. это сводная таблица. Сегодня задействовано 15 складов, а завтра все 24. И строк сегодня 129 завтра 312.
Спасибо за попытку, за Ваше время. Если ничего лучше через VBA не подскажет коллективный разум, буду пробовать Ваш вариант.
На листе "Склады" дал примерное решение на формулах. Функция СУММПРОИЗВ - наше всё! (см. в колонке L). Склады "выбираются" в колонке O путем проставления в ячейках любого символа. При этом над колонкой склада в диапазоне D1:K1 загораются "иксики" как символ выбора (трансляция через функцию ТРАНСП).
Интересное решение, проблема лишь в том, что склады динамичные. В том файле что я отправил на файлообменник это хорошо видно. Таблица сводная со складами формируется из косого-кривого документа 1с. Лист Склады - динамичный лист, он меняетя. это сводная таблица. Сегодня задействовано 15 складов, а завтра все 24. И строк сегодня 129 завтра 312.
Спасибо за попытку, за Ваше время. Если ничего лучше через VBA не подскажет коллективный разум, буду пробовать Ваш вариант.lostandleft