2016-12-06 43 views
0

從MSAccess,我創建並填充XLS工作表。所有工作都按預期工作。作爲最後一步,我想清理XLS以用「」替換「0」值。從XLS宏MSAccess中的Excel自動化 - 使用VBA替換Chars?

造型,我嘗試以下,但MSACCESS VBA產生所需的對象錯誤消息:

Dim appXLS As Object 
Dim wbk As Object 
Dim wks1 As Object 
Dim wks2 As Object 
Dim wks3 As Object 
Dim wks4 As Object 

Set appXLS = CreateObject("Excel.Application") 
Set wbk = appXLS.Workbooks.Add(1) 

appXLS.Visible = True 
wbk.Activate 

Set wks4 = wbk.Sheets.Add(After:=wbk.Sheets(wbk.Sheets.COUNT)) 
wbk.Sheets(4).NAME = "Item Detail" 
Set wks4 = wbk.ActiveSheet 

'>>populate and format the XLS from MSAccess VBA 
'... it's working as required 

'Clean-Up: 

wks4.Range("P:P").Select 
Selection.Replace What:="0", Replacement:="", LookAt:=xlWhole, _ 
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ 
    ReplaceFormat:=False 

任何建議,以糾正MSACCESS VBA這種做法?

+0

我不會添加一個答案,因爲每個人都在說我是什麼要說,但 - 我認爲'表(4)'是您創建爲'wks4'的表單?你可以使用'wks4.Name =「Item Detail」'並且當你創建表單時移除Set wks4 = wbk.ActiveSheet'。您可能還需要添加一些代碼來檢查「商品明細」是否已經存在。 –

回答

4

Selection對象在Access對象模型中不存在,它是Excel的本地對象。

看到這裏就如何避免依賴SelectActivate這是運行時錯誤的主要原因良好的信息:

How to avoid using Select in Excel VBA macros

你只需要做到這一點,以避免依賴Select可言:

wks4.Range("P:P").Replace What:="0", Replacement:="", LookAt:=xlWhole, _ 
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ 
    ReplaceFormat:=False 

你可以做交替:

wks4.Range("P:P").Select 
appXLS.Selection.Replace What:="0", Replacement:="", LookAt:=xlWhole, _ 
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ 
    ReplaceFormat:=False 

但是,這通常不是首選的原因列在鏈接的答案。

早/晚綁定注:

如果你還沒有,使用的特殊照顧「後期綁定」和Excel常量像xlWholexlByRows添加參考Excel的庫不可用。在這種情況下,這些將被編譯爲類型變體的未聲明變量,默認值爲0 /空。

(提醒:使用Option Explicit將阻止編譯此代碼,並提醒您這種運行之前的錯誤,有可能使其更容易診斷0​​修復)

這會引發錯誤,因爲實際值xlWhole爲1,xlByRows也是1.如果您使用後期綁定,然後在你的模塊或程序的頂部添加這些:

Const xlByRows As Long = 1 
Const xlWhole As Long = 1 
+1

通過瀏覽Application VBE中的對象瀏覽器中的特定常量可以找到常量long值。對於未來的用戶來說很好。 –

2

完全擺脫Select並直接與對象合作。

wks4.Range("P:P").Replace What:="0", Replacement:="", LookAt:=xlWhole, _ 
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ 
    ReplaceFormat:=False 

如果這不起作用,讓我知道你是否使用早期或晚期綁定。

+0

我用這種方法得到「下標超出範圍」錯誤。我不清楚晚期和早期的差異,但我確實在我的模塊中加入了額外的XLS聲明行。 - 謝謝 –

+1

@MarkPelletier是否添加了對Excel庫的引用?如果不是,則需要顯式地「昏暗」或「常量」Excel常量:'xlWhole'和'xlByRows' –

+1

@MarkPelletier - 標註Excel常量的另一種替代方法是對該常量使用直接長類型值。您需要在VBE for Excel的對象瀏覽器中查看。 [早期與晚期綁定](https://support.microsoft.com/en-us/kb/245115)是一個重要的區別,每個都有廣告/劣勢優勢。您正在使用Excel的後期綁定,導致您的問題與參數。如果你可以使用Early binding,那麼整體效果會更好。 –

2
Dim xlApp As Object 
Dim xlBook As Object 
Dim xlSheet As Object 
Dim xlRange As Object 
Dim cell As Object 

Set xlApp = CreateObject("Excel.Application") 
Set xlBook= xlApp.Workbooks.Open(sFile) 
Set xlSheet = xlBook.Sheets(1) 

With xlSheet 
    Set xlRange =.Range("P1:P10000") 
    For Each cell In xlRange 
     If cell.Value= 0 Then 
      cell.Value = vbNullString 
     End If 
    Next cell 
End With 

這是一個粗略的例子,但它會是一個足夠好的模板,讓你得到你所需要的。

+1

作爲最後的手段,我會記住這一點。 ;-)我的XLS可以有30K +記錄,有多列檢查/清除「0」值... –