2017-01-23 59 views
0

我發現下面的宏清理60K +樣式的工作簿:https://stackoverflow.com/a/8933399由於ActiveWorkbook.Styles返回無「援引已經與其客戶端斷開連接的對象」

我每次運行這個宏的Excel與錯誤崩潰「線程For Each styleObj In wb.Styles上調用的對象與客戶端斷開連接」。這會導致styleObj爲Nothing(即null)並使腳本崩潰。

我在做什麼錯? wb.Styles.Count線完美地工作,但下面的所有內容都會中斷。我使用Excel 2010中

即使是簡單的代碼,這樣的失敗在的開始for循環以同樣的方式:

Sub KillCustomStyles() 
Dim mpStyle As Style 
    For Each mpStyle In ActiveWorkbook.Styles 
     If Not mpStyle.BuiltIn Then 
      mpStyle.Delete 
     End If 
    Next mpStyle 
End Sub 

回答

0

假如你堅持你鏈接的例子,它會工作。 如果你這樣做的直接的方式...

For Each mpStyle In ActiveWorkbook.Styles 
... 
    mpStyle.Delete 

...你正在改變非常收集你迭代通過,即因你而改變其基礎的循環變得無效。

相反,你應該創建一個樣式單獨收集:從鏈接的SO職位1:

Sub KillCustomStyles() 
Dim styleObj As Style 
Dim dict As New Scripting.Dictionary ' <- from Tools/References.../"Microsoft Scripting Runtime" 
Dim aKey As Variant 
Dim i As Integer 
Dim Str As String 

For Each styleObj In ActiveWorkbook.Styles 
    Str = styleObj.NameLocal 
    i = IIf(styleObj.BuiltIn, 1, 0) 'if builtin: 1, else 0 
    Call dict.Add(Str, i) ' First time: adds keys 
Next styleObj 

For Each aKey In dict 
    If dict.Item(aKey) = 0 Then '0: not builtin 
     ActiveWorkbook.Styles(aKey).Delete 
    End If 
Next aKey 

End Sub 

此代碼是近1繪製。看起來很銳利,你會發現首先有一個充滿風格的單獨集合,你可以遍歷這個集合,但是從wb.Styles中刪除。