2013-01-21 4 views
0

У меня есть следующий макрос, который добавляет 0s к идентификационным номерам, пока они не будут содержать 7 чисел. Я использовал его бесчисленное количество раз, и он всегда работал без сбоев, пока сегодня он не начал работать, и часть кода For i = 1 To endrow - 1 подсвечивается каждый раз, и я не могу отладить проблему. Весь код.Ошибка кода Excel VBA

Sub AddZeroes() 

'Declarations 
Dim i As Integer, j As Integer, endrow As Long 
'Converts the A column format to Text format 
Application.ScreenUpdating = False 
Columns("A:A").Select 
Selection.NumberFormat = "@" 
'finds the bottom most row 
endrow = ActiveSheet.Range("A1").End(xlDown).Row 
'selects the top cell in column A 
ActiveSheet.Range("A1").Select 

'loop to move from cell to cell 
For i = 1 To endrow - 1 
    'Moves the cell down 1. Assumes there's a header row so really starts at row 2 
    ActiveCell.Offset(1, 0).Select 
    'The Do-While loop keeps adding zeroes to the front of the cell value until it hits a length of 7 
    Do While Len(ActiveCell.Value) < 7 
     ActiveCell.Value = "0" & ActiveCell.Value 
    Loop 
Next i 
Application.ScreenUpdating = True 
End Sub 
+4

Какова ценность ** endrow ** в точке, которую она останавливает? Кроме того, если формат предназначен только для отображения, тогда вся процедура может быть заменена на «Столбцы» («A: A»). NumberFormat = «0000000» ' – SeanC

+0

. Последняя часть - это остановка в последней строке, обычно он переходил бы на одну дополнительную строку вниз и добавлял ячейку всего 7 0. -1 указывает, что он останавливается в самой последней ячейке. – user1958651

+0

, когда код подсвечивается, чтобы указать на ошибку, что это значение ** endrow ** в этой точке? – SeanC

ответ

3

Не уверен, что вызывает ошибку - но хотел бы предложить другой подход:

sub addZeros() 
    Application.ScreenUpdating = False 
    ' start at row 2 since OP said there's a header row 

    Dim c as Range 
    for each c in Range("A2", [A2].End(xlDown)) 
    c.Value = "'" & Format(c.Value, "00000000") 
    next c 
    Application.ScreenUpdating = True 
end sub 

Немного более компактный ...

Обратите внимание, что я добавляю в «"»апостроф чтобы Excel обрабатывал значение ячейки как строку. Это безопасный способ убедиться, что нули остаются ...

EDIT: избавился от последнего. Выберите, чтобы показать, что это можно сделать, и, как правило, это хорошая практика, как указано в комментариях.

+0

+1: для избавления от большей части .Выбрать и активно * ссылки – RBarryYoung

+0

Спасибо @RBarryYoung. Я могу избавиться от последнего select с 'для каждого c в Range (« A2 », [A2] .End (xlDown))». Это было бы еще короче и чище. – Floris