Требуемая ошибка объекта в, казалось бы, случайных местах

#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 . (Это не было частью проблемы, но, эй.)