#vba #object
Вопрос:
Я получаю эту ошибку только в определенных местах, где, по-видимому, это не должно иметь значения. Например, в первом случае, когда я устанавливаю временные интервалы, программа работает нормально. Во втором случае, когда я снова устанавливаю временные интервалы, я получаю ошибку 424.
Я попытался переместить заданное значение времени = время(mrCell.столбец) за пределы моего выбора, так как оно не обязательно должно быть внутри, вызывая функцию для каждого отдельного случая (она может вызвать ее один раз, это все, что нужно..), но там меня также встречает ошибка. Кажется, что это работает только внутри Избранного, и только в определенных областях.
'MsgBox .Value
Set timevals = time(mrCell.column)
time_start = timevals.item("start")
MsgBox time_start
time_stop = timevals.item("stop")
MsgBox time_stop
'MsgBox .Value
Case Is = "VM554 SAAnesSx - PtCare (Groups 12-14)"
MsgBox .Value
MsgBox mrCell.column
Set timevals = time(mrCell.column)
time_start = timevals.item("start")
MsgBox time_start
time_stop = timevals.item("stop")
MsgBox time_stop
MsgBox .Value
Вот большая часть кода.
Set Selected = Selection.Cells
Dim timevals As Collection
Dim time_start As String
Dim time_stop As String
For Each mrCell In Selected
With mrCell
Select Case .Value
' Here, we'll have to manually input the names (from the other macro that labeled everything..)
Case Is = "VM569 AgAn Lab G 12-14"
'MsgBox .Value
Set timevals = time(mrCell.column)
time_start = timevals.item("start")
MsgBox time_start
time_stop = timevals.item("stop")
MsgBox time_stop
Case Is = "VM570 AgAn2"
'MsgBox .Value
Set timevals = time(mrCell.column)
time_start = timevals.item("start")
MsgBox time_start
time_stop = timevals.item("stop")
MsgBox time_stop
' MsgBox .Value
Case Is = "VM571 Therio"
'MsgBox .Value
Set timevals = time(mrCell.column)
time_start = timevals.item("start")
MsgBox time_start
time_stop = timevals.item("stop")
MsgBox time_stop
'MsgBox .Value
Case Is = "VM552 SAM2"
'MsgBox .Value
Set timevals = time(mrCell.column)
time_start = timevals.item("start")
MsgBox time_start
time_stop = timevals.item("stop")
MsgBox time_stop
'MsgBox .Value
Case Is = "VM597.3 PopTherio Lec"
'MsgBox .Value
Set timevals = time(mrCell.column)
time_start = timevals.item("start")
MsgBox time_start
time_stop = timevals.item("stop")
MsgBox time_stop
'MsgBox .Value
Case Is = "VM554 SAAnesSx - PtCare (Groups 12-14)"
MsgBox .Value
MsgBox mrCell.column
Set timevals = time(mrCell.column) ' Error here
time_start = timevals.item("start")
MsgBox time_start
time_stop = timevals.item("stop")
MsgBox time_stop
MsgBox .Value
End Select
End With
Next
А вот функция времени:
Function time(column As Long)
'Delcare Variables
Dim c As New Collection
Dim item As Variant
Dim key As String
Dim eg_start As String
Dim eg_stop As String
Dim ni_start As String
Dim ni_stop As String
Dim te_start As String
Dim te_stop As String
Dim el_start As String
Dim el_stop As String
'instantiate them
'8-9
eg_start = "8:09AM"
eg_stop = "9:02AM"
'9-10
ni_start = "9:09AM"
ni_stop = "10:02AM"
'10-11
te_start = "10:09AM"
te_stop = "11:02AM"
'11-12
el_start = "11:09AM"
el_stop = "12:02PM"
Select Case column
Case Is = 8
key = "start"
item = eg_start
c.Add item, key
key = "stop"
item = eg_stop
c.Add item, key
Set time = c
Case Is = 9
key = "start"
item = ni_start
c.Add item, key
key = "stop"
item = ni_stop
c.Add item, key
Set time = c
Case Is = 10
key = "start"
item = te_start
c.Add item, key
key = "stop"
item = te_stop
c.Add item, key
Set time = c
Case Is = 11
key = "start"
item = el_start
c.Add item, key
key = "stop"
item = el_stop
c.Add item, key
Set time = c
Case Else
key = "start"
item = "N/A"
c.Add item, key
key = "stop"
item = "N/A"
c.Add item, key
End Select
MsgBox "goodbye"
End Function
Комментарии:
1. Вы не должны использовать время в качестве имени функции, так как время функции VBA уже существует. Кроме того, почему вы ничего не возвращаете из функции?
2. Там нет
Set time = c
в тойCase Else
частиSelect Case
. Вы могли бы, вероятно , толькоSet time = c
один раз, послеEnd Select
, вместо того, чтобы по отдельности когда-либоCase
.3. @BigBen Спасибо за это.. В часы отладки я этого не осознавал. Добавление заданного времени = c в конце функции устранило мою проблему. Очень признателен.
4. @нори, я не знал, что существует функция «Время». Спасибо, что обратили на это мое внимание. Я изменю имя, чтобы избежать путаницы. Очень признателен!
Ответ №1:
Этот сайт не предлагает услуги по корректуре неисправного кода. Поэтому ваш код слишком объемный, чтобы его можно было здесь правильно обработать. Некоторые ошибки были указаны в комментариях выше. Я хочу обратиться к объему вашей неправильно названной и неисправной функции Time
. Вот его версия, урезанная до необходимой длины.
Function GetTimes(Clm As Long) As Times
' 232
' Start and End will both be 0 if Clm <8 or >11
Dim StartTime As Double
If (Clm >= 8) And (Clm <= 11) Then
StartTime = TimeSerial(Clm, 0, 0)
End If
With GetTimes
.Start = StartTime
If StartTime Then .End = TimeSerial(Clm 1, 2, 0)
End With
End Function
Он принимает номер столбца в аргументе в качестве начального часа, а затем добавляет к нему час и 2 минуты для конечного времени. Если столбец (час) < 8 или > 11, как начало, так и конец будут равны 0.
Ваша коллекция не работает с ключом и элементом, как Словарь, но вам нужен Тип. Тип должен быть объявлен в верхней части модуля перед любой процедурой (но после Option Explicit
). Это и есть код.
Option Explicit
Private Type Times
Start As Double
End As Double
End Type
Функция GetTimes
использует это Type
. Поэтому он не будет работать без вышеупомянутого заявления. Для целей тестирования используйте небольшую процедуру, приведенную ниже. Вы можете присвоить переменной разные номера Clm
и прочитать возвращаемые значения на панели «Непосредственно«. В коде также показано, как преобразовать часы (длинный тип данных) и минуты (целые числа) в двойное значение, а затем прочитать двойное значение как время. Вставьте эту процедуру под Type
декларацией.
Private Sub Test()
Const TimeFormat As String = "hh:mm"
Dim MyTime As Times
Dim Clm As Long ' Test column
Clm = 10 ' change for testing
MyTime = GetTimes(Clm)
With MyTime
If .Start Then
Debug.Print "Start = "; Format(.Start, TimeFormat) amp; Chr(13) amp; _
" End = "; Format(.End, TimeFormat)
Else
Debug.Print "Start = Stop" amp; Chr(13) amp; " End = N/A"
End If
End With
End Sub
Комментарии:
1. Я предполагаю, что моей первой ошибкой было бы использование имени функции «время», я не знал, что существует функция по умолчанию под названием «Время». Я не пытаюсь получить «время», как вы предполагаете. Это пользовательская функция, которую я написал
Ответ №2:
У меня не было «По умолчанию» для моей переменной «время». Добавление Set time = c
после End Select
того, как решена моя проблема.
Также измените имя функции time
, так как это может привести к путанице с функцией по умолчанию Time
. (Это не было частью проблемы, но, эй.)