Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


11177 / 13646 ツリー ←次へ | 前へ→

【17618】エクセルが応答しなくなってしまいます。 YH 04/9/3(金) 14:01 質問[未読]
【17697】Re:エクセルが応答しなくなってしまいます。 こもれび 04/9/5(日) 6:43 発言[未読]
【17709】Re:エクセルが応答しなくなってしまいます。 YH 04/9/6(月) 10:18 お礼[未読]
【17703】Re:エクセルが応答しなくなってしまいます。 禰宜 04/9/5(日) 23:54 回答[未読]
【17708】Re:エクセルが応答しなくなってしまいます。 YH 04/9/6(月) 10:17 お礼[未読]

【17618】エクセルが応答しなくなってしまいます。
質問  YH  - 04/9/3(金) 14:01 -

引用なし
パスワード
   はじめまして。
早速ですが質問をさせていただきます。

今、FTPを使ってサーバーにファイルを送信するPGを作成しています。
ファイルに『送信ボタン』があり、
ボタンを押すと、裏で同じファイルを作成し送信するというものです。

問題は、一通りの処理終了後、エクセルと閉じようとすると応答しなくなってしまいます。
上書き保存などはできるのですが・・・。

調査の結果、どうやらInternetConnectのあたりがいけないようなのですが、
(InternetConnectの部分をコメント化すると問題なく閉じることができます)
コネクト後も間違いなくInternetCloseHandleを行っています。    
いったい何が問題なのでしょうか?
ご指導願います。

以下が、作成したPGです。

Function FtpPut(strFtpSvr As String, strUserID As String, strPassword As String, strRemoteFile As String, strLocalFile As String) As Boolean
  Dim hInternet As Long
  Dim hFTP As Long
  Dim lngret As Long
  Dim strErrText As String
  
  FtpPut = True

  On Error GoTo ErrHandler
'ネットにつなぐ準備
  hInternet = InternetOpen(vbNullString, _
                INTERNET_OPEN_TYPE_PRECONFIG, _
                vbNullString, _
                vbNullString, _
                0&)
  If hInternet = 0 Then
    strErrText = "InternetOpen:GetLastError=" & Err.LastDllError()
    MsgBox strErrText, vbOKOnly + vbExclamation, "<FtpPut>"
    FtpPut = False
    Exit Function
  End If
  
'ネットにつなぐ
  hFTP = InternetConnect(hInternet, _
               strFtpSvr, _
               INTERNET_DEFAULT_FTP_PORT, _
               strUserID, _
               strPassword, _
               INTERNET_SERVICE_FTP, _
               0&, _
               0&)

  If hFTP = 0 Then
    strErrText = "InternetConnect:GetLastError=" & Err.LastDllError()
    MsgBox strErrText, vbOKOnly + vbExclamation, "<FtpPut>"
    FtpPut = False
    InternetCloseHandle (hInternet)
    Exit Function
  End If

'ファイルを送る
  lngret = FtpPutFile(hFTP, _
             strLocalFile & vbNullChar, _
             strRemoteFile & vbNullChar, _
             FTP_TRANSFER_TYPE_BINARY, _
             0&)


  lngret = InternetCloseHandle(hFTP)
  lngret = InternetCloseHandle(hInternet)
  
  Exit Function
ErrHandler:
  FtpPut = False
  MsgBox "<" & Err & ">" & Error(Err), vbOKOnly + vbExclamation, "<FtpPut>"
End Function

------------------------------------------------------------------------------------
'API宣言
Public Declare Function InternetOpen Lib "WinInet.DLL" Alias "InternetOpenA" (ByVal lpszAgent As String, ByVal dwAccessType As Long, ByVal lpszProxyName As String, ByVal lpszProxyBypass As String, ByVal dwFlags As Long) As Long

Public Declare Function InternetConnect Lib "WinInet.DLL" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal lpszServerName As String, ByVal nServerPort As Long, ByVal lpszUserName As String, ByVal lpszPassword As String, ByVal dwService As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long

Public Declare Function FtpGetFile Lib "WinInet.DLL" Alias "FtpGetFileA" (ByVal hFtpSession As Long, ByVal lpszRemoteFile As String, ByVal lpszNewFile As String, ByVal fFailIfExists As Long, ByVal dwLocalFlagsAndAttributes As Long, ByVal dwInternetFlags As Long, ByVal dwContext As Long) As Long

Public Declare Function FtpPutFile Lib "WinInet.DLL" Alias "FtpPutFileA" (ByVal hFtpSession As Long, ByVal lpszLocalFile As String, ByVal lpszNewRemoteFile As String, ByVal dwFlags As Long, ByVal dwContext As Long) As Long

Public Declare Function InternetCloseHandle Lib "WinInet.DLL" (ByVal hInternetSession As Long) As Long

Public Declare Function InternetGetLastResponseInfo Lib "WinInet.DLL" Alias "InternetGetLastResponseInfoA" (lpdwError As Long, lpszBuffer As Byte, lpdwBufferLength As Long) As Long

【17697】Re:エクセルが応答しなくなってしまいま...
発言  こもれび  - 04/9/5(日) 6:43 -

引用なし
パスワード
   こもれびです

私の使用しているAPIリファレンスは古くてYHさんのお使いになった関数
は掲載されていないのですが、ちょっと気になった点はそれぞれの関数
のなかに「使い終わったら解放する」とか「使い終わったら削除する」
「ハンドルをクローズする」を実行しなければならないものはないですか?
InternetCloseHandle
これ以外にも例えばFtpPutFileにもあるとか…

【17703】Re:エクセルが応答しなくなってしまいま...
回答  禰宜  - 04/9/5(日) 23:54 -

引用なし
パスワード
   失礼いたします。禰宜と申します。


>ボタンを押すと、裏で同じファイルを作成し送信するというものです。

裏というのがどこなのかが分かりませんが、送信途中ってことはありませんか?


>ErrHandler:
>  FtpPut = False
>  MsgBox "<" & Err & ">" & Error(Err), vbOKOnly +
>vbExclamation, "<FtpPut>"

ErrHandlerに飛んだ時に、ハンドルをcloseしていませんね^^
そこが原因かどうかは別にして、ハンドルの有無で閉じる処理を
入れておいた方がよろしいと思いますよ^^

【17708】Re:エクセルが応答しなくなってしまいま...
お礼  YH  - 04/9/6(月) 10:17 -

引用なし
パスワード
   禰宜 さん、ありがとうございます。

サーバーを確認したところ、送信は完了しているようです。
エラー処理にもclose処理を追加しました。
ファイルの作成方法がいけないのかもしれない
ということで今作成方法を変更中です。

EXCELのバージョンが違うもので動作確認をしてみたところ、
EXCEL2003は正常に閉じることができるようです。

【17709】Re:エクセルが応答しなくなってしまいま...
お礼  YH  - 04/9/6(月) 10:18 -

引用なし
パスワード
   こもれびさん、ありがとうございます。

調べてみましたが、FtpPutFileのcloseをしている
サンプルがありませんでした。
FtpPutFileも使い方にもcloseのことは何も書いてありませんでした。
(初めて使うのでサンプルを頼るしかないのです・・)

11177 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free