2016-11-22 1 views
2

Je suis en train d'apprendre Excel VBA pour une tâche d'école. J'ai assigné un objet "wtCell" pour être une certaine cellule dans une certaine feuille de travail basée sur certaines conditions.Excel VBA: Erreur d'exécution '91' lors de la seconde affectation à la variable Objet

Erreur: « Variable objet ou variable bloc fixe pas »

Je reçois une erreur sur la secondes affectation de « 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 

Je ne peux pas comprendre comment obtenir une ligne en gras dans le code, mais il est cette ligne:

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

qui obtient Highlig hted par le débogueur (sous le premier ElseIf). J'apprécierais vraiment toute aide.

+0

Je pense que votre problème est mis en évidence dans la réponse ci-dessous (c'est-à-dire que vous devez "Définir" une variable d'objet). Une autre chose à considérer comme une pratique générale est d'enlever la structure "GoTo". Cela crée un code difficile à suivre et pourrait avoir des conséquences imprévues. Vous devriez être capable d'atteindre le même résultat avec des instructions if imbriquées. – Kyle

+0

Merci. C'était assez facile de s'en passer sans eux. Je cherchais une implémentation de "break" dans VBA et GoTo était le premier que j'ai trouvé, mais je ne voudrais pas avoir une mauvaise habitude. –

Répondre

2

Essayez avec

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

Et assurez-vous que vous définissez toutes les gammes à quelque chose. Pas seulement cette ligne.

+1

Cela l'a réparé! Merci. –

+0

Bienvenue. Assurez-vous de définir 'wtCell' dans les autres parties de votre code. – Vityata