Поле со списком

Автор ali_vlad, 23 октября 2019, 16:30

0 Пользователи и 1 гость просматривают эту тему.

economist

ПКМ - Свойства - Данные - Связанная ячейка - Не?
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

ali_vlad

Цитата: economist от 29 октября 2019, 11:36
ПКМ - Свойства - Данные - Связанная ячейка - Не?
Не. Макросом наполняется.
Если наполнять в Sum Main - выбранное значение остаётся. В другом Sub прячется.

economist

Возможно проблема с самим контролом Listbox/Список, я зарекся его использовать. Лучше уж Combobox/Поле со списком. В нем ещё и быстрый поиск есть, если дофига элементов (а по закону подлости их станет дофига практически сразу).

У контрола есть куча (20 шт.) событий, которые можно обвесить макросами. Если сделать что-то неправильно - выбор будет слетать. Я предупреждал про сложности программирования событий, и три книжки слал для того чтобы их содержимым вас отговорить :-) Хотя там на 1,5 тыс страниц есть решения 95% всех возможных проблем.

Если есть опыт в VBA - используйте его для простых и 100% работающих в Calc вещей - перебора, циклов по ячейкам, замены значений, сортировки итп. А контролы (комбобоксы) - просто свяжите с диапазонами ячеек. Это работает железобетонно. Сравните свой код заполнения контрола - с работающим кодом VBA в Calc в короткой нотации:

set ms = Array("Январь", "Февраль", "Март", "Апрель", "Май")
[A1:A5]= Application.Transpose(ms)
     
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

ali_vlad

К сожалению, тройной связанный список с разными вариантами выполнения в завистмости от выбранного не возможно реализовать формулами. Выбор из разных листов из разных ясеек. Не так выразился. Возможно, но длина формулы будет как от земли до луны. Запутаться можно. В данном случае только макрос.

ali_vlad

Застрял на одном моменте: проверка добавляемого значения на уникальность (чтобы не было повторов). Как это можно решить через макрос? Если каждый раз проверять последовательно на совпадение с кажлым элементом списка через for - это будет долго. Иного в голову не пришло.

economist

ali_vlad - формулы я вам в #32 и не предлагал, только рабочий VBA-код, использующий готовую автоматизацию - свойства контролов в виде связанных ячеек диапазонов.

В оправдание формул, для тех кто рассматривает такой способ построения прикладных интерфейсов: есть файлы и в них по 5 связанных списков (Данные - Проверка) на формулах-диапазонах. Да, формулы читаются тяжело, но работают безотказно, все диапазоны - авторасширяемые, по мере ручного добавления данных (или макросного).  

Я сравнивал сколько времени кодинга уходит на написание и отладку полноценного Диалога с пятью зависимыми комбобоксами и двумя кнопками и второй вариант: обычный лист, "имитацию" диалога, сделанный только на формулах + 2 кнопки (размерами ячеек можно "повторить" дизайн диалога на 90%). Так вот, соотношение трудозатрат оказалось 6:1. Если время дорого - прототипируйте возможностями Calc, а не на Basic. Для красоты - да, нужны диалоги, но отрисовку и события придется хардкодить нипадцки.  
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

ali_vlad

Цитата: economist от 29 октября 2019, 12:31
ali_vlad - формулы я вам в #32 и не предлагал, только рабочий VBA-код, использующий готовую автоматизацию - свойства контролов в виде связанных ячеек диапазонов.

В оправдание формул, для тех кто рассматривает такой способ построения прикладных интерфейсов: есть файлы и в них по 5 связанных списков (Данные - Проверка) на формулах-диапазонах. Да, формулы читаются тяжело, но работают безотказно, все диапазоны - авторасширяемые, по мере ручного добавления данных (или макросного). 

Я сравнивал сколько времени кодинга уходит на написание и отладку полноценного Диалога с пятью зависимыми комбобоксами и двумя кнопками и второй вариант: обычный лист, "имитацию" диалога, сделанный только на формулах + 2 кнопки (размерами ячеек можно "повторить" дизайн диалога на 90%). Так вот, соотношение трудозатрат оказалось 6:1. Если время дорого - прототипируйте возможностями Calc, а не на Basic. Для красоты - да, нужны диалоги, но отрисовку и события придется хардкодить нипадцки. 
Я согласен потратить своё личное время на разработку диалога для себя. Это будет двойная ввгода. Во первых, это будет бесценный опыт в изучении и практмческом применении Basic'а, во вторых, в своём проекте одними сптсками я не ограничусь. Будет авторизация и разграничение прав доступа с блекджеком и шл@@@ми.
Да и в связи с переходом на линукс придётся переписывать (адаптировать) мои ранние "произведения искусства".
Макрос, только макрос.
Но вернемся к нашим спискам. Что посоветуете для быстрой проверки на уникальность добавляемого элемента в список?

mikekaganski

Цитата: ali_vlad от 29 октября 2019, 12:25
проверка добавляемого значения на уникальность (чтобы не было повторов).


Function CheckDup(rowStr As String, byRef UniqueColl)
    CheckDup = True
    On Error GoTo duplicateRow
    UniqueColl.Add(1, rowStr) ' Fails if exists
    CheckDup = False
duplicateRow:
End Function

...

    Dim NoDupes As New Collection
    For ...
        If (CheckDup(checkStr, NoDupes)) Then ' Duplicate
            ...
        Else ' Unique
            ...
        End If
    Next
С уважением,
Михаил Каганский

ali_vlad

Цитата: mikekaganski от 29 октября 2019, 12:47
Цитата: ali_vlad от 29 октября 2019, 12:25
проверка добавляемого значения на уникальность (чтобы не было повторов).


Function CheckDup(rowStr As String, byRef UniqueColl)
    CheckDup = True
    On Error GoTo duplicateRow
    UniqueColl.Add(1, rowStr) ' Fails if exists
    CheckDup = False
duplicateRow:
End Function

...

    Dim NoDupes As New Collection
    For ...
        If (CheckDup(checkStr, NoDupes)) Then ' Duplicate
            ...
        Else ' Unique
            ...
        End If
    Next

Как я понял, это коллекция. В связи с этим 2 вопроса: как её правильно объявить (As ###)?

mikekaganski

Цитата: ali_vlad от 29 октября 2019, 15:41Как я понял, это коллекция. В связи с этим 2 вопроса: как её правильно объявить (As ###)?
Не понял. Во-первых, задан один вопрос ("как её правильно объявить?"), а не два. А во-вторых, в коде она объявлена в единственной строке, начинающейся с Dim.
С уважением,
Михаил Каганский

ali_vlad

Цитата: mikekaganski от 29 октября 2019, 15:51
Цитата: ali_vlad от 29 октября 2019, 15:41Как я понял, это коллекция. В связи с этим 2 вопроса: как её правильно объявить (As ###)?
Не понял. Во-первых, задан один вопрос ("как её правильно объявить?"), а не два. А во-вторых, в коде она объявлена в единственной строке, начинающейся с Dim.
У меня ругается на необъявленную переменную в функции.
И не работает. Дубликаты проходят.

mikekaganski

С уважением,
Михаил Каганский

ali_vlad

Цитата: mikekaganski от 29 октября 2019, 15:57
Цитата: ali_vlad от 29 октября 2019, 15:54У меня ругается
Не могу проверить.
Цитата: mikekaganski от 29 октября 2019, 15:57
Цитата: ali_vlad от 29 октября 2019, 15:54У меня ругается
Не могу проверить.
Я думаю из-за UniqueColl. Может её надо заранее как то объявить?

mikekaganski

UniqueColl - это параметр в функции. Он объявлен в строке
Function CheckDup(rowStr As String, byRef UniqueColl)
и не нуждается в дальнейших объявлениях.

Но всё это не имеет значения. Имеет значение то, что нельзя пытаться исправлять ошибки, не видя код.
С уважением,
Михаил Каганский

ali_vlad

Цитата: mikekaganski от 29 октября 2019, 16:08
UniqueColl - это параметр в функции. Он объявлен в строке
Function CheckDup(rowStr As String, byRef UniqueColl)
и не нуждается в дальнейших объявлениях.

Но всё это не имеет значения. Имеет значение то, что нельзя пытаться исправлять ошибки, не видя код.
Я наверно в глаза долбился, когда переписывал. Но сейчас другая проблема: дублей навалом. Могу приложить только фото скрипта