economist
|
ПКМ - Свойства - Данные - Связанная ячейка - Не?
|
|
|
Записан
|
Руб. за сто, что Питоньяк Любит водку и коньяк! Потому что мне, без оных, - Не понять его никак...
|
|
|
ali_vlad
|
ПКМ - Свойства - Данные - Связанная ячейка - Не?
Не. Макросом наполняется. Если наполнять в 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
|
ali_vlad - формулы я вам в #32 и не предлагал, только рабочий VBA-код, использующий готовую автоматизацию - свойства контролов в виде связанных ячеек диапазонов. В оправдание формул, для тех кто рассматривает такой способ построения прикладных интерфейсов: есть файлы и в них по 5 связанных списков (Данные - Проверка) на формулах-диапазонах. Да, формулы читаются тяжело, но работают безотказно, все диапазоны - авторасширяемые, по мере ручного добавления данных (или макросного).
Я сравнивал сколько времени кодинга уходит на написание и отладку полноценного Диалога с пятью зависимыми комбобоксами и двумя кнопками и второй вариант: обычный лист, "имитацию" диалога, сделанный только на формулах + 2 кнопки (размерами ячеек можно "повторить" дизайн диалога на 90%). Так вот, соотношение трудозатрат оказалось 6:1. Если время дорого - прототипируйте возможностями Calc, а не на Basic. Для красоты - да, нужны диалоги, но отрисовку и события придется хардкодить нипадцки.
Я согласен потратить своё личное время на разработку диалога для себя. Это будет двойная ввгода. Во первых, это будет бесценный опыт в изучении и практмческом применении Basic'а, во вторых, в своём проекте одними сптсками я не ограничусь. Будет авторизация и разграничение прав доступа с блекджеком и шл@@@ми. Да и в связи с переходом на линукс придётся переписывать (адаптировать) мои ранние "произведения искусства". Макрос, только макрос. Но вернемся к нашим спискам. Что посоветуете для быстрой проверки на уникальность добавляемого элемента в список?
|
|
|
Записан
|
|
|
|
mikekaganski
|
проверка добавляемого значения на уникальность (чтобы не было повторов).
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
|
проверка добавляемого значения на уникальность (чтобы не было повторов).
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
|
Как я понял, это коллекция. В связи с этим 2 вопроса: как её правильно объявить (As ###)? Не понял. Во-первых, задан один вопрос ("как её правильно объявить?"), а не два. А во-вторых, в коде она объявлена в единственной строке, начинающейся с Dim.
|
|
|
Записан
|
|
|
|
ali_vlad
|
Как я понял, это коллекция. В связи с этим 2 вопроса: как её правильно объявить (As ###)? Не понял. Во-первых, задан один вопрос ("как её правильно объявить?"), а не два. А во-вторых, в коде она объявлена в единственной строке, начинающейся с Dim. У меня ругается на необъявленную переменную в функции. И не работает. Дубликаты проходят.
|
|
|
Записан
|
|
|
|
|
ali_vlad
|
У меня ругается Не могу проверить. У меня ругается Не могу проверить. Я думаю из-за UniqueColl. Может её надо заранее как то объявить?
|
|
|
Записан
|
|
|
|
mikekaganski
|
UniqueColl - это параметр в функции. Он объявлен в строке Function CheckDup(rowStr As String, byRef UniqueColl) и не нуждается в дальнейших объявлениях. Но всё это не имеет значения. Имеет значение то, что нельзя пытаться исправлять ошибки, не видя код.
|
|
|
Записан
|
|
|
|
ali_vlad
|
UniqueColl - это параметр в функции. Он объявлен в строке Function CheckDup(rowStr As String, byRef UniqueColl) и не нуждается в дальнейших объявлениях. Но всё это не имеет значения. Имеет значение то, что нельзя пытаться исправлять ошибки, не видя код. Я наверно в глаза долбился, когда переписывал. Но сейчас другая проблема: дублей навалом. Могу приложить только фото скрипта
|
|
|
Записан
|
|
|
|
|