Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2009, 13:19   #1
Klim Bassenger
Форумчанин
 
Аватар для Klim Bassenger
 
Регистрация: 20.01.2009
Сообщений: 138
По умолчанию Вопросы по GetOpenFilename и элементам формы Excel!!!

Всем привет!!! У меня аж целых пять вопросов... Что-то не нашел я ответы на них на форуме, и чтобы не создавать много тем, решил спросить всё сразу.
Итак вопросы:

1.Может кто подскажет как сделать в команде GetOpenFilename, чтобы в появляющемся окне в графе "Имя файла" появлялось конкреное имя файла, и ничего кроме файла с таким названием открыть было нельзя?

2. Можно ли в Combobox (когда не выбираешь из списка значение, а вводишь первую букву или цифру, а он предлагает варианты) сделать поиск только по цифрам ? Поясню: Есть номера заказов K-N52654, G-M56687, J-kl00456 и т.д. Так вот чтоб, набрав только цифры, он предлягал нужный вариант. Дело в том, что далее на выбранное значение ссылается Listbox. и Наоборот. Поиск по цифрам вроде идет, но при выборе значения выскакивает ошибка. Или может есть есть третий вариант, но чтоб значения выбирались также в предыдущих двух.(Примерный файл прилагаю.)

3. Как в TextBox сделать возможным ввод только цифр и больше ничего... Где-то на форуме вроде было, но я так и не смог найти?..

4. Можно ли , чтоб высота listbox (и Frame, в котором он находится) изменялись при увеличении/уменьшении количества в нем значений?

5. Реально ли сделать форму прозрачной? В access это можно осуществить, а вот насчет Excel интересно узнать.

Заранее благодарен за любую информацию!!!
Вложения
Тип файла: rar Combobox.rar (11.4 Кб, 31 просмотров)
Чтобы правильно задать вопрос, надо знать большую часть ответа.

Последний раз редактировалось Klim Bassenger; 19.06.2009 в 14:00.
Klim Bassenger вне форума Ответить с цитированием
Старый 19.06.2009, 14:57   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
1.Может кто подскажет как сделать в команде GetOpenFilename, чтобы в появляющемся окне в графе "Имя файла" появлялось конкреное имя файла, и ничего кроме файла с таким названием открыть было нельзя?
А зачем в этом случае вообще отображать диалоговое окно, если у пользователья всё равно не выбора???

Цитата:
2. Можно ли в Combobox (когда не выбираешь из списка значение, а вводишь первую букву или цифру, а он предлагает варианты) сделать поиск только по цифрам ?
Можно. Проще всего сделать так:
текстбокс отлавливает изменения, и после ввода каждого символа осуществляет поиск подходящих значений. Подходящие значения выводятся в расположенный ниже листбокс. Если подходящее значение - одно, то оно заносится в текстбокс автоматически.

Цитата:
3. Как в TextBox сделать возможным ввод только цифр и больше ничего... Где-то на форуме вроде было, но я так и не смог найти?..
Можно.

Цитата:
4. Можно ли , чтоб высота listbox (и Frame, в котором он находится) изменялись при увеличении/уменьшении количества в нем значений?
Можно, но сложно.
Впрочем, можно включить автоподбор размеров, но результат в этом случае мало предсказуем.

Цитата:
5. Реально ли сделать форму прозрачной? В access это можно осуществить, а вот насчет Excel интересно узнать.
Реально. Можно даже задать коэффициент прозрачности - от 0 до 255.
EducatedFool вне форума Ответить с цитированием
Старый 19.06.2009, 15:17   #3
Klim Bassenger
Форумчанин
 
Аватар для Klim Bassenger
 
Регистрация: 20.01.2009
Сообщений: 138
По умолчанию

[QUOTE=EducatedFool;293112]А зачем в этом случае вообще отображать диалоговое окно, если у пользователья всё равно не выбора???

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

По поводу
4. Можно ли , чтоб высота listbox (и Frame, в котором он находится) изменялись при увеличении/уменьшении количества в нем значений?

то попытался через макрос посчитать непустые строки и умножить их на размер шрифта...
Dim kAreaCount As Integer
kAreaCount = Range([B2], Cells(Rows.Count, "B").End(xlUp)).Select
ListBox1.Height = Selection.Rows.Count * (ListBox1.Font.Size + 2)
Что-то похожее получается... Но не совсем. Может, что-то добавить нужно?..

А по-поводу остального... Я, конечно, догадывался, что это всё можно сделать... Наверно, не правильно задал вопрос...
Хотелось бы узнать как именно осуществить всё то, о чем спрашивал...
Пример кода или файлики бы посмотреть... Если, конечно, это не секретная информация...
Чтобы правильно задать вопрос, надо знать большую часть ответа.
Klim Bassenger вне форума Ответить с цитированием
Старый 20.06.2009, 17:35   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию Режим прозрачности для формы и автоподбор высоты Listbox-а

По поводу GetOpenFilename так ничего и не придумал, кроме как после выбора пользователем файла проверять его имя на соответствие шаблону, и в случае выбора неподходящего файла вновь отображать диалоговое окно.

Остальное вроде реализовал:



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

Реализована прозрачность формы - значения от 31 до 255
Значения от нуля разрешать не стал - а то потом сложно найти кнопку выключения режима прозрачности...
Вложения
Тип файла: rar Combobox.rar (30.5 Кб, 91 просмотров)

Последний раз редактировалось EducatedFool; 20.06.2009 в 18:26.
EducatedFool вне форума Ответить с цитированием
Старый 22.06.2009, 15:59   #5
Klim Bassenger
Форумчанин
 
Аватар для Klim Bassenger
 
Регистрация: 20.01.2009
Сообщений: 138
По умолчанию

[QUOTE=EducatedFool;293645]По поводу GetOpenFilename так ничего и не придумал, кроме как после выбора пользователем файла проверять его имя на соответствие шаблону, и в случае выбора неподходящего файла вновь отображать диалоговое окно.

Так и сделал... Новерное, ничего лучше не придумаешь...
Чтобы правильно задать вопрос, надо знать большую часть ответа.
Klim Bassenger вне форума Ответить с цитированием
Старый 22.06.2009, 16:02   #6
Klim Bassenger
Форумчанин
 
Аватар для Klim Bassenger
 
Регистрация: 20.01.2009
Сообщений: 138
По умолчанию

А вот остальное - то, что нужно.... Супер!!!!
Единственное, что хочу уточнить - это по высоте listBox:

Sub SetHeightOfListBox()
maxHeight = 163: k = 10.2: n = maxHeight / k
Select Case Me.ListBox1.ListCount
Case 0: Me.ListBox1.Height = 1
Case 1 To n: Me.ListBox1.Height = Me.ListBox1.ListCount * k + 3
Case Else: Me.ListBox1.Height = maxHeight
End Select
End Sub
Код как я понял на размер шрифта 8 расчитан...
maxHeight = 163 - это максимальное кол-во элеменов (Которые видны без прокрутки 16 (163/10.2 = 16))...
k + 3 - это расстояние между элементами...
А вот откуда k = 10.2??? Как его посчитать??? Или просто подобрать до нужного шрифта??
Чтобы правильно задать вопрос, надо знать большую часть ответа.
Klim Bassenger вне форума Ответить с цитированием
Старый 22.06.2009, 16:05   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:
Sub SetHeightOfListBox()
    maxHeight = 163 ' максимальная высота листбокса (если больше, он не влезет на форму)
    k = 10.2 ' (подобрал экспериментально, k=размер шрифта + расстояние сверху и снизу букв)
    n = maxHeight / k ' сколько строк влезет в листбокс при его максимальной высоте
    Select Case Me.ListBox1.ListCount
        Case 1 To n: Me.ListBox1.Height = Me.ListBox1.ListCount * k + 3
        ' + 3 - это запас по высоте, чтобы не отображалась линейка прокрутки
        Case Else: Me.ListBox1.Height = maxHeight
    End Select
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 22.06.2009, 16:19   #8
Klim Bassenger
Форумчанин
 
Аватар для Klim Bassenger
 
Регистрация: 20.01.2009
Сообщений: 138
Радость

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Код:
Sub SetHeightOfListBox()
    maxHeight = 163 ' максимальная высота листбокса (если больше, он не влезет на форму)
    k = 10.2 ' (подобрал экспериментально, k=размер шрифта + расстояние сверху и снизу букв)
    n = maxHeight / k ' сколько строк влезет в листбокс при его максимальной высоте
    Select Case Me.ListBox1.ListCount
        Case 1 To n: Me.ListBox1.Height = Me.ListBox1.ListCount * k + 3
        ' + 3 - это запас по высоте, чтобы не отображалась линейка прокрутки
        Case Else: Me.ListBox1.Height = maxHeight
    End Select
End Sub

Ну почти угадал ... Спасибо!!! Очень помогли!!!
И последний вопрос для общего развития:
Есть код, который добавляет в Listbox значения по критерию, выбранному из combobox1... (Значения в столбце U, критерия отбора в столбце V)

Private Sub ComboBox1_Change()
Dim i As Long, a()
a = Range([U3], Cells(Rows.Count, "V").End(xlUp)).Value: ListBox1.Clear
For i = 1 To UBound(a, 1)
If a(i, 2) = ComboBox1.Value Then ListBox1.AddItem a(i, 1)
Next
End Sub

Почему, если поменять Например, a = Range([A3], Cells(Rows.Count, "V").End(xlUp)).Value: ListBox1.Clear...
то попадаю пустые значения???? Обязательно значения должны стоять в соседних столбцах???
Чтобы правильно задать вопрос, надо знать большую часть ответа.
Klim Bassenger вне форума Ответить с цитированием
Старый 22.06.2009, 16:29   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Когда Вы пишете a = Range([U3], Cells(Rows.Count, "V").End(xlUp)).Value
Вы переносите значения ячеек диапазона U3:V55 (к примеру, в столбце V последняя заполненная строка - 55) в двумерный массив, границы которого VBA назначает автоматически (в зависимости от количества строк и столбцов в переносимом диапазоне)

В случае с диапазоном U3:V55 Вы получаете массив с размерностью (1 to 53, 1 to 2)
1 to 2 - поскольку в диапазон попадают лишь 2 столбца U и V.


В случае с a = Range([A3], Cells(Rows.Count, "V").End(xlUp)).Value
массив получает размерность (1 to 53, 1 to 22) - поскольку в диапазон попадают 22 столбца с A до V

В первом случае в строке ListBox1.AddItem a(i, 1) в листбокс заносится значение
из первого столбца массива (столбец U на листе), а проверяется (If a(i, 2) = ComboBox1.Value) значение из столбца V

Во втором же - это столбцы A и B соответственно.

Если бы Вы написали, из каких столбцов надо брать значения - я бы посказал решение в виде кода.
Например, чтобы взять первый столбец из массива - пишем a(i, 1), если надо последний - a(i, UBound(a, 2))

Последний раз редактировалось EducatedFool; 22.06.2009 в 16:33.
EducatedFool вне форума Ответить с цитированием
Старый 22.06.2009, 16:43   #10
Klim Bassenger
Форумчанин
 
Аватар для Klim Bassenger
 
Регистрация: 20.01.2009
Сообщений: 138
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Когда Вы пишете a = Range([U3], Cells(Rows.Count, "V").End(xlUp)).Value
Вы переносите значения ячеек диапазона U3:V55 (к примеру, в столбце V последняя заполненная строка - 55) в двумерный массив, границы которого VBA назначает автоматически (в зависимости от количества строк и столбцов в переносимом диапазоне)

В случае с диапазоном U3:V55 Вы получаете массив с размерностью (1 to 53, 1 to 2)
1 to 2 - поскольку в диапазон попадают лишь 2 столбца U и V.


В случае с a = Range([A3], Cells(Rows.Count, "V").End(xlUp)).Value
массив получает размерность (1 to 53, 1 to 22) - поскольку в диапазон попадают 22 столбца с A до V

В первом случае в строке ListBox1.AddItem a(i, 1) в листбокс заносится значение
из первого столбца массива (столбец U на листе), а проверяется (If a(i, 2) = ComboBox1.Value) значение из столбца V

Во втором же - это столбцы A и B соответственно.

Если бы Вы написали, из каких столбцов надо брать значения - я бы посказал решение в виде кода.
Например, чтобы взять первый столбец из массива - пишем a(i, 1), если надо последний - a(i, UBound(a, 2))
Понятно, а то справка гласит:
Функция UBound(Upper Bound) служит для определения верхней границы (индекса самого последнего элемента) массива по заданному измерению...
Человеку, который не селен в VBA сложно сопоставить все эти слова вместе и правильно понять, что же это такое...
Мне нужно: критерий отбора - в Столбце V, а сами значения в столбце B. Может заодно подскажете как, после того, как в listbox появилось искомое значение, при нажатии клавиши (ENTER, к примеру), это значение собственно и выбиралось... Что-то вроде Userform_click... Но не щелкать мышкой по листбоксу, а по нажатии клавиши...
Чтобы правильно задать вопрос, надо знать большую часть ответа.
Klim Bassenger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отобразить модально диалог выбора файла GetOpenFileName? bigcrush Win Api 3 13.05.2009 16:03
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) Albert2008 Общие вопросы Delphi 4 21.08.2008 15:33
вопрос по сокетам и общение как в ICQ.Сложный вопрос... Руслантус Общие вопросы C/C++ 2 12.08.2008 21:10
Вопрос по C++ Sanek_ntsk Свободное общение 3 09.01.2008 14:45
Borland C++ не хочет видеть тип String? SERGOO Общие вопросы C/C++ 3 10.06.2007 12:37