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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2009, 11:20   #1
Rom1k06
Форумчанин
 
Регистрация: 30.07.2008
Сообщений: 125
По умолчанию Элементы управления в форме!

Добрый день!
1. Как отсортировать даты в Listbox-е?
2. Как можно задать формат для TextBbox-а (Например дата) для того чтобы ничего другово кроме даты невожнозно было ввести?
3.Как можно проверить все поля формы (чтобы они небыли пыстые) в цикле (В основном все текстовые поля) т.е не писать 10 условий, а 1 цикл и 1 проверку?
Rom1k06 вне форума Ответить с цитированием
Старый 28.04.2009, 13:10   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

1. Формируем массив из элементов ListBox, сортируем его, затем обратно в ListBox. Например, так:
Код:
Dim i As Integer, j As Integer, x, a()
    ReDim a(0 To ListBox1.ListCount - 1)
    For i = 0 To UBound(a)
        a(i) = ListBox1.List(i)
    Next
    For i = LBound(a) To UBound(a) - 1
        For j = i + 1 To UBound(a)
            If a(i) > a(j) Then
                x = a(i)
                a(i) = a(j)
                a(j) = x
            End If
        Next
    Next
    ListBox1.Clear
    ListBox1.List = a
Сортируются не только даты, а любые значения.
2. Можно использовать не TextBox, а DTPicker. Тогда, во-первых, ничего, кроме даты пользователь не введет, во-вторых, вводить гораздо проще (не нужно набирать руками).
3. Следующий код просмотрит все TextBox-ы, и если какой-нибудь из них пуст - выведет об этом сообщение.
Код:
Dim Ctrl As Control
    For Each Ctrl In Controls
        If Ctrl.Name Like "TextBox*" Then If Ctrl.Text = "" Then MsgBox "В " & Ctrl.Name & " пусто!"
    Next
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 28.04.2009, 14:14   #3
Rom1k06
Форумчанин
 
Регистрация: 30.07.2008
Сообщений: 125
По умолчанию

Спасибо огромное
Это очень поможет оптимизировать код!

2 - а что это за элемент "DTPicker" как его найти? или как его использовать?

3 - А если у меня форма с владками?? как проверить только на одной вкладке?
Rom1k06 вне форума Ответить с цитированием
Старый 29.04.2009, 06:21   #4
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

2. Если речь идет о пользовательской форме, то войдите в VBE, правый клик на "Toolbox", выбрать "Additional Controls...". В появившемся окне установить флажок напротив "Microsoft Date and Time Picker 6.0" (ну, или не 6.0, а какой у Вас есть).
Если же данный элемент управления у Вас отсутствует, то есть два выхода: либо установить его, используя дистрибутив "Office" (по-моему, он находится где-то в опциях установки Access), либо найти файл "mscomct2.ocx", скопировать его в "C:\Windows\System32" (если WinXP) и зарегистрировать его в реестре.
3. Следующий код выведет сообщения о наличии только тех пустых TextBox-ов, которые находятся во вкладке MultiPage с именем "Page1".
Код:
Dim Ctrl As Control
    For Each Ctrl In Controls
        If Ctrl.Parent.Caption = "Page1" Then
            If Ctrl.Name Like "TextBox*" Then If Ctrl.Text = "" Then MsgBox "В " & Ctrl.Name & " пусто!"
        End If
    Next
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 29.04.2009 в 07:06. Причина: Добавлено
SAS888 вне форума Ответить с цитированием
Старый 29.04.2009, 09:24   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
как проверить только на одной вкладке?
Можно и так (перебирая контролы на нужной вкладке):
Код:
    For Each Ctrl In Me.MultiPage1.Pages(0).Controls
       If Ctrl.Name Like "TextBox*" And Ctrl.Value = "" Then MsgBox "В " & Ctrl.Name & " пусто!"
    Next
EducatedFool вне форума Ответить с цитированием
Старый 30.04.2009, 09:22   #6
Rom1k06
Форумчанин
 
Регистрация: 30.07.2008
Сообщений: 125
По умолчанию

Спасибо!!!
Но к сожалению у меня на работе неустановлен донный вид эл.упр
посмотрю дома !!!!!
А если не окажется и дома Как можно проверить введена дата или нет?
А то с этим возникают проблемы при расчете процентов остатка по датам!

Последний раз редактировалось Rom1k06; 30.04.2009 в 09:27.
Rom1k06 вне форума Ответить с цитированием
Старый 30.04.2009, 09:39   #7
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Если, например, нужно проверить, в TextBox1 введена дата или нет, то можно, например, так:
Код:
If IsDate(TextBox1.Text) Then MsgBox "Yes" Else MsgBox "No"
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 30.04.2009, 10:08   #8
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Разархивируйте файл из вложения, поместите его в директорию "C:\Windows\System32" и зарегистрируйте в реестре Windows. После этого, у Вас в "Additional Controls..." должен появиться элемент управления "Microsoft Date and Time Picker 6.0".
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 30.04.2009, 20:31   #9
Rom1k06
Форумчанин
 
Регистрация: 30.07.2008
Сообщений: 125
По умолчанию

Спасибо я дома все нашел...
работает....

Подскажите ПЛЗ
код выдает ошибку!!!

Private Sub Workbook_Open()
Dim d, b As Date
Dim i, a, h, j As Variant
'Unprotect (111)
With Sheets(1)
For i = 3 To .Cells(Rows.Count, "B").End(xlUp).Row
a = .Cells(i, 6): b = .Cells(i, 7): d = Date
If .Cells(i, 7) = "" Then .Cells(i, 11) = "": GoTo m1
If b < d Then .Cells(i, 11) = "": GoTo m1
h = Val((b - d)): j = Val(a * 30)
.Cells(i, 11) = Round((h / j) * 100, 2)
If .Cells(i, 11) < 30 Then .Cells(i, 9) = "Îãðàíè÷. Ñðîê"
If .Cells(i, 11) < 10 Then .Cells(i, 9) = "ÁÐÀÊ"
Next
End With
m1:
'Protect (111)
End Sub

На строке .Cells(i, 11) = Round((h / j) * 100, 2)
вроде все правильно написал!?
Rom1k06 вне форума Ответить с цитированием
Старый 30.04.2009, 20:48   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
На строке .Cells(i, 11) = Round((h / j) * 100, 2)
вроде все правильно написал!?
Правильно. Почти правильно.

Перед выполнением операции деления h / j не помешало бы сравнить переменную j с нулём. В Вашем случае ошибка возникает как раз из-за этого.

Причина тому - строка j = Val(a * 30) (в вашем случае функция Val возвращает ноль)
EducatedFool вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу разобраться с элементами управления на форме aRmЯn Общие вопросы по Java, Java SE, Kotlin 1 17.04.2009 01:36
Как спрятать элементы управления NikolayGVB Microsoft Office Excel 2 22.01.2009 03:15
Элементы управления Rom1k06 Microsoft Office Excel 7 28.08.2008 09:47
Возврат управления форме при показе PopupMenu mutabor Общие вопросы Delphi 1 08.07.2008 13:43
Элементы управления и список значений tomasmazas Microsoft Office Excel 1 26.12.2007 09:20