{quote}{login=kroha}{date=23.10.2011 01:44}{thema=}{post}Все же хотелось бы в виде надстройки!{/post}{/quote}Сохранив файл в формате xla Вы получаете надстройку.
Альтернатива выпадающему списку (форма с поиском)
23.10.2011 13:47:09
|
|
|
|
23.10.2011 14:46:30
Итак, что мы имеем в это версии (в совокупности с предыдущими)
+ Форма открывается рядом с текущей/активной ячейкой. Нет нужды бегать глазами + Создается список из активного столбца (по умолчанию). Можно настроить, чтобы он создавался откуда угодно, в том числе с уже заготовленных "шаблонов". Настроить разные условия на разные книги, а также листы этих книг и т.п. + Список не содержит повторов (уникальный) + Список отсортирован по возрастанию, причем если данные на листе хотя бы частично упорядочены, то он формируется в разы быстрее, а в случае с полностью отсортированным - почти мгновенно. Для сравнения в файле, во 2-м столбце 1864 записи, не более 1-ой сек. и мы имеем 1859 уникальных + Поиск стал еще быстрее и удобнее. При вызове списка из ячейки содержащей значение, оно автоматически используется в качестве шаблона и производится поиск + Навигация привычными стандартными клавишами: Up, Down, Page Up, Page Down + Корректная работа со всеми типами данных: строки, даты, числа + Обработка ошибок формул листа (спасибо EducatedFool) + Обработка защиты ячеек листа (спасибо EducatedFool) + Информация о количестве элементов списка + Быстрый вызов Ctrl+Enter + Быстрое закрытие Esc + Быстрый ввод Enter - Хромает позиционирование. В том числе при масштабе отличном от 100%. Может быть Мастер Йода (EducatedFool) поколдует или чего подскажет? : ) Serge 007, >>Это сочетание клавиш предназначено для ввода массива (не формул массива!). Макрос не отменяет ввод массива)
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук |
|
|
|
23.10.2011 16:57:01
C позиционированием формы у меня тоже не очень...
Учитывая рекомендации отсюда: наваял вот что (тестировал в Excel 2003): With Me .Caption = "Всего уникальных записей: " & x.Count: .ComboBox1.List = Arr() ' .Left = j.Left - ActiveWindow.VisibleRange.Left + j.Width + Len(j.Row) * 4 + 20 ' .Top = j.Top - ActiveWindow.VisibleRange.Top + j.Height + .Height + 28 Dim cb As CommandBar, collLeft As New Collection, collRight As New Collection For Each cb In Application.CommandBars If cb.Visible Then Select Case cb.Position Case msoBarLeft: collLeft.Add cb.Width, CStr(cb.Left) Case msoBarMenuBar, msoBarTop: collRight.Add cb.Height, CStr(cb.Top) End Select End If Next If collLeft.Count Then dx = collLeft.Count * collLeft(1) If collRight.Count Then dy = (collRight.Count + 0.8) * collRight(1) .Left = (j.Next.Left - ActiveWindow.VisibleRange.Left + 30) * ActiveWindow.Zoom / 100 + Application.Left + dx .Top = (j.Next.Top - ActiveWindow.VisibleRange.Top) * ActiveWindow.Zoom / 100 + Application.Top + dy If x.Count Then .ComboBox1.DropDown End With Понятно, что код хреновый, и на 90% состоит из т.н. "костылей", но... на большее без WinAPI идей не хватило... PS: Сейчас заглянет сюда ZVI, и предложит универсальное решение из 2 строк кода ) |
|
|
|
23.10.2011 17:44:39
|
|
|
|
23.10.2011 20:12:10
Уф... Попытался включить мозг и вроде как наиграл одну координату : )
.Left = ((j.Left - ActiveWindow.VisibleRange.Left) + (Application.Width - ActiveWindow.UsableWidth) - ActiveWindow.Left - Application.Left + j.Width) * ActiveWindow.Zoom / 100 EducatedFool, спасибо, что остаетесь не безучастны к данной проблеме) >>Осталось запихнуть всё это в надстройку, и выложить у меня на сайте) Эт дело мы обсудим позже ; ) Сперва нужно довести до ума, а то смысл выкладывать? Serge 007, а ты проверь)
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук |
|
|
|
24.10.2011 06:31:22
Саш, касательно координат курсора посмотри здесь:
позицирование ячеек на экране здесь: |
|
|
|
24.10.2011 06:34:38
Сереж, все просто когда вы вводите массив сочетанием Ctrl+Enter включен режим редактирования формул, он не доступен макросам...
|
|
|
|
24.10.2011 10:34:10
Да, Антон тема интересная) Проверь на большом списке из моего файла (2-ой столбец), addItem да еще и по ячейкам листа - эт медленно. Процедуру AddListItem я бы записал примерно(!) так. А то получается что мой вариант даже быстрее обрабатывает) Да, и масштаб при > 100 обрабатывает не совсем точно. Собственно, я сейчас и бьюсь только над этим - ПОЗИЦИОНИРОВАНИЕ
Private Sub AddListItem() On Error Resume Next lbIn.Clear OKButton.Enabled = False With [Mylist].SpecialCells(xlCellTypeVisible) lbIn.List = IIf(IsArray(.Value), .Value, Array(.Value)) End With OKButton.Enabled = True End Sub Владимир, спасибо большое, интересно, но немного не то. Интересует позиционирование формы относительно активной ячейки Нашел ссылку на тему позиционирования, но там какой то велосипед Люди добрые, кто знает как РАЗМЕСТИТЬ ФОРМУ ОТНОСИТЕЛЬНО АКТИВНОЙ ЯЧЕЙКИ?)
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук |
|
|
|
24.10.2011 10:36:44
|
|
|
|
24.10.2011 11:52:15
Наверно, лучше примерно(!) так, а то получается массив два раза создается
IIf(.Count = 2, Array(.Value), .Value) только не понял, почему 2, эт формулы смотреть нужно Установи масштаб 200, вызови форму, затем опять 100, опять вызови, закрепи области на листе и т.п. Собственно, на данный момент самый больной вопрос (моей формы) - позиционирование, одни косяки ^_^
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук |
|
|
|
24.10.2011 13:59:03
Уважаемый GIG_ant!
Объясните,пожалуйста, как в Вашей программе сделать выбор не из первой колонки списка, а скажем из второй или третьей, короче из любой по желанию? |
|
|
|
24.10.2011 14:35:29
Дело в том что у меня нет второй колонки, а в вашем случае нужно конкретно смотреть по примеру.
Редко но метко ...
|
|
|
|
24.10.2011 15:38:52
{quote}{login=nerv}{date=24.10.2011 10:34}{thema=}{post}Люди добрые, кто знает как РАЗМЕСТИТЬ ФОРМУ ОТНОСИТЕЛЬНО АКТИВНОЙ ЯЧЕЙКИ?){/post}{/quote}
Если надёжно, то так: |
|
|
|
24.10.2011 16:05:37
Владимир, большое спасибо!) Посмотрел код, мама дорогая))) Неужели разработчики, не могли это предусмотреть!? (риторический) Посидел тут, поковырялся и вот к каким выводам пришел:
with Application левый верхний угол = .Left + .ActiveWindow.Left вне зависимости от: свернуто\развернуто приложение; свернут\развернут лист, закрепления областей, масштабирования панели слева = Application.Width - Application.UsableWidth вне зависимости от: свернуто\развернуто приложение; свернут\развернут лист, закрепления областей, масштабирования вся загвоздка в VisibleRange, ибо оно пляшет при изменении мастшабирования и закреплении областей "левая" координата с погрешностью 2-3 пикс. у меня вышла так: UserForm1.Left = (((.Width - .UsableWidth) + (.ActiveCell.Left - ActiveWindow.VisibleRange.Left) + .ActiveCell.Width + 17) * .ActiveWindow.Zoom / 100) + .ActiveWindow.Left + .Left признаться, не понял, как определить размер области, где в Excel идет нумерация строк (см. скрин) и влепил 17, кот. не учитывает то, что чем больше номер строки, тем больше это расстояние. end with
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук |
|
|
|
24.10.2011 16:06:13
\файл
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук |
|
|
|
24.10.2011 17:38:42
Позиционирование формы относительной активной ячейки без API
Обе координаты работают при: + сворачивании приложения в окно/максимизации + сворачивании листа в окно/максимизации + скроллинге по X а также + не влияет положение панелей управления Координата X работает при масштабировании, Y хромает. Если кто знает, как исправить, подскажите пожалуйста : ) Обе координаты не работают при закреплении областей
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук |
|
|
|
29.10.2011 15:51:39
kroha, привет, Малыш! ^_^
Кидайте файлы на мыло (те, где планируется использовать надстройку, плюс саму надстройку) и четко сформулированные "хотелки" (можно скопипастить из Вашего сообщения выше, и если необходимо, дополнить). Сразу оговорюсь, помощь будет не бесплатна (впрочем, не стоит пугаться, чисто символически). Если условия Вас удовлетворяют, готов помочь с настройкой надстройки : ) с уважением, nerv
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук |
|
|
|
29.10.2011 16:48:42
Уважаемый nerv!
Спасибо за быстрый ответ. Отправлю в понедельник, т.к. у меня все это на работе. |
|
|
|
29.10.2011 18:23:47
подскажмте как реализовать, что бы список формировался с другого листа и из конкретного столбца, руки видимо кривые)))
|
|
|
|
29.10.2011 18:28:10
Это Lexey_fan? :)
Посмотрите первые версии GIG_ant - там именно так и сделано. Или Вам на каком коде нужно сделать? |
|
|
|
29.10.2011 19:37:03
По первому вопросу - его бы не было, если бы Вы себя хоть как-то обозначили.
|
|
|
|
29.10.2011 20:42:54
лично я в макросах не силен но по моему Hugo хотел намекнуть.
.Cells(1, i) здесь 1 это номер столбца, замените на соответствующий, т.к. у Вас D то на 4. Хотя може я и не прав. |
||||
|
|
|||
Читают тему