Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Как правильно записать данные из контролов на форме в ячейки?
 
1. На форме 4 текст бокса и один комбобокс. Процедура
Код
 Private Sub CommandButton1_Click()
  Dim NextRow As Long, NumMax As Long, i As Integer, CurCtrl As Control
  Sheets("Контакты").Activate
  NextRow = Application.WorksheetFunction.CountA(Range("A:A")) + 1
  Cells(NextRow, 1) = Application.WorksheetFunction.Max(Range("A:A")) + 1
  i = 1
  For Each CurCtrl In UserForm1.Controls
    i = i + 1
    If i > 5 Then Exit For
    Cells(NextRow, i) = CurCtrl.Value
  Next CurCtrl
  Cells(NextRow, 6) = ComboBox1.SelText
End Sub
работает, но не очень нравится, что для комбобокса (контрола, отличного от текстбокcа) код пришлось выносить за цикл, а в цикле вводить условия по i. Можно ли эту процедуру сделать лучше?
2. Хотелось бы дату рождения вводить из календаря, а не вручную забивать в поле ввода. Как это сделать?
3. При вводе в поле ввода "Дата рождения" даже обычных числовых данных они заносятся на лист. Я попробовал сделать проверку:
Код
 Private Sub TextBox4_Change()
  If Not TextBox4.Value.IsDate Then
    MsgBox "Ошибка"
  End If
End Sub
получаю ошибку "Необходим объект". Как правильно проверить Дату?
Файл прилагаю
Как правильно вызвать процедуру для настройки параметров формы?
 
В процедуре
Код
 Sub AddRecord()
'  With UserForm1
'    .ComboBox1.List = Sheets("Списки").Range("A2:A5").Value
'    .Show
'  End With
  UserForm1_Tuning UserForm1
End Sub
все нормально работает без вызова процедуры UserForm1_Tuning и при непосредственной установке параметров (закомментированный код)
Как только использую вызов процедуры
Код
 Sub UserForm1_Tuning(uf As UserForm)
  With uf
    .ComboBox1.List = Sheets("Nienee").Range("A2:A5").Value
    .Show
  End With
End Sub
возникает ошибка "Run-time error 438': Object doesn't support this property or method"
Подскажите, пожалуйста, как правильно передавать объекты в процедуры для работы с ними. Файл прикрепил.

Как правильно определить время выполнения кода?
 
Попробовал поработать с таймером, определить время выполнения кода.
Код
 Sub TestTimer()
  Dim TimeBeg As Date, TimeEnd As Date, TimeWork As Date, i, j, res
  TimeBeg = Timer
  For i = 0 To 100000
    res = res + 1
  Next i
  TimeEnd = Timer
  TimeWork = TimeEnd - TimeBeg
  Debug.Print TimeWork
End Sub
в результате получаю 0:11:15. Возникли следующие вопросы:
а) как трактовать эти значения? Это 11 милисекунд и 15 микросекунд?
б) как вывести данные в мили и микросекундах? Файл прикрепил.
Как передать результаты автофильтра в массив?
 
Хотелось бы на листе отобрать нужные строки и значения отобранных строк перенести в массив. Это можно сделать в цикле по строкам. А можно ли это сделать с помощью автофильтра?
При вводе в форме значения на листе появляются результаты фильтрации:
Код
 Private Sub CommandButton1_Click()
  Sheets("Контакты"  .Activate
  ActiveSheet.Range(ActiveSheet.UsedRange.Address).AutoFilter Field:=2, _
     Criteria1:=UserForm1.TextBox1.Text, VisibleDropDown:=False
End Sub
Можно ли каким-либо образом передать результаты работы автофильтра в массив? Файл прилагаю
VBA - снятие и установка защиты листа
 
Защитил лист "Контакты" паролем "2015" для того, чтобы добавить запись можно было бы только с помощью формы:
В процедуре
Код
 Private Sub CommandButton1_Click()
  Dim NextRow As Long, NumMax As Long
  Sheets("Контакты").Activate
  NextRow = Application.WorksheetFunction.CountA(Range("A:A")) + 1
  NumMax = Application.WorksheetFunction.Max(Range("A:A"))
  Cells(NextRow, 1) = NumMax + 1
  Cells(NextRow, 2) = UserForm1.TextBox1.Text
End Sub
нужно снять защиту и затем после добавления данных поставить ее снова. Подскажите, пожалуйста, как это сделать. Файл прикрепил.
Страницы: 1
Loading...