2017-08-22 19 views
2

Outlook VBAマクロを実行するとExcelプロセスが停止しません。私はそれがいくつかのExcelのオブジェクト関数によって引き起こされたと思われるが、私は本当にどちらがわからない。 問題は、Excelブックが置かれているフォルダに複数の.tmpファイルを作成することによっても現れます。(私は思いますか?) Excelを開いて閉じるためのコードとExcelを使用するすべてのメソッドを投稿しますオブジェクト。.Quitの後でもExcelプロセスがまだ実行中です

Option Explicit 
Public xlApp As Object 
Public xlWB As Object 
Public xlSheet As Object 

Sub LeaveRequests() 
    Dim enviro As String 
    Dim strPath As String 
    Dim filePath As String 
    Dim bXStarted As Boolean 
    Dim i As Long 
    Dim j As Long 
    'Get Excel set up 
enviro = CStr(Environ("USERPROFILE")) 
'the path of the workbook 
filePath = enviro & "\AppData\Roaming\Microsoft\Outlook\path.txt" 
Open filePath For Input As #1 
Do Until EOF(1) 
    Line Input #1, strPath 
Loop 
Close #1 
    On Error Resume Next 
    Set xlApp = GetObject(, "Excel.Application") 
    If Err <> 0 Then 
     Application.StatusBar = "Please wait while Excel source is opened ... " 
     Set xlApp = CreateObject("Excel.Application") 
     bXStarted = True 
    End If 
    On Error GoTo 0 
    'Open the workbook to input the data 
    Set xlWB = xlApp.Workbooks.Open(enviro & strPath) 
    Set xlSheet = xlWB.Sheets("Sheet1") 
    ' Process the message record 
    On Error Resume Next 
    xlWB.Worksheets("Sheet1").Columns("A:NB").entirecolumn.AutoFit 
    For j = 2 To 367 
     If xlSheet.cells(1, j).Value <> Date And xlSheet.cells(1, j).Interior.ColorIndex = 4 Then 
      xlSheet.Columns(j).Interior.ColorIndex = 0 
     End If 
     If xlSheet.cells(1, j).Value = Date Then 
      xlSheet.Columns(j).Interior.ColorIndex = 4 
      xlSheet.Columns(j).Select 
      If xlSheet.cells(2, j).Value = "Monday" Then 
       For i = 2 To j - 1 
       xlSheet.Columns(i).Hidden = True 
       Next i 
      End If 
    xlWB.Close SaveChanges:=True 
    If bXStarted Then 
     xlApp.Quit 
    End If 
End Sub 

これはExcelの開閉です。 私はまた、leaverequestsサブのinbox反復中に呼ばれるサブを持っています。

Sub FillIn(ByVal x As String, ByVal y As Date, ByVal z As Date, ByVal id As String) 
    Dim currentRow As Long 
    Dim i As Long 
    Dim j As Long 
    Dim date1Pos As Integer 
    Dim date2Pos As Integer 
    Dim datePos As Integer 
    Dim lastRow As Integer 
     lastRow = xlSheet.Range("A" & xlSheet.Rows.Count).End(-4162).Row 
     date1Pos = 0 
     date2Pos = 0 
     For i = 3 To lastRow 
      If xlSheet.cells(i, 1).Value = id Then 
       currentRow = i 
       Exit For 
      End If 
     Next i 
      For j = 2 To 367 
       If xlSheet.cells(1, j).Value = y Then 
        date1Pos = j 
       End If 
       If xlSheet.cells(1, j).Value = z Then 
        date2Pos = j 
        Exit For 
       End If 
      Next j 
      If date1Pos <> 0 And date2Pos <> 0 Then 
       datePos = date1Pos 
       For j = 1 To date2Pos + 1 - date1Pos 
        xlSheet.cells(currentRow, datePos).Value = x 
        xlSheet.cells(currentRow, datePos).HorizontalAlignment = xlCenter 
        datePos = datePos + 1 
       Next j 
      End If 
End Sub 
+0

'367'にJ = 2の場合はそれがないマッチング' Next' –

+0

を持っていないようです、それは正しい 'もしdate1Pos <> 0とdate2Pos <> 0 Then'より上ですコードをインデントしてみます。 – NAlexP

+0

申し訳ありませんLeaveRequestsの「次のJ」が表示されません –

答えて

4

あなたのExcelオブジェクト変数はモジュールレベルで宣言し、公衆いる:これは、

Public xlApp As Object 

:彼らは無期限Excelにその参照を保持し、したがって、あなたが明示的に01にそれらを設定していない限り、閉じてからExcelを防ぐことができます:

Set xlSheet = Nothing 
Set xlWB = Nothing 
Set xlApp = Nothing 

ブック/ Excelを終了した後。

ローカル変数を使用し、必要に応じて呼び出された関数(例:LeaveRequests()FillIn())に渡す方がよいと考えられます。

例:

Sub LeaveRequests() 

    Dim xlApp As Object 
    Dim xlWB As Object 
    Dim xlSheet As Object 

    ' stuff, loops, ... 
    Call FillIn(xlSheet, x, y, z, id) 

End Sub 

Sub FillIn(xlSheet As Object, ByVal x As String, ByVal y As Date, ByVal z As Date, ByVal id As String) 
    ' as is 
End Sub 
+0

これは素晴らしいことです!プロセスはこれらのコマンドを使用して終了します。どのように関数の変数としてオブジェクトを渡すことをお勧めしますか? 'LeaveRequests()'でローカルにすると 'FillIn()'を使って書くことが不可能になり、また 'For i = 3 to lastRow'が不思議な振る舞いをしたので、私は定数3となるが、それは正しい回数だけ反復されても。 – NAlexP

0

あなたは以下のコードを試すことができ、これはやり過ぎですが、それは私のために働いた、私は機能としてこれを使用していたが、このコードは

Dim objWMIService 
Dim colProcessList 
Dim objProcess 
Dim strComputer 

strComputer = "." 
Set objWMIService = GetObject("winmgmts://./root/cimv2") ' Task mgr 
Set colProcessList = objWMIService.ExecQuery ("Select * from Win32_Process Where Name in ('EXCEL.EXE') ") '''''','Chrome.exe','iexplore.exe' 

For Each objProcess in colProcessList 
    objProcess.Terminate() 
Next 
ROUのOn Error後藤またはサブとして使用することができます
+0

正確にこのコードを追加することをお勧めしますか? xlWB.Closeの後に? – NAlexP

+0

'xlApp.Quit'の代わりに上記のコードを使用することができます。たとえば、関数を作成してこのコードを書いて、 'xlApp.Quit'の代わりにその関数を呼び出すことができます。 –

+0

' objProcess.Terminate() 'に構文エラーがありますが、括弧を削除しましたが、同じですが、プロセスは終了しません。 – NAlexP

関連する問題