2017-02-08 9 views
1

Windows 10でMS Access 2013内で作業していますが、ディスク上にExcelファイルを開き、列の書式設定や一部の列を変更するSubを作成しようとしています保存して終了します。 Subは実行されますが、問題は、.Quitコマンドの後でも "EXCEL.EXE"が実行され続け、そのSubへの後続の呼び出しによって実行時エラーが発生するという問題です。 サブを実行した後にAccessを閉じると、タスクマネージャで「EXCEL.EXE」が消えますが、データベースを「圧縮して修復する」場合は表示されません。Excel.Applicationオブジェクト.Quitを実行するとEXCEL.EXEが実行される

私は、単にディスク上にExcelファイルを開き、すべての列の幅を「自動幅」に変更した後、正常に動作し、「EXCEL.EXE」を実行しないで。

私は間違っていますか? VBAで「EXCEL.EXE」が正しく終了することを確認することは可能ですか?

DimsとNothing、Workbook Closesなどのさまざまな行順序を試しました。また、これを解決する方法についてはここや他のサイトで検索しましたが、2時間後には私が見た唯一の提案VBAはThisWorkbook.Saved = Trueのようなものを使用していますが、その前後で試してみました。効果を止めてください。 これ以外にも、私はVB.NETや他の環境のためのソリューションしか見つけられません。

お読みいただきありがとうございます。

コードは、次のとおりです。

Sub changeXLcolumnFormatting() 

Dim XL As Object 
Set XL = CreateObject("Excel.Application") 
XL.Visible = False 
XL.DisplayAlerts = False 
XL.Workbooks.Open "C:\Users\640344\Desktop\rawDataTest.XLSX" 
Dim sht As Worksheet 

With XL 
Set sht = ActiveWorkbook.Worksheets(1) 

Dim rng As Range 
Dim i As Integer, j As Integer 

field_names = Split("datasistema|Data de Registo|Data Registo CMVM", "|") 
sht.Select 
end_of_table = sht.UsedRange.Columns.Count 

For j = 0 To UBound(field_names) 
    For i = 1 To end_of_table 
     Set rng = sht.Cells(1, i) 
     If InStr(rng.Text, field_names(j)) > 0 Then 
      sht.Columns(i).NumberFormat = "yyyy-mm-dd HH:MM:ss" 
     End If 
    Next i 
Next j 

End With 

Set rng = Nothing 
Set sht = Nothing 
XL.ActiveWorkbook.Close (True) 

XL.Quit 
Set XL = Nothing 

End Sub 
+0

あなたがマクロを起動する前に、あなたが他の 'Excel'を持っていないことを確認していますランニング? – Vityata

+0

'XL.Quit'の代わりに' Application.Quit'を追加すれば、どのように動作するかを見ることができます。 – Vityata

+0

また、変更したワークブックを明示的に保存してから保存してください。 –

答えて

1

宣言して、特定のワークブックオブジェクトを使用する - あなたはワークシート範囲のためにそうであるように、このように:

Dim xls     As Excel.Application 
    Dim wkb     As Excel.Workbook 
    Dim wks     As Excel.Worksheet 
    Dim rng  As Range 
    
    Set xls = New Excel.Application 
    Set wkb = xls.Workbooks.Open("c:\test\workbook1.xlsx") 
    Set wks = wkb.Worksheets(1) 
    Set rng = wks.Range(<something>) 
    
    ' Do stuff. 
    wks.Name = "My New Name" 
    With rng 
     ' Do more. 
    End With 

    wkb.Close True 
    
    Set rng = Nothing 
    Set wks = Nothing 
    Set wkb = Nothing 
    
    xls.Quit 
    
    Set xls = Nothing 

また、ドン」に選択してください。これは目に見える用途にのみ使用します。代りに範囲を定義してください。


CinetykのEDIT:@Gustavの適応症を使用して

、私が望んでいて、問題を解決したコードは次のとおりです。ここで

Sub changeXLcolumnFormatting() 

Dim XL As Excel.Application 
Dim sht As Excel.Worksheet 
Dim wkb As Excel.Workbook 
Dim rng As Range 

Set XL = New Excel.Application 
XL.Visible = False 
XL.DisplayAlerts = False 

Set wkb = XL.Workbooks.Open("C:\Users\640344\Desktop\rawDataTest.XLSX") 
Set sht = wkb.Worksheets(1) 

Dim i As Integer, j As Integer 

field_names = Split("datasistema|Data de Registo|Data Registo CMVM", "|") 
end_of_table = sht.UsedRange.Columns.Count 

For j = 0 To UBound(field_names) 
    For i = 1 To end_of_table 
     Set rng = sht.Cells(1, i) 
     If InStr(rng.Text, field_names(j)) > 0 Then 
      sht.Columns(i).NumberFormat = "yyyy-mm-dd HH:MM:ss" 
     End If 
    Next i 
Next j 

wkb.Close (True) 
Set rng = Nothing 
Set sht = Nothing 

XL.Quit 
Set XL = Nothing 

End Sub 
+0

グスタフ、そうした。どうもありがとう。あなたの答えを見れば分かります。オブジェクトを明示的に宣言すると、それを閉じることができ、何も明示的に設定することはできません。私はいくつかの変数を使用して暗黙のうちに定義されたものを残していたので、それらは「閉じられていませんでした。おそらくメモリ内のリンクが残っていました。 私はVBAを学んでいます。これは良いレッスンでした。ありがとうございました。また、読んでコメントする時間がかかった皆様に感謝します。 – Cinetyk

1

は、その問題を解決するためのファンシーな方法です - with new Excel.Applicationを使用して:C#の

Option Compare Database 
Option Explicit 

Public Sub TestMe() 

    Dim wkb  As Object 
    Dim wks  As Object 

    With New Excel.Application 

     Set wkb = .Workbooks.Open("C:\Users\vityata\Desktop\myTest.xlsx") 
     Set wks = wkb.Worksheets(1) 

     wkb.Close True 

     Set wks = Nothing 
     Set wkb = Nothing 
     .Quit 

    End With 

End Sub 

これは持つ規格であります、VBAではごく少数の人が使用しています。


CinetykのEDIT:Vityataの兆候を使用して

、私が意図したとおりに動作するコードは次のとおりです。

Option Compare Database 
Option Explicit 

Public Sub changeXLcolumnFormattingV2() 

Dim sht As Object 
Dim wkb As Object 

With New Excel.Application 
    .Visible = False 
    .DisplayAlerts = False 

    Set wkb = .Workbooks.Open("C:\Users\640344\Desktop\rawDataTESTING.XLSX") 
    Set wks = wkb.Worksheets(1) 

    field_names = Split("datasistema|Data de Registo|Data Registo CMVM", "|") 
    end_of_table = wks.UsedRange.Columns.Count 

    For j = 0 To UBound(field_names) 
     For i = 1 To end_of_table 
      Set rng = wks.Cells(1, i) 
      If InStr(rng.Text, field_names(j)) > 0 Then 
       wks.Columns(i).NumberFormat = "yyyy-mm-dd HH:MM:ss" 
      End If 
     Next i 
    Next j 

    wkb.Close True 

    Set wks = Nothing 
    Set wkb = Nothing 
    .Quit 

End With 

End Sub 
+0

これも、ありがとう! – Cinetyk

+0

ようこそ、@Cinetyk。残念なことに、 'Using()'がオブジェクトを完全に破棄して解放することに注意するC#とまったく同じように動作しませんが、それでもいいです。 – Vityata

+1

しかし、MS Accessを実行すると、excel.exeはそのコードを使用した後にバックグラウンドで残っていないので、私にとってはうまくいきます。 – Cinetyk