2013-02-24 2 views
0

Я использовал следующий код, чтобы скопировать столбец из одного листа на другой, а затем заменить пустые ячейки с нулевым значением:Excel не отвечает после запуска макроса

'Copying If Employee 
sourceSheet.Activate 
Range(Cells(2, 7), Cells(Rows.Count, 7).End(xlUp)).Select 
Selection.Copy 
destSheet.Activate 
Range("E2", Cells(Rows.Count, 7)).PasteSpecial 

For Each cell In Range("E2", Cells(Rows.Count, 5)) 
If Len(cell.Value) = 0 Then 
    cell.Value = "No" 
End If 

Когда я заменить на заявление с Range("E2", Cells(500,5)) его работает нормально.

В чем может быть проблема? Я не мог понять. Кто-нибудь может мне с этим помочь?

+1

вы можете сделать MsgBox (Rows.Count), чтобы выяснить, какое значение в настоящее время устанавливается. Я постараюсь избежать использования Rows.Count. Есть намного лучшие методы поиска конца рабочего листа. – Sam

ответ

2

Попробуйте

For Each cell In Range("E2", Cells(destSheet.UsedRange.Rows.Count, 5)) 
If Len(cell.Value) = 0 Then 
    cell.Value = "No" 
End If 

или более элегантно (и, вероятно, намного быстрее),

Dim calcStatus As XlCalculation 
calcStatus = Application.Calculation 

Application.ScreenUpdating = False 
Application.Calculation = xlCalculationManual 

For Each cell In Range("E2:E" & destSheet.UsedRange.Rows.Count) 
If Len(cell.Value) = 0 Then 
    cell.Value = "No" 
End If  

Application.Calculation = calcStatus 
Application.ScreenUpdating = True 
+1

Будьте осторожны при использовании'UsedRange.Rows.count ', чтобы получить последнюю строку. Если ваша первая ячейка была E100, а las - E115, этот метод даст вам строку 15 в качестве результата вместо строки 115. – CaBieberach

+0

Это правда. Вы можете найти более надежные решения для поиска LastRow на веб-сайте Sid: http://www.siddharthrout.com/2012/10/02/find-last-row-in-an-excel-sheetvbavb-net/ – JustinJDavies

8

Excel 2007 имеет 1 048 576 строк.

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

  2. Каждый раз, когда вы назначаете ячейке значение No, Excel пересчитывает лист, обновляет экран и может вызывать рабочие листы/события рабочей книги/ячейки. Все это, прежде чем оценивать следующую ячейку в следующей ячейке. Если у вас нет ОГРОМНОГО количества данных, в этом примере это будет происходить через пару сотен tousand раз.

500 ячеек намного меньше и их можно обрабатывать без проблем.

Edit:

Адресности последнюю строку.

Если вы хотите, чтобы получить последнюю видимые строку с данными, а затем использовать:

With Workbooks(myWorkbook).Worksheets(myWorksheet) 
    LastRow = .Cells(.Rows.Count, "E").End(xlUp).Row 
End With 

Если вы хотите, чтобы получить последнюю строку с данными, независимо от того, что быть видимыми или скрытыми, а затем использовать:

With Workbooks(myWorkbook).Worksheets(myWorksheet) 
    LastRow =.Range("E2").EntireColumn.Find("*", .Cells(1, .Range("E2").Column), , , xlByRows, xlPrevious).Row 
End With 

Для получения дополнительной информации Rondebruin имеет хороший сайт с более подробной информацией о адресности Лас строки/столбца.

+0

+1 bob on - @Pramod CaBieberach абсолютно корректен - вы перебираете огромное количество данных, поэтому приложение останавливается - следуйте одному из примеров кода в других решениях, чтобы избежать подхода кувалды – whytheq

2

Как Cabierberach справедливо указывает, текущие рутинные петли над 1M линий. В дополнении к его и решению JustinJDavies, рассмотреть этот хак:

Вместо того, чтобы устанавливать значения 0 в No, вы можете просто изменить формат, если клетки для отображения No каждый раз, когда значение 0. Это можно сделать без макроса, применяя этот настраиваемый формат к ячейкам: 0,-0,"No",@. Возможно, вам понадобится заменить 0 на ваш формат по умолчанию - см. this link для подробного описания формата пользовательского номера.

Если вы хотите сделать это в VBA, эта строка будет достаточно:

Range("E2:E" & Cells(Rows.Count, 1).End(xlUp).Row).CustomFormat = "0,0,""No"",@" 
Смежные вопросы