2016-06-09 75 views
0

所以我在談論工作表時遇到了問題。我打算在整個工作簿中找到列B上的空單元格時打開輸入框,以便輸入和更改空單元格值。 我,然而,得到一個錯誤(第一個是說的訂閱超出了範圍,我改變了它,所以現在說應用/對象定義的錯誤),在這條線:
For i = 0 To Sheets(j).Cells(Rows.Count, i).End(xlUp).Row參考工作表

代碼:

 
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

問候

+0

我認爲這是因爲你正在使用我兩次'對於i = 0到表(j ).Cells(Rows.Count, intColNumber ).End(xlUp).Row' –

+0

Sheets().Cells()方法的參數必須大於0. 'Sheets(j).Cells(Rows.Count ,i +1).End(xlUp).Row' – JerryT

回答

0

如果你想在所有工作表中重複此操作(如For j = 1 to Worksheets.Count行建議),您不應該在ActiveSheet.Index的下一行中更改j,尤其是因爲您的代碼實際上並未在任何時候更改工作表。

Range("B1").Select意味着你要循環B列查找這些值,所以用For i = 1 To Sheets(j).Cells(Sheets(j).Rows.Count, "B").End(xlUp).Row更換您的For i = 0 To Sheets(j).Cells(Rows.Count, i).End(xlUp).Row,因爲你需要知道在哪裏有i開始。我假設第1行,但如果您將標題行設置爲2,則可能需要更改該行。

然後,您選擇活動單元下方的單元格i行。第一次循環時,這會將你從第2行移動到第3行。第二次你將從3跳到5,因爲我已經從1增加到2.最好避免Select一般情況下儘可能減少下降的東西任何狀況之下。既然你已經注意到你想找到空值,則提示輸入信息用戶,我建議以下代替:

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

這很好地工作,它也解決了我遇到的問題(空單元格和工作表上的循環)。我能問你一些事嗎?你爲什麼不在「Next」中使用變量名?我發現在這種情況下,它可以同時工作。這意味着你實際上不需要引用它們?謝謝@Dave – Tiago

+0

我沒有使用它們,因爲它們沒有必要;代碼結構會將'Next'分配給最近沒有的'For',儘管如果需要爲了便於閱讀目的而添加它們。 – Dave

0

在宏的頂部,您的工作表設置爲一個名稱,如

Dim a as worksheet 

Set a = Sheets("yoursheetname") 

然後,當你想指的是具體的板材只使用

a.Range("a1").select 

假設你的空值在列A,我會做這樣的事情

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