2016-11-22 69 views
2

我刚刚学习Excel VBA的学校作业。我已经根据某些条件为某个工作表中的特定单元格分配了一个对象“wtCell”。Excel VBA:第二次分配给对象变量的运行时错误'91'

错误:“对象变量或带块变量未设置”

我得到的分配“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由调试器(在第一个ElseIf下)加以限制。我真的很感激任何帮助。

+0

我认为你的问题在下面的答案中突出显示(即你需要“设置”任何对象变量)。另一个需要考虑的事情是去除“GoTo”结构。它很难遵循代码,并可能产生意想不到的后果。您应该能够使用嵌套if语句实现相同的结果。 – Kyle

+0

谢谢。没有他们就很容易得到。我在VBA中寻找一个“休息”实现,而GoTo是我发现的第一个,但我不想养成坏习惯。 –

回答

2

尝试用

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

,并确保您的所有范围的东西。不仅是这条线。

+1

修好了!谢谢。 –

+0

欢迎。请确保在代码的其他位置设置“wtCell”。 – Vityata

相关问题