2016-11-22 5 views
2

Я просто изучаю Excel VBA для школьного задания. Я назначил объект «wtCell» как определенную ячейку на определенном листе, основанном на некоторых условиях.Excel VBA: ошибка во время выполнения '91' при втором присвоении переменной Object

Ошибка: «Переменная объекта или переменная блока не установлена»

Я получаю сообщение об ошибке на второй уступки «wtCell»

Sub AddWardData() 

    Dim Cell As Object 
    Dim Ward As Object 

    Dim lngLastRow As Long ' We need to know how many rows of data are in Column J 
    lngLastRow = 0 
    lngLastRow = Range("K" & Rows.Count).End(xlUp).Row ' Complex formula - just ignore the details for now 
    Dim w As Integer ' ward number 
    w = 0 
    Dim wtCell As Object 

    For Each Cell In Worksheets("Data").Range("K2:K" & lngLastRow).Cells ' Iterate thru the cells collection in Row K = a copy 
     w = Val(Mid(Cell.Value, 6, 2)) 
     If (w = 0) Then 
      Cell.Offset(0, 3).Value = "" 
      Cell.Offset(0, 4).Value = "" 
      Cell.Offset(0, 5).Value = "" 
      GoTo no_ward 
     End If 
     For Each Ward In Worksheets("WardData").Range("B4:B46").Cells 
      If (Ward.Value = w) Then 
       Cell.Offset(0, 3).Value = Ward.Offset(0, 4) ' 2015 ward population 
       Cell.Offset(0, 4).Value = Ward.Offset(0, 6) ' ward area 
       Cell.Offset(0, 5).Value = Ward.Offset(0, 10) ' 2015 ward pop density 
       GoTo ward_data_retrieved 
      End If 
ward_data_retrieved: 
     Next 
no_ward: 
     If (Application.CountIf(Worksheets("WardData").Range("B5:B16").Cells, w)) Then 
      Cell.Offset(0, 6).Value = "Urban" 
      Cell.Offset(0, 7).Value = "Urban" 
      wtCell = Worksheets("WardData").Range("F18") ' total population for ward type 
      Cell.Offset(0, 8).Value = wtCell.Value 
      Cell.Offset(0, 9).Value = wtCell.Offset(0, 2).Value ' total area for ward type 
      Cell.Offset(0, 10).Value = wtCell.Offset(0, 6).Value ' avg density for ward type 
      Cell.Offset(0, 11).Value = wtCell.Value 
      Cell.Offset(0, 12).Value = wtCell.Offset(0, 2).Value ' total area for ward type 
      Cell.Offset(0, 13).Value = wtCell.Offset(0, 6).Value ' avg density for ward type 
     ElseIf (Application.CountIf(Worksheets("WardData").Range("B21:B36").Cells, w)) Then 
      Cell.Offset(0, 6).Value = "Suburban" 
      wtCell = Worksheets("WardData").Range("F39") ' total population for ward type 
      Cell.Offset(0, 8).Value = wtCell.Value 
      Cell.Offset(0, 9).Value = wtCell.Offset(0, 2).Value ' total area for ward type 
      Cell.Offset(0, 10).Value = wtCell.Offset(0, 6).Value ' avg density for ward type 
      If (Application.CountIf(Worksheets("WardData").Range("B22:B23").Cells, w)) Then 
       Cell.Offset(0, 7).Value = "OESA" 
       wtCell = Worksheets("WardData").Range("F24") ' total population for ward type 
       Cell.Offset(0, 11).Value = wtCell.Value 
       Cell.Offset(0, 12).Value = wtCell.Offset(0, 2).Value ' total area for ward type 
       Cell.Offset(0, 13).Value = wtCell.Offset(0, 6).Value ' avg density for ward type 
      ElseIf (Application.CountIf(Worksheets("WardData").Range("B28:B29").Cells, w)) Then 
       Cell.Offset(0, 7).Value = "RRSA" 
       wtCell = Worksheets("WardData").Range("F30") ' total population for ward type 
       Cell.Offset(0, 11).Value = wtCell.Value 
       Cell.Offset(0, 12).Value = wtCell.Offset(0, 2).Value ' total area for ward type 
       Cell.Offset(0, 13).Value = wtCell.Offset(0, 6).Value ' avg density for ward type 
      ElseIf (Application.CountIf(Worksheets("WardData").Range("B34:B36").Cells, w)) Then 
       Cell.Offset(0, 7).Value = "KSSA" 
       wtCell = Worksheets("WardData").Range("F37") ' total population for ward type 
       Cell.Offset(0, 11).Value = wtCell.Value 
       Cell.Offset(0, 12).Value = wtCell.Offset(0, 2).Value ' total area for ward type 
       Cell.Offset(0, 13).Value = wtCell.Offset(0, 6).Value ' avg density for ward type 
      End If 
     ElseIf (Application.CountIf(Worksheets("WardData").Range("B41:B46").Cells, w)) Then 
      wtCell = Worksheets("WardData").Range("F46") ' total population for ward type 
      Cell.Offset(0, 8).Value = wtCell.Value 
      Cell.Offset(0, 9).Value = wtCell.Offset(0, 2).Value ' total area for ward type 
      Cell.Offset(0, 10).Value = wtCell.Offset(0, 6).Value ' avg density for ward type 
      Cell.Offset(0, 11).Value = wtCell.Value 
      Cell.Offset(0, 12).Value = wtCell.Offset(0, 2).Value ' total area for ward type 
      Cell.Offset(0, 13).Value = wtCell.Offset(0, 6).Value ' avg density for ward type 
      Cell.Offset(0, 6).Value = "Rural" 
      Cell.Offset(0, 7).Value = "Rural" 
     End If 
    Next 

End Sub 

Я не могу понять, как получить смелую линию в коде, но эта линия:

wtCell = Worksheets("WardData").Range("F39") ' total population for ward type

, который получает highlig hted отладчиком (под первым ElseIf). Я бы очень признателен за любую помощь.

+0

Я думаю, что ваша проблема подчеркнута в ответе ниже (т. Е. Вам нужно «установить» любую переменную объекта). Еще одна вещь, которую нужно изучить в качестве общей практики, - удалить структуру «GoTo». Это создает сложный подход к коду и может иметь непреднамеренные последствия. Вы можете добиться того же результата с помощью вложенных операторов if. – Kyle

+0

Спасибо. Без них было довольно легко обойтись. Я искал реализацию «перерыва» в VBA, и GoTo был первым, что я нашел, но я не хотел бы иметь дурную привычку. –

ответ

2

Попробуйте с

set wtCell = Worksheets("WardData").Range("F39")

И убедитесь, что вы установили все диапазоны к чему-то. Не только эта линия.

+1

Это исправлено! Благодарю. –

+0

Добро пожаловать. Обязательно установите 'wtCell' в других местах вашего кода. – Vityata

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

  • Нет связанных вопросов^_^