[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/09/16(Fri) 22:13
投稿者名:NM
Eメール:
URL :
タイトル:
Excelファイル操作時のエラー
お世話になります。

VBでエクセル操作中に出る下記のメッセージの原因を調査しております。
エクセル関係のエラーに関する注意書きを読んだ上で設計したつもりなのですが、
原因がよく解りません。
対策方法は、MicrosoftやいろんなURLを探した所、OLEの時間を設定する記述がありました。
まずは対策方法を講じる前にExcel操作時の手順として、何か間違っているでしょうか。

とても長い内容で恐縮ですが、実際の関数は以下のものです。

ご教授ください。よろしくお願い致します。

<エラーメッセージ>
「他のアプリケーションがサーバを使用しているため、この操作を完了できません。
操作を続けるには、「切り替え」ボタンを選択して、他のアプリケーションを
終了させてください。」

実際の処理:
Public Sub XLS_FILE_WRITE(strName As String, D_no As Integer)
    
    'Excel Work
    Dim WkbObj As Workbook
    Dim objADOConnection As ADODB.Connection
    Dim objADORecordset As ADODB.Recordset
    
    Dim strSheetName(10) As String
    Dim SheetCount As Integer
    Dim i As Integer, j As Integer, k As Integer, m As Integer, n As Integer, r As
Integer, h As Integer
    Dim strSelect As String

    Select Case D_no
        Case 2:
            strSheetName(0) = UCase("Data")
            strSheetName(1) = UCase("Data_Str")
            SheetCount = 2
        Case 3:
            strSheetName(0) = UCase("Data-DropSup")
            SheetCount = 1
        Case 4:
            strSheetName(0) = UCase("Data-DropAdd")
            SheetCount = 1
        Case 5:
            strSheetName(0) = UCase("InputData")
            strSheetName(1) = UCase("Data_Str")
            SheetCount = 2
        Case Else:
    End Select
    
    
    On Error GoTo MYEND1
    
    Set objADOConnection = New ADODB.Connection
    objADOConnection.Provider = "Microsoft.Jet.OLEDB.4.0"
    objADOConnection.Properties("Extended Properties") = "Excel 8.0"
    
    Err.Number = 0
    objADOConnection.Open strName
    Set objADORecordset = New ADODB.Recordset
    
    If Err.Number = 0 Then
        For i = 0 To SheetCount - 1
            objADORecordset.ActiveConnection = objADOConnection
            objADORecordset.CursorType = adOpenForwardOnly
            objADORecordset.LockType = adLockPessimistic
            
            strSelect = "select * from [" + strSheetName(i) + "$]"
            
            Err.Number = 0
            objADORecordset.Open strSelect, , , , adCmdUnknown
            If Err.Number = 0 Then
                objADORecordset.MoveFirst
                r = 0
                Do Until objADORecordset.EOF
                    
                    For j = 0 To objADORecordset.Fields.Count - 1
                        Select Case UCase(strSheetName(i))
                        Case UCase(strSheetName(i))
                            Select Case UCase(objADORecordset.Fields(j).Name)
                                Case UCase("Val"):
                                    Select Case D_no
                                        Case 0:
                                            objADORecordset.Fields(j).Value = _
                                               RecipeData(r).A06_Val
                                        Case 2:
                                            objADORecordset.Fields(j).Value = _
                                               CHBData(r).A06_Val
                                        Case 3:
                             objADORecordset.Fields(j).Value = _
                                               LC_DropSup(r).A06_Val
                                        Case 4:
                                            objADORecordset.Fields(j).Value = _
                                               LC_DropAdd(r).A06_Val
                                        Case 5:
                                            objADORecordset.Fields(j).Value = _
                                               LCData(r).A06_Val
                                        Case Else:
                                    End Select
                                Case UCase("Str"):
                                    Select Case D_no
                                        Case 0:
                                            objADORecordset.Fields(j).Value = _
                                                    RecipeData_str(r).A08_Str
                                        Case 2:
                                            objADORecordset.Fields(j).Value = _
                                                    CHBData_Str(r).A08_Str
                                        Case 5:
                                            objADORecordset.Fields(j).Value = _
                                                    LCData_Str(r).A08_Str
                                        Case Else:
                                    End Select
                                Case Else
                            End Select
                        End Select
                    Next
                    objADORecordset.Update
                    objADORecordset.MoveNext
                    r = r + 1
                Loop
                objADORecordset.Close
            End If
        Next
        Set objADORecordset = Nothing
        objADOConnection.Close
        Set objADOConnection = Nothing
        
        Debug.Print "WndData Save End:" + str(Timer)
        
        'Excute Calculate
        Debug.Print "Cal Start:" + str(Timer)
        Set WkbObj = GetObject(strName)
        For i = 0 To WkbObj.Worksheets.Count - 1
            WkbObj.Worksheets(WkbObj.Worksheets.Item(i + 1).Name).Calculate
        Next
        WkbObj.Application.Windows(1).Activate
        WkbObj.Save
        WkbObj.Application.Quit
        Set WkbObj = Nothing
        
        Debug.Print "Cal End:" + str(Timer)
    End If
    
Exit Sub

MYEND1:
    On Error Resume Next
    objADORecordset.Close
    Set objADORecordset = Nothing
    objADOConnection.Close
    Set objADOConnection = Nothing
        
    MyMSGBox "Excel Write Error" & Err.Description, vbOKOnly, "ERROR !&q
uot;

End Sub

投稿時間:2005/09/17(Sat) 11:42
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: Excelファイル操作時のエラー
> <エラーメッセージ>
> 「他のアプリケーションがサーバを使用しているため、この操作を完了できません。
> 操作を続けるには、「切り替え」ボタンを選択して、他のアプリケーションを
> 終了させてください。」
同じファイルを両方で掴んだままになっていませんか?

※ コードを投稿される場合は図表モードで投稿されるようにお願いします。
(今からでも最下部の修正から修正できます。 私の方では修正ができません)

投稿時間:2005/09/18(Sun) 11:28
投稿者名:NM
Eメール:
URL :
タイトル:
Re^2: Excelファイル操作時のエラー
いつもお世話になっております。

コード投稿モードの件は大変失礼しました。修正いたしました。

> 同じファイルを両方で掴んだままになっていませんか?
ファイル操作時に発生した本エラーは、人が直接ファイルを開いたりしませんし、
複数のプログラムがアクセスするファイルでもありません。
よって、自分で開いたプログラムを終了し損なった後に、再度、同一ファイルを
開こうとした場合に発生する可能性を持つという事でしょうか。

投稿時間:2005/09/18(Sun) 16:56
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: Excelファイル操作時のエラー
部分的な長い段落が設定されていないコードは、あまり見る気にもなれないし、
どこか他の部分でつかんだままになっていたりだれか他に使っていないか、
エラーが発生したままのファイルやExcelを使っていないかを確認のために
質問したまでです。

> 対策方法は、MicrosoftやいろんなURLを探した所、OLEの時間を設定する記述がありました。

まずは、それらを実行されるのが早道かと思います。

> まずは対策方法を講じる前にExcel操作時の手順として、何か間違っているでしょうか。

逆にどこか問題があるのですか?

投稿時間:2005/09/19(Mon) 00:52
投稿者名:NM
Eメール:
URL :
タイトル:
Re^4: Excelファイル操作時のエラー
お世話になります。

> 逆にどこか問題があるのですか?
うーん。解りません。私も、どこか他の部分でつかんだままになっていたり
だれか他に使っていないか、エラーが発生したままのファイルやExcelを
使っていないかを疑いました。
また、個人的に問題ないと思っていました。ただ、問題が起きたのも事実です。
自分のミスなのかMicrosoftの不具合が原因なのかは、はっきりと解りません。
自分の設計した回路は、自身には正しく映るものなので、何かぽっかりと
忘れていたり、間違っているものはないかな?と。

まずは、OLEのタイムアウト時間を延ばして見ます。
ありがとうございます。

投稿時間:2005/09/19(Mon) 08:53
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^5: Excelファイル操作時のエラー
> 自分の設計した回路は、自身には正しく映るものなので、何かぽっかりと
> 忘れていたり、間違っているものはないかな?と。
私は、自分が理解できるコードで期待通りに動けばそれが一番だと思いますよ。

> まずは、OLEのタイムアウト時間を延ばして見ます。
ADO を開放してから、Excel でファイルを開くまでの間を3〜5秒待って
から実行して見てはどうでしょうか。

投稿時間:2005/09/20(Tue) 16:40
投稿者名:NM
Eメール:
URL :
タイトル:
Re^6: Excelファイル操作時のエラー
お世話になっております。
アドバイスありがとうございます。

> ADO を開放してから、Excel でファイルを開くまでの間を3〜5秒待って
> から実行して見てはどうでしょうか。
掴みっぱなし(開放完了)の間に、次のOPEN指令をプログラムが出す事で
今回のようなエラーが出る可能性があるかもという事ですね。
OPEN指令を出す前に、試しに3〜5秒間のWAITを処理に加えてみます。
また、合わせてOLEのタイムアウト時間も以下のように変更し、
どちらが効果があるか、また別の問題か等の切り分けをしてみます。

    App.OleServerBusyRaiseError = True
    App.OleRequestPendingTimeout = 60000 'タイムアウト60秒
    Excel操作処理
    App.OleRequestPendingTimeout = 5000 'タイムアウト5秒(デフォルトに戻す)
    App.OleServerBusyRaiseError = False

ありがとうございます。

投稿時間:2005/09/20(Tue) 17:24
投稿者名:GOD
Eメール:
URL :
タイトル:
Re^7: Excelファイル操作時のエラー
> 掴みっぱなし(開放完了)の間に、次のOPEN指令をプログラムが出す事で
>
エクセル処理中にON ERRORでMYEND1に飛び、エクセルが解放できていないとか無いですか。
MYEND1ラベル以下ではエクセルの終了処理をしてないですよね。

投稿時間:2005/10/08(Sat) 09:48
投稿者名:NM
Eメール:
URL :
タイトル:
Re^8: Excelファイル操作時のエラー
お世話になります。
出張で不在にしていたため、返事が遅くなり大変申し訳ありません。

> エクセル処理中にON ERRORでMYEND1に飛び、エクセルが解放できていないとか無いですか。
> MYEND1ラベル以下ではエクセルの終了処理をしてないですよね。
 確かにそうですね。
 WkbObj.Save
  WkbObj.Application.Quit 
  Set WkbObj = Nothing
 がないために、ただ、無理やり関数を抜けてくる(接続を切る)という
 結果になりますね。
 処理中にエラーが起きる場所によって、終了処理も場合わけしてみます。
 ありがとうございました。

 返事が遅くなりすいません。