2015-03-27 4 views
0

Так что я импортирую данные из книги в другую книгу. В рабочей книге, которая будет получать данные, у меня есть макрос (см. Ниже), который должен подсчитывать общее количество строк (от B13: lastrow) и добавлять комментарий с этим.
Ошибка времени выполнения только при запуске кода в changeevent

Я получаю ошибки времени выполнения -2147417848 (80010108) Автоматизация ошибка
Вызванный объект был отключен от клиентов.

Когда я использую Application.EnableEvents = False Я не получаю эти ошибки, однако макрос не будет работать. Я предполагаю, что это имеет какое-то отношение к ActiveSheet, который я использую?

Sub FindTotalAmountOfRowsInColumn() 
Dim startCol As String 
Dim startRow As Long 
Dim lastrow As Long 
Dim lastCol As Long 
Dim myCol As String 
Dim ws, ws2 As Worksheet 
Dim Rng As Range 
Dim cell As Range 

Application.ScreenUpdating = False 
Set ws2 = ActiveSheet 'Preserves a reference to the active sheet as ws2 
ThisWorkbook.Activate 'Makes this workbook the one that is displayed 

Set ws = ThisWorkbook.Sheets("Sheet1") 

With ws 
startCol = "B" 
startRow = 13 
lastrow = ws.Range(startCol & ws.Rows.count).End(xlUp).Row 
'lastCol = ws.Cells(2, ws.Columns.Count).End(xlToLeft).Column 
lastCol = ws2.UsedRange.Columns(ws2.UsedRange.Columns.count).Column 


myCol = GetColumnLetter(lastCol) 


Set Rng = ws.Range(startCol & startRow & ":" & myCol & lastrow) 


ws.Range("A8").Value = "ITEMCOUNT:" & Rng.Rows.count 

End With 
Application.ScreenUpdating = True 
End Sub 
+0

Правильно ли было бы предположить, что Sheet1 является листом, на который вы перехватываете событие изменения? –

+0

О да, прости. Таким образом, файл является «CIF LISTEN.xlsm», листом является «Sheet1». Это, кстати, работает, если я положил его в PreSave. – Niclas

+1

'Dim ws, ws2 As Worksheet' - это фактически устанавливает ws как тип Variant, вы должны использовать' Dim ws as Worksheet, ws2 As Worksheet' –

ответ

0

Вы создали бесконечный цикл, изменяя значение A8, таким образом, перезапуск событие Worksheet_Change листа1. Application.DisableEvents = False - это распространенный способ решения этой проблемы и работает в большинстве случаев. (В более сложных случаях могут использоваться другие вещи, такие как булевские триггеры). Основываясь на том факте, что вы ничего не говорите, я остаюсь предположить, что вы никогда не активировали события с Application.DisableEvents = True. Я тестировал локально, чтобы проверить и добиться эффекта, который я описал. Запустите следующий макрос для повторного включения события (если они все еще отключены):

Sub enabEvents() 
    Application.EnableEvents = True 
End Sub 

Затем убедитесь, что вы отключили события в начале вашего метода и повторно включить события в конце вашего метода.

Application.EnableEvents = False 
// 
// Your method code 
// 
Application.EnableEvents = True 
+0

Кажется, что теперь он работает с помощью aventevents и использует другие Dim As :) Спасибо. – Niclas

Смежные вопросы