2016-06-15 3 views
3

Я надеюсь, что никто не будет оскорблен мной, задав вопрос о , работающем. Мне сказали, однако, SO тоже для обучения, поэтому я надеюсь, что все будет хорошо.Попытка понять разницу

Я хочу, чтобы попытаться понять разницу между двумя кодами, которые я написал, одна работающая, одна неудачная.

Этот код неудачу версия:

Sub Lowercase() 
Dim Seq As Range 
Set Seq = Range(Range("A2"), ActiveCell.SpecialCells(xlLastCell)) 
    For Each cell In Seq 
    cell.Value = LCase(cell.Value) 
    Next cell 
End Sub 

Он положить вещи в нижнем регистре просто отлично, но зацикливается, пока я не закрыть или минимизировать Excel. Думая на старом коде я изменил код так:

Sub Lowercase() 
Dim Seq As Range, v As Variant 
Dim L As Long, i As Long 
Set Seq = Range(Range("A2"), ActiveCell.SpecialCells(xlLastCell)) 
    For Each cell In Seq 
     v = cell.Value 
     L = Len(v) 
     For i = 1 To L 
      cell.Value = LCase(cell.Value) 
     Next i 
    Next cell 
End Sub 

Это прекрасно работает (немного медленно, но хорошо) и я не понимаю, почему.

Файлы Я пытаюсь преобразовать выглядеть (Строка A2 имеет тенденцию продолжаться 600 до 1200 символов):

enter image description here

Однако я до сих пор называют все клетки, и я не знаю, почему давая ячейке значение, которое фактически прекращает цикл. Как, но я уверен, что я ошибаюсь, у меня такое чувство, что я все еще не изменил часть кода «Для каждой ячейки/следующей ячейки».

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

+0

Я не могу воспроизвести вашу проблему. Ваша первая версия отлично подходит для меня, без бесконечного цикла (и ваша вторая версия кажется бессмысленной). Можете ли вы сделать воспроизводимый пример (который также объясняет макет листа)? –

+0

Сравнивая две версии, кажется, что должна быть хотя бы одна ячейка со свойством «Len (cell.Value) = 0', но по какой-либо причине« LCase (cell.Value) »не возвращается. Я понятия не имею, что может вызвать это. Циркулярные ссылки? Что-то странное с неустойчивыми UDF? Коррумпированная книга? Пока вы не сделаете его воспроизводимым, не так много. –

+0

Отредактировано, чтобы показать образец листов Excel. Первые коды дают мне «синий поворот мысли» с несколькими файлами для меня, поэтому он воспроизводится для меня. Возможно, я неверно истолковываю то, что вы подразумеваете под «воспроизводимым». Я не знаком с такими терминами, как «volatile UDF». – GMV

ответ

0

Кажется, что-то странное взаимодействие (между тем, что я не знаю) происходит с вашей таблицей. Следующее не покажет, что такое взаимодействие, но может подавить их. Кроме того, ваш код имеет эффект замены любых пустых ячеек в диапазоне строками нулевой длины. Я не могу представить, что в этом есть какой-то момент, поэтому я защищаю его. Я также захватил последнюю использованную ячейку в Row2 более надежным способом:

Sub Lowercase() 
    Dim Seq As Range, Cell As Range, LastCell As Range 

    Application.ScreenUpdating = False 
    Application.EnableEvents = False 
    Application.Calculation = xlCalculationManual 

    Set LastCell = Cells(2, Columns.Count).End(xlToLeft) 'last cell in Row 2 with data, assuming that not all cells in row have data 
    Set Seq = Range("A2", LastCell) 
    For Each Cell In Seq 
     If Len(Cell.Value) > 0 Then Cell.Value = LCase(Cell.Value) 
    Next Cell 

    Application.ScreenUpdating = True 
    Application.EnableEvents = True 
    Application.Calculation = xlCalculationAutomatic 

End Sub 
+0

Это улучшает его, но теперь указатель мыши мерцает, когда он запускает весь набор макросов. Позвольте мне обновить коды сверху. – GMV

+0

@GMV Если макрос вызывается в цикле - возможно, вы можете перенести «Application.ScreenUpdating = False» и т. Д. С этого субпользователя на вызывающего. –

+0

@ Обновлены коды сверху. – GMV