2016-06-09 3 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

Я думаю, что это потому что вы используете я дважды 'Для я = 0 листам (J) .Cells (Rows.Count, intColNumber ) .END (xlUp) .Row' –

+0

Листы(). Клетки() метод должен иметь аргументы больше 0. 'Листы (J) .Cells (Rows.Count , i +1) .End (xlUp) .Row' – JerryT

ответ

0

Если вы хотите повторите это на всех листах (например, строка 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 с For i = 1 To Sheets(j).Cells(Sheets(j).Rows.Count, "B").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

Это работает отлично, и он также решил проблему, с которой я столкнулся после (цикл на пустых ячейках и листах). Могу я вас кое о чем спросить? Почему бы вам не использовать имя переменных в «Далее», я вижу, что в этом случае он работает в обоих направлениях. Это означает, что вам на самом деле не нужно ссылаться на них? Спасибо @Dave – Tiago

+0

Я не использовал их, поскольку они не нужны; структура кода назначит 'Next' последнему' For', который уже не имеет его, хотя вы можете добавить их, если вам нужно для удобства чтения. – Dave

0

в верхней части макроса, установите лист с именем, как

Dim a as worksheet 

Set a = Sheets("yoursheetname") 

Затем, когда вы хотите сослаться на этот конкретный лист просто использовать

a.Range("a1").select 

Предполагая, что ваши пустые значения в столбце А, я бы что-то вроде

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 
Смежные вопросы