2016-12-06 13 views
0

MSAccessから、私はXLSシートを作成して移入しています。すべてが期待どおりに機能しています。最後のステップとして、 "0"の値を ""で置き換えるためにXLSをクリーンアップしたいと思います。Excel Automation from MSAccess - VBAを使用してCharsを置き換えますか?

XLSマクロからのモデルは、私は次のことをしようとしましたが、MSAccessをVBAからオブジェクト必要なのErr MSGを生成します。

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

誰もが私が何であったか言っているように私は答えを追加しません私は 'Sheets(4)'というシートを 'wks4'として作成していますか? 'wks4 = wbk.ActiveSheet'を' wks4.Name = "Item Detail" 'を使用してシートを作成するときに設定した通りに' Set wks4 = wbk.ActiveSheet'を削除するだけです。また、 'Item Detail'がまだ存在していないことを確認するコードを追加する必要があります。 –

答えて

4

Selectionアクセスオブジェクトモデルにオブジェクトが存在しないため、Excelにネイティブです。あなただけですべてのSelectに頼る避けるために、これを実行する必要が

How to avoid using Select in Excel VBA macros

は、ランタイムエラーの主な原因であるSelectActivateに頼って回避する方法について良い情報はこちらを参照してください。

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 

しかし、一般的には、リンクされた回答に記載されている理由からは好ましくありません。

初期/後期バインディング注:あなたは、you''reはxlWholexlByRowsなどの「レイトバインディング」およびExcelの定数を使用してExcelのライブラリへの参照を追加していない場合

は使用できません。このコンテキストでは、これらはデフォルトの値0 /空のバリアント型の宣言されていない変数としてコンパイルされます。

(注意:潜在的に、コンパイルからこのコードを防止し、ランタイムの前に、エラーのこの種を警告しますOption Explicitを使用して、それが簡単に&修正を診断すること)の実際の値から、これはエラーを発生させることができ

xlWholeは1で、xlByRowsはあなたが遅延バインディングを使用している場合は、あなたのモジュールまたはプロシージャの先頭にこれらを追加するも1です:

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

定数の長い値は、特定の定数のアプリケーションVBEのオブジェクトエクスプローラで参照できます。将来のユーザーのための良いメモ。 –

2

Selectを完全に取り除き、オブジェクトで直接作業してください。

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

これがうまくいかない場合は、早送りまたは晩期バインディングを使用している場合は教えてください。

+0

このアプローチでは、「範囲外の下付き文字」エラーが発生します。私はLate vs Early differentiationについてはっきりしていませんが、上記の私のモジュールのXLS宣言行を追加しました。 - ありがとう –

+1

@ MarkPelletierあなたはExcelライブラリへの参照を追加しましたか?そうでない場合は、Excelの定数である 'xlWhole'と' xlByRows'を明示的に 'Dim'または' Const'する必要があります。 –

+1

@MarkPelletier - Excel定数の寸法を決めるもう1つの方法は、 VBE for Excelのオブジェクトブラウザでこれを調べる必要があります。 [Early vs Late Binding](https://support.microsoft.com/en-us/kb/245115)は重要な違いであり、それぞれに広告/不利点があります。引数の問題を引き起こしているExcelのレイトバインディングを使用しています。アーリーバインディングを使用することができれば、全体的にはるかに優れているので、そうしてください。 –

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は、 "0"の値をチェック/クリーンアップするために複数の列を持つ30K +レコードを持つことができます... –

関連する問題