2016-06-09 25 views
0

So habe ich ein Problem in Bezug auf ein Arbeitsblatt. Ich beabsichtige, ein Eingabefeld zu öffnen, wenn ich in der Arbeitsmappe eine leere Zelle in Spalte B finde, damit ich den leeren Zellenwert eingeben und ändern kann. Ich bin jedoch einen Fehler bekommen (Erste Abonnement außer Reichweite sagte, und ich änderte es, jetzt heißt es application/Objekt definiert Fehler) auf dieser Linie:
For i = 0 To Sheets(j).Cells(Rows.Count, i).End(xlUp).RowMit Bezug auf Arbeitsblatt

Code:

 
Dim Country As Variant 
Dim Capital As Variant 
Dim CapitalValue As Variant 
Dim i As Integer 
Dim j As Integer

' Select *first line of data* Range("B1").Select ' Loop to stop when an empty cell is reached. For j = 1 To Worksheets.Count j = ActiveSheet.Index Range("B1").Select For i = 0 To Sheets(j).Cells(Rows.Count, i).End(xlUp).Row 'Select the Country Cell ActiveCell.Offset(i, 0).Select CapitalValue = ActiveCell.Value 'If Country is empty If CapitalValue = "" Then MsgBox ("No more Capitals") Else 'Input Capital values CapitalValue = ActiveCell.Value Country = ActiveCell.Offset(0, -1).Value Capital = InputBox("Capital of " & Country, "Capital Input") CapitalValue = Capital End If Next i Next j

Grüße

+0

Ich denke, es ist weil du ich verwenden zweimal 'Für i = 0 To Sheets (j) .Cells (Rows.Count, intColNumber ) .End (xlUp) .Row' –

+0

Die Sheets(). Cells() -Methode muss Argumente größer als 0 haben. 'Sheets (j) .Cells (Rows.Count , i +1) .End (xlUp) .Row' – JerryT

Antwort

0

tun, wenn Sie möchten, Wiederholen Sie dies über alle Arbeitsblätter (wie die For j = 1 to Worksheets.Count Linie würde vorschlagen) Sie sollten j in der nächsten Zeile zu ActiveSheet.Index nicht ändern, vor allem, da Ihr Code tatsächlich keine Arbeitsblätter an irgendeinem Punkt ändert.

Ihr Range("B1").Select empfiehlt Ihnen, eine Schleife über die Spalte B wollen für diese Werte suchen, so ersetzen Sie For i = 0 To Sheets(j).Cells(Rows.Count, i).End(xlUp).Row mit For i = 1 To Sheets(j).Cells(Sheets(j).Rows.Count, "B").End(xlUp).Row wie Sie wissen müssen, wo mit i zu starten. Ich habe Zeile 1 angenommen, aber Sie müssen möglicherweise ändern, wenn Sie eine Kopfzeile auf 2 haben.

Sie wählen dann die Zellen i Zeilen unterhalb der aktiven Zelle. Zum ersten Mal in der Schleife bewegt sich dies von Zeile 2 zu Zeile 3. Beim zweiten Mal springen Sie von 3 nach 5, da ich von 1 auf 2 erhöht habe. Am besten vermeiden Sie Select wo möglich, da es die Dinge verlangsamt auf jeden Fall. Da Sie festgestellt haben Sie leere Werte dann den Benutzer auffordern, für die Details finden wollen, würde ich folgendes stattdessen vorschlagen:

For j = 1 to Worksheets.Count 
    For i = 1 To Sheets(j).Cells(Sheets(j).Rows.Count, "B").End(xlUp).Row 
     If Sheets(j).Range("B" & i).Value = "" Then 
      Country = Sheets(j).Range("A" & i).Value 
      Sheets(j).Range("B" & i).Value = InputBox("Please enter the capital for country " & Country, "Capital Input") 
     End If 
    Next 
Next 
+0

Dies funktioniert perfekt und löste auch das Problem, auf das ich stieß (Die Schleife auf den leeren Zellen und Arbeitsblättern). Darf ich dich was fragen? Warum verwenden Sie den Variablennamen nicht bei "Weiter"? Ich sehe, dass es in diesem Fall in beide Richtungen funktioniert. Das bedeutet, dass Sie sie nicht wirklich beziehen müssen? Danke @Dave – Tiago

+0

Ich habe sie nicht verwendet, da sie nicht notwendig sind; Die Code-Struktur weist dem nächsten 'For' das' Next' zu, das noch keins hat, obwohl Sie es aus Gründen der Lesbarkeit hinzufügen können. – Dave

0

an der Spitze des Makros, stellen Sie Ihren Bogen zu einem Namen wie

Dim a as worksheet 

Set a = Sheets("yoursheetname") 

Dann, wenn Sie auf diese spezielle Blatt beziehen möchten nur

a.Range("a1").select 

Angenommen, Ihre leere Werte sind in Spalte A verwenden, würde ich so etwas wie

Sub findBlanks() 
    Dim a As Worksheet 
    Set a = Sheets("Sheet1") 

    For x = 2 To a.Range("a1048576").End(xlUp).Row 'find last row 
     If a.Range("a" & x).Value = "" Then 
      MsgBox ("This cell is blank!!!") 
     End If 
    Next x 
End Sub