Добрый вечер! Прошу помочь со следующей прблемой: Изначально делаю форму, и таблицу для записи пациентов на прием. В форме 6 полей: Фамилия, Имя, Отчество, телефон, дата приема и время. После заполнения формы, по нажатию на кнопку (Sub AddApp), данные добавляются в умную таблицу:
Код
Option Explicit
Dim ShApp As Worksheet
Dim AppListObj As ListObject
Dim AppListRow As ListRow
Sub AddApp() ' Добавление записи
Set ShApp = ThisWorkbook.Worksheets("Запись")
Set AppListObj = ShApp.ListObjects("Запись_Tb")
Set AppListRow = AppListObj.ListRows.Add
Dim Q1 As Date
Dim Q2 As Range
Set Q1 = CDate(App.Data.Value & App.Time.Value)
Set Q2 = AppListObj.ListColumns.Item(5).Range.Find(Q1, lookat:=xlWhole)
If Q2 Is Nothing Then
AppListRow.Range(1) = App.txb_surname.Value
AppListRow.Range(2) = App.txb_name.Value
AppListRow.Range(3) = App.txb_ptr.Value
AppListRow.Range(4) = App.txb_mobile.Value
AppListRow.Range(5) = App.Data.Value
AppListRow.Range(6) = App.Time.Value
Else
MsgBox "Время уже занято!"
End If
End Sub
Прежде чем добавить запись, я хочу проверить, что эти дата и время свободны. Для этого в 7 колонке я сделал функцию "=ТЕКСТ([@[Дата приема]];"ДД.ММ.ГГГГ")&" "&ТЕКСТ([@[Время приема]];"ЧЧ:ММ")" и в коде прописал, что хочу сделать переменную, которая в себе объединит дату и время из формы, и эту перенную надо найти в этой 7 колонке. Но пока не получилось, так как выдает ошибку object required и выделяет Q1 в 16 строке.
1. приложите свой файл 2. Зачем в 16-й строке вы пишите Set ? Q1 у вас переменная тип Дата. А не объект. Тут не нужен Set. Текст ошибки вам говорит: Требуется Объект! Так как вы написали ключевое слово Set. Set применяется к объектам - ячейкам, листам, книгам и тд. Set a= Range("A1"), Set s = sheets("лист1") и т.д. 3. не понятно, какие значения в этих переменных в 16 строке: App.Data.Value & App.Time.Value Напишите что там в этих переменных
Вот смотрите, у меня без Set работает
Код
Sub Макрос1()
Dim Date1 As Date
Date1 = CDate("30/09/2020")
MsgBox Date1
End Sub
Кстати, вы пишите, что ищете в 7-м столбце, а в коде, вроде, указан 5-й столбец в этой строке
Код
Set Q2 = AppListObj.ListColumns.Item(5).Range.Find(Q1, lookat:=xlWhole)
4. Попробуйте Q1 дать тип String - вдруг тоже сработает )
Sub AddApp() ' Добавление записи
Set ShApp = ThisWorkbook.Worksheets("Запись")
Set AppListObj = ShApp.ListObjects("Запись_Tb")
Set AppListRow = AppListObj.ListRows.Add
Dim Q1 As Date
Dim Q2 As Range
Q1 = App.Data.Value & " " & App.Time.Value
Set Q2 = AppListObj.ListColumns.Item(7).Range.Find(Q1, lookat:=xlWhole)
If Q2 Is Nothing Then
AppListRow.Range(1) = App.txb_surname.Value
AppListRow.Range(2) = App.txb_name.Value
AppListRow.Range(3) = App.txb_ptr.Value
AppListRow.Range(4) = App.txb_mobile.Value
AppListRow.Range(5) = App.Data.Value
AppListRow.Range(6) = App.Time.Value
Else
MsgBox "Время уже занято!"
End If
Цитата
New написал: 3. не понятно, какие значения в этих переменных в 16 строке: App.Data.Value & App.Time.ValueНапишите что там в этих переменных
В этих переменных, то, что заполнено в форме. В примере увидите.
1. Q1 дайте тип String 2. поиском ищите в ЗНАЧЕНИЯХ ячейки (LookIn:=xlValues), то есть всё вот так
Код
Dim Q1 As String
Dim Q2 As Range
Q1 = App.Data.Value & " " & App.Time.Value
'Q1 = "30.09.2020 15:00" 'я тестировал на этом так как у меня нет вашей библиотеки
Set Q2 = AppListObj.ListColumns.Item(7).Range.Find(Q1, , LookIn:=xlValues, lookat:=xlWhole)
у меня выскакивает сообщениеMsgBox "Время уже занято!"
New, к сожалению, не работает. Точнее сказать, он добавляет запись, не смотря на то, что в 7 колонке есть такое значение. Q2 у меня тоже отображается правильно, но на листе не видет..
VVS_001 написал: Q2 у меня тоже отображается правильно
отображается правильно - не факт что в переменной содержится правильное значение число 100 и строка содержащая единичку и 2 нуля отображаются одинаково, но не равны между собой между ними космическая разница с точки зрения компьютера, хотя нет никакой разницы с точки зрения человеческим глазом
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
New, а, не, конечно изменил, как вы и написали сделал:
Код
Dim Q1 As String
Q1 = App.Data.Value & App.Time.Value
Dim Q2 As Range
Set Q2 = AppListObj.ListColumns.Item(7).Range.Find(Q1, LookIn:=xlValues, lookat:=xlWhole)
Тогда надо смотреть что у вас в переменой Q1. Я проверить ваш файл не могу, код ругается на отсутствующие библиотеки, которые вы используете в своем коде (возможно это календарь на форме). Возможно у вас там в конце добавлены секунды, которых нет на листе. Избавьтесь от секунд и двоеточия. Посмотрите картинку, которую я выкладывал выше. Видите у меня в конце прописано 15:00 и всё, секунд нет. А ваш календарь (который я не вижу на своем компе) возможно добавляет ещё секунды к времени. А секунд у вас на листе нет
New, вы совершенно правы, что там дата и время. если надо, могу библитеку скинуть) я проверил на наличие секунд, колонку 7. И в итоге в формуле "текст" добавил секунды, и пошло дело)
Не за что. Вам надо научиться работать с точками останова. Вы бы поставили точку останова после строки, где переменная Q1 получает значение и сравни ли бы глазами значение внутри переменной и значения в ячейке и поняли бы, что они не равны друг другу. например Q1 = "02.10.2020 12:30:45" значение в ячейке: "02.10.2020 12:30" Визуально видно, что строки разные
На самом деле я примерно знаю как это работает. Просто сперва не праивльно объявил переменную, а потом просто глазами не увидел, что там без секунд. Вообще, работу с да той и временем в Екселе очень не люблю, потому что постоянно с разными приколами сталкиваюсь.
достаточно ОДИН раз понять принцип, и всю жизнь пользоваться, но если что-то в организме ищет приключений, то можно постоянно сталкиваться с приколами... и недоумевать
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!