2015-08-03 11 views
1

Я новичок в VBA и пытаюсь создать собственную автоматическую диаграмму Ганта в Excel. Я получаю ошибку времени выполнения 424, где требуется объект. Это происходит, когда я вызвать функцию в модуле (все вары будут публично определены константы, ссылаюсь на конкретные строки и столбца):Ошибка времени выполнения 424 - Требуемый объект (vba)

Call Colour_Spans(Define_Time_Spans_2(i, Fixed_rows, Fixed_columns, Start_week, Start_year, End_week, End_year, OPT, Task_dependency)) 

Функция окраски, какие цвета бары, является:

Public Sub Colour_Spans(s As Range) 

    s.Interior.ColorIndex = 1 

End Sub 

Все работает, если условие If IsEmpty(Cells(Fixed_rows + i, Task_dep)) Then выполнено в приведенном ниже коде, но я получаю сообщение об ошибке, когда выполняется контракт ElseIf Not IsEmpty(Cells(Fixed_rows + i, Task_dep)) Then. То, что указано ниже, в основном определяет полоски, которые затем окрашиваются. Дополнительное условие предполагает ввести зависимость во временных промежутках между задачами. Если я заберу его или просто подавить, все будет работать гладко.

Я использовал много времени самостоятельно, но не могу найти причину. Большая часть второй части кода идентична рабочей части. Любая помощь будет высоко оценен.

Таким образом, я копирую весь код, где проблема. Дайте мне знать, если вам нужно все остальное. Заранее спасибо!

Public Function Define_Time_Spans_2(i, Fixed_rows, Fixed_columns, week_start_column, year_start_column, week_end_column, year_end_column, duration_weeks, Task_dep) 

Dim Cancel_start_week_flag As Boolean 
Dim Cancel_start_year_flag As Boolean 

time_span_start_year = Cells(Fixed_rows + i, year_start_column) 'Iso_year_no(Cells(fixed_rows + i, week_start_column)) 
Cells(Fixed_rows + i, week_start_column).NumberFormat = "General" 
If IsEmpty(Cells(Fixed_rows + i, Task_dep)) Then 

    ' DEFINE YEAR INPUT 
    If Cells(Fixed_rows + i, year_start_column) < 2015 Or Cells(Fixed_rows + i, year_start_column) > 2020 Then 
     check_start_year = MsgBox("The specified start year " & Cells(Fixed_rows + i, year_start_column) & " in row " & Fixed_rows + i & " is outside the range 2015-2020!" & vbCrLf & "Would you like to change it?", vbYesNo + vbQuestion, "Wrong input!") 
     Select Case check_start_year 
     Case 6 
      Do While Cells(Fixed_rows + i, year_start_column) < 2015 Or Cells(Fixed_rows + i, year_start_column) > 2020 
      Cells(Fixed_rows + i, year_start_column) = InputBox("Enter start year number") 
      Loop 
     Case 7 
      Cancel_start_year_flag = True 
     End Select 
     If Cancel_start_year_flag = True Then 
      MsgBox "The time bars have not been updated!", vbExclamation, "The code was terminated!" 
      End 
     End If 
     time_span_start_year = Cells(Fixed_rows + i, year_start_column) 
    End If 

    ' DEFINE WEEK INPUT 
    If time_span_start_year = 2015 Then 
     If Cells(Fixed_rows + i, week_start_column) < 1 Or Cells(Fixed_rows + i, week_start_column) > 53 Then 
      check_start_week = MsgBox("The specified start week " & Cells(Fixed_rows + i, week_start_column) & " in row " & Fixed_rows + i & " does not exist in year " & time_span_start_year & "!" & vbCrLf & "Would you like to change it?", vbYesNo + vbQuestion, "Wrong input!") 
      Select Case check_start_week 
      Case 6 
       Do While Cells(Fixed_rows + i, week_start_column) < 1 Or Cells(Fixed_rows + i, week_start_column) > 53 
       Cells(Fixed_rows + i, week_start_column) = InputBox("Enter start week number") 
       Loop 
      Case 7 
       Cancel_start_week_flag = True 
      End Select 
      If Cancel_start_week_flag = True Then 
       MsgBox "The time bars have not been updated!", vbExclamation, "The code was terminated!" 
       End 
      End If 
     End If 
     time_span_start_week = Cells(Fixed_rows + i, week_start_column) ' Iso_week_no(Cells(fixed_rows + i, week_start_column)) 
    ElseIf time_span_start_year = 2016 Then 
      If Cells(Fixed_rows + i, week_start_column) < 1 Or Cells(Fixed_rows + i, week_start_column) > 52 Then 
      check_start_week = MsgBox("The specified start week " & Cells(Fixed_rows + i, week_start_column) & " in row " & Fixed_rows + i & " does not exist in year " & time_span_start_year & "!" & vbCrLf & "Would you like to change it?", vbYesNo + vbQuestion, "Wrong input!") 
      Select Case check_start_week 
      Case 6 
       Do While Cells(Fixed_rows + i, week_start_column) < 1 Or Cells(Fixed_rows + i, week_start_column) > 52 
       Cells(Fixed_rows + i, week_start_column) = InputBox("Enter start week number") 
       Loop 
      Case 7 
       Cancel_start_week_flag = True 
      End Select 
      If Cancel_start_week_flag = True Then 
       MsgBox "The time bars have not been updated!", vbExclamation, "The code was terminated!" 
       End 
      End If 
     End If 
     time_span_start_week = Cells(Fixed_rows + i, week_start_column) + 53 'Iso_week_no(Cells(fixed_rows + i, week_start_column)) + 53 ' 2016 
    ElseIf time_span_start_year = 2017 Then 
      If Cells(Fixed_rows + i, week_start_column) < 1 Or Cells(Fixed_rows + i, week_start_column) > 52 Then 
      check_start_week = MsgBox("The specified start week " & Cells(Fixed_rows + i, week_start_column) & " in row " & Fixed_rows + i & " does not exist in year " & time_span_start_year & "!" & vbCrLf & "Would you like to change it?", vbYesNo + vbQuestion, "Wrong input!") 
      Select Case check_start_week 
      Case 6 
       Do While Cells(Fixed_rows + i, week_start_column) < 1 Or Cells(Fixed_rows + i, week_start_column) > 52 
       Cells(Fixed_rows + i, week_start_column) = InputBox("Enter start week number") 
       Loop 
      Case 7 
       Cancel_start_week_flag = True 
      End Select 
      If Cancel_start_week_flag = True Then 
       MsgBox "The time bars have not been updated!", vbExclamation, "The code was terminated!" 
       End 
      End If 
     End If 
     time_span_start_week = Cells(Fixed_rows + i, week_start_column) + 53 + 52 ' Iso_week_no(Cells(fixed_rows + i, week_start_column)) + 53 + 52 ' 2017 
    ElseIf time_span_start_year = 2018 Then 
      If Cells(Fixed_rows + i, week_start_column) < 1 Or Cells(Fixed_rows + i, week_start_column) > 52 Then 
      check_start_week = MsgBox("The specified start week " & Cells(Fixed_rows + i, week_start_column) & " in row " & Fixed_rows + i & " does not exist in year " & time_span_start_year & "!" & vbCrLf & "Would you like to change it?", vbYesNo + vbQuestion, "Wrong input!") 
      Select Case check_start_week 
      Case 6 
       Do While Cells(Fixed_rows + i, week_start_column) < 1 Or Cells(Fixed_rows + i, week_start_column) > 52 
       Cells(Fixed_rows + i, week_start_column) = InputBox("Enter start week number") 
       Loop 
      Case 7 
       Cancel_start_week_flag = True 
      End Select 
      If Cancel_start_week_flag = True Then 
       MsgBox "The time bars have not been updated!", vbExclamation, "The code was terminated!" 
       End 
      End If 
     End If 
     time_span_start_week = Cells(Fixed_rows + i, week_start_column) + 53 + 52 + 52 ' Iso_week_no(Cells(fixed_rows + i, week_start_column)) + 53 + 52 + 52 ' 2018 
    ElseIf time_span_start_year = 2019 Then 
     If Cells(Fixed_rows + i, week_start_column) < 1 Or Cells(Fixed_rows + i, week_start_column) > 52 Then 
      check_start_week = MsgBox("The specified start week " & Cells(Fixed_rows + i, week_start_column) & " in row " & Fixed_rows + i & " does not exist in year " & time_span_start_year & "!" & vbCrLf & "Would you like to change it?", vbYesNo + vbQuestion, "Wrong input!") 
      Select Case check_start_week 
      Case 6 
       Do While Cells(Fixed_rows + i, week_start_column) < 1 Or Cells(Fixed_rows + i, week_start_column) > 52 
       Cells(Fixed_rows + i, week_start_column) = InputBox("Enter start week number") 
       Loop 
      Case 7 
       Cancel_start_week_flag = True 
      End Select 
      If Cancel_start_week_flag = True Then 
       MsgBox "The time bars have not been updated!", vbExclamation, "The code was terminated!" 
       End 
      End If 
     End If 
     time_span_start_week = Cells(Fixed_rows + i, week_start_column) + 53 + 52 + 52 + 52 ' Iso_week_no(Cells(fixed_rows + i, week_start_column)) + 53 + 52 + 52 + 52 ' 2019 
    ElseIf time_span_start_year = 2020 Then 
      If Cells(Fixed_rows + i, week_start_column) < 1 Or Cells(Fixed_rows + i, week_start_column) > 53 Then 
      check_start_week = MsgBox("The specified start week " & Cells(Fixed_rows + i, week_start_column) & " in row " & Fixed_rows + i & " does not exist in year " & time_span_start_year & "!" & vbCrLf & "Would you like to change it?", vbYesNo + vbQuestion, "Wrong input!") 
      Select Case check_start_week 
      Case 6 
       Do While Cells(Fixed_rows + i, week_start_column) < 1 Or Cells(Fixed_rows + i, week_start_column) > 53 
       Cells(Fixed_rows + i, week_start_column) = InputBox("Enter start week number") 
       Loop 
      Case 7 
       Cancel_start_week_flag = True 
      End Select 
      If Cancel_start_week_flag = True Then 
       MsgBox "The time bars have not been updated!", vbExclamation, "The code was terminated!" 
       End 
      End If 
     End If 
     time_span_start_week = Cells(Fixed_rows + i, week_start_column) + 53 + 52 + 52 + 52 + 52 ' Iso_week_no(Cells(fixed_rows + i, week_start_column)) + 53 + 52 + 52 + 52 + 52 ' 2020 
    End If 

    time_span_end_week = time_span_start_week + Cells(Fixed_rows + i, duration_weeks) - 1 

    Set Define_Time_Spans_2 = Range(Cells(Fixed_rows + i, Fixed_columns + time_span_start_week), Cells(Fixed_rows + i, Fixed_columns + time_span_end_week)) 

    ' OUTPUT 
    If time_span_end_week <= 53 Then 
     end_year_output = 2015 
     end_week_output = time_span_end_week 
    ElseIf time_span_end_week > 53 And time_span_end_week <= 53 + 52 Then 
     end_year_output = 2016 
     end_week_output = time_span_end_week - 53 
    ElseIf time_span_end_week > 53 + 52 And time_span_end_week <= 53 + 52 + 52 Then 
     end_year_output = 2017 
     end_week_output = time_span_end_week - (53 + 52) 
    ElseIf time_span_end_week > 53 + 52 + 52 And time_span_end_week <= 53 + 52 + 52 + 52 Then 
     end_year_output = 2018 
     end_week_output = time_span_end_week - (53 + 52 + 52) 
    ElseIf time_span_end_week > 53 + 52 + 52 + 52 And time_span_end_week <= 53 + 52 + 52 + 52 + 52 Then 
     end_year_output = 2019 
     end_week_output = time_span_end_week - (53 + 52 + 52 + 52) 
    ElseIf time_span_end_week > 53 + 52 + 52 + 52 + 52 And time_span_end_week <= 53 + 52 + 52 + 52 + 52 + 53 Then 
     end_year_output = 2020 
     end_week_output = time_span_end_week - (53 + 52 + 52 + 52 + 52) 
    End If 






'THE PROBLEMATIC PART 


ElseIf Not IsEmpty(Cells(Fixed_rows + i, Task_dep)) Then 
    ref_task = Cells(Fixed_rows + i, Task_dep) ' Reads the number of task to depend on => nums in B should be unique! 
    Dep_year = Cells(Fixed_rows + ref_task, year_end_column) ' Start_year 
    Dep_week = Cells(Fixed_rows + ref_task, week_end_column) ' Start_week 
    time_span_end_week = Dep_week + Cells(Fixed_rows + i, duration_weeks) '- 1 
    If Dep_year = 2015 Then 
     If time_span_end_week <= 53 Then 
     end_year_output = 2015 
     end_week_output = time_span_end_week 
     ElseIf time_span_end_week > 53 And time_span_end_week <= 53 + 52 Then 
     end_year_output = 2016 
     end_week_output = time_span_end_week - 53 
     ElseIf time_span_end_week > 53 + 52 And time_span_end_week <= 53 + 52 + 52 Then 
     end_year_output = 2017 
     end_week_output = time_span_end_week - (53 + 52) 
     ElseIf time_span_end_week > 53 + 52 + 52 And time_span_end_week <= 53 + 52 + 52 + 52 Then 
     end_year_output = 2018 
     end_week_output = time_span_end_week - (53 + 52 + 52) 
     ElseIf time_span_end_week > 53 + 52 + 52 + 52 And time_span_end_week <= 53 + 52 + 52 + 52 + 52 Then 
     end_year_output = 2019 
     end_week_output = time_span_end_week - (53 + 52 + 52 + 52) 
     ElseIf time_span_end_week > 53 + 52 + 52 + 52 + 52 And time_span_end_week <= 53 + 52 + 52 + 52 + 52 + 53 Then 
     end_year_output = 2020 
     end_week_output = time_span_end_week - (53 + 52 + 52 + 52 + 52) 
     End If 
    ElseIf Dep_year = 2016 Then 
     If time_span_end_week <= 52 Then 
     end_year_output = 2016 
     end_week_output = time_span_end_week 
     ElseIf time_span_end_week > 52 And time_span_end_week <= 52 + 52 Then 
     end_year_output = 2017 
     end_week_output = time_span_end_week - 52 
     ElseIf time_span_end_week > 52 + 52 And time_span_end_week <= 52 + 52 + 52 Then 
     end_year_output = 2018 
     end_week_output = time_span_end_week - (52 + 52) 
     ElseIf time_span_end_week > 52 + 52 + 52 And time_span_end_week <= 52 + 52 + 52 + 52 Then 
     end_year_output = 2019 
     end_week_output = time_span_end_week - (52 + 52 + 52) 
     ElseIf time_span_end_week > 52 + 52 + 52 + 52 And time_span_end_week <= 52 + 52 + 52 + 52 + 53 Then 
     end_year_output = 2020 
     end_week_output = time_span_end_week - (52 + 52 + 52 + 52) 
     End If 
    ElseIf Dep_year = 2017 Then 
     If time_span_end_week <= 52 Then 
     end_year_output = 2017 
     end_week_output = time_span_end_week 
     ElseIf time_span_end_week > 52 And time_span_end_week <= 52 + 52 Then 
     end_year_output = 2018 
     end_week_output = time_span_end_week - 52 
     ElseIf time_span_end_week > 52 + 52 And time_span_end_week <= 52 + 52 + 52 Then 
     end_year_output = 2019 
     end_week_output = time_span_end_week - (52 + 52) 
     ElseIf time_span_end_week > 52 + 52 + 52 And time_span_end_week <= 52 + 52 + 52 + 53 Then 
     end_year_output = 2020 
     end_week_output = time_span_end_week - (52 + 52 + 52) 
     End If 
    ElseIf Dep_year = 2018 Then 
     If time_span_end_week <= 52 Then 
     end_year_output = 2018 
     end_week_output = time_span_end_week 
     ElseIf time_span_end_week > 52 And time_span_end_week <= 52 + 52 Then 
     end_year_output = 2019 
     end_week_output = time_span_end_week - 52 
     ElseIf time_span_end_week > 52 + 52 And time_span_end_week <= 52 + 52 + 53 Then 
     end_year_output = 2020 
     end_week_output = time_span_end_week - (52 + 52) 
     End If 
    ElseIf Dep_year = 2019 Then 
     If time_span_end_week <= 52 Then 
     end_year_output = 2019 
     end_week_output = time_span_end_week 
     ElseIf time_span_end_week > 52 And time_span_end_week <= 52 + 53 Then 
     end_year_output = 2020 
     end_week_output = time_span_end_week - 52 
     End If 
    ElseIf Dep_year = 2020 Then 
     end_year_output = 2020 
     end_week_output = time_span_end_week 
    End If 
End If 
    Cells(Fixed_rows + i, week_end_column).NumberFormat = "General" 
    Cells(Fixed_rows + i, week_end_column) = end_week_output 
    Cells(Fixed_rows + i, year_end_column) = end_year_output 
End Function 
+0

** На какой строке вы получите сообщение об ошибке ** И вы должны ссылаться на ваши 'Cells()' с помощью объекта? переменная (здесь лист) с 'Set ... = ...', зная, что это Workbook.Sheet.Cell;) – R3uK

+0

@ R3uK, я получаю здесь ошибку: Call Colour_Spans (Define_Time_Spans_2 (i, Fixed_rows, Fixed_columns , Start_week, Start_year, End_week, End_year, OPT, Task_dependency)), когда код выполняет часть под «« ПРОБЛЕМНАЯ ЧАСТЬ »(вторая часть вышеприведенного кода). Я также не понял ваш комментарий об объектах. Я активировал лист перед его использованием и ссылаюсь на ячейки() по рабочим листам («Gantt»). Активируйте. –

+0

Для ссылок я не заметил ваш '.Activate' в первый раз, но я ссылался на то, что он используется в этом ответе: http://stackoverflow.com/questions/30608332/copying-a-variable- (30731549) # 30731549 Чтобы сузить строку кода ошибки, поместите точки разрыва в каждую строку вашей ** Проблематичной части ** и повторите код шаг за шагом. Я тоже присмотрюсь! – R3uK

ответ

0

Хорошо, я просто заметил проблему!

Что-то довольно минорное, но вы забыли установить выход/результат вашей функции в проблемной части, поэтому там нет выхода, и поэтому нет объекта для ввода в ваши аргументы для другой процедуры!

Просто добавьте еще одну линию, как это в конце проблемной части:

Set Define_Time_Spans_2 = Range(Cells(Fixed_rows + i, Fixed_columns + time_span_start_week), Cells(Fixed_rows + i, Fixed_columns + time_span_end_week)) 
+0

Magic! :-) Огромное спасибо! Совершенно впечатляет, как быстро вы заметили это среди всех линий! :-) –

+0

Хе-хе, увидев, что вы использовали эту функцию внутри другой, я искал (Ctrl + F) для «Set Define_Time_Spans_2» и не видел ее в вашей * проблематичной части *! Рад, что я могу помочь! Наслаждайтесь SO и не забывайте поднимать/опускать сообщения, которые находят полезными/бесполезными! ;) – R3uK

Смежные вопросы