- ベストアンサー
VBAでネットワークコンピュータのファイルにアクセスできない(XL2000)
- EXCEL2000で、EXCELのファイルと、データ専用のファイルを組にして運用しています。VBA中でネットワークコンピュータ(LAN)のフォルダにFileCopyしようとすると、ファイルが見つからないエラーが出てコピーできません。
- エクスプローラーでネットワークフォルダーを開いてからVBAを実行すると問題なくコピーできるようになります。
- APIのCopyFileを用いても同じエラーが発生し、Windows98の場合はMicrosoftの情報が見つからないため解決策が見つかりません。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。様子が見えてきましたね。 パスワードの件、おそらく他に正解があると思いますが、 ネットワークドライブを割当てるのが手っ取り早いかと。 Dim FS, WshNet Const strDrive = "Z:" Set FS = CreateObject("Scripting.FileSystemObject") Set WshNet = CreateObject("WScript.Network") If Not FS.DriveExists(strDrive) Then WshNet.MapNetworkDrive strDrive, "\\コピー先PC\コピー先フォルダ", False, , "パスワード" End If FS.CopyFile "コピー元パス", strDrive & "\", True Set WshNet = Nothing Set FS = Nothing です。 ドライブ割当ては、 WshNet.MapNetworkDrive "ドライブレター", "割当てパス", False, "ユーザ名", "パスワード" の部分で、False を True にすると、起動時に再接続します。 また、WinMe で確認しましたがユーザ名は省略できるようです。 ファイルのコピーに FileSystemObject を使っているようなので大丈夫とは思いますが、 念のため、実行する端末には最新の Win98 用 スクリプトランタイムを入れてください。 下記からダウンロードできます。
その他の回答 (4)
- komet163
- ベストアンサー率51% (22/43)
こんにちは。 前回のアドバイス内容は、WSH(Windows Script Host)ネタの一種です。 WSH で検索すると色々と技が習得できます。 今回、Win98 だったので まるで動かないかな? と不安もありました(^^; >コピー元のパスが、昔ながらのDOSのルールの命名でないと・・・ ショートネームで動くのであれば、ロングネームをダブルコーテンションで括ってください。 前回の内容から例にすると、 .NameSpace("\\コピー先PC\コピー先フォルダ").CopyHere """C:My Document\コピー元パス.xls""", 16 引用符(ダブルコーテーション)内部に引用符を記述するには "" と 2回重ねてください。 また、コピー元パスを変数に格納した場合は、 .NameSpace("\\コピー先PC\コピー先フォルダ").CopyHere """" & strCopyPath & """", 16 になります。 コピー状況表示が表示されなかったのは、コピーサイズが小さかったか、 転送速度が速かったか、またその両方かで、表示するより早くコピーが終了した為です。 重いネットワーク、大きなサイズまたは多数のファイルをコピーすると出ます。
お礼
アドバイスありがとうございます。ダブルクォーテーション2重はまだ試行しておりませんが(勤務先でないと出来ない)、本日ひょんな事で原因が分かった様な気がします。エクスプローラで、当該ネットワークフォルダーを含むツリーを表示させ、別のMy Documentのフォルダーのウィンドウからファイルをドラッグ&ドロップすると、「ファイルシステムのエラーです、パスワードが違っていますという」エラーメッセージが出ました。このフォルダーへのパスワードはエクスプローラでは保存されているため、ダブルクリックすれば普通に開くことが出来ます。というわけで、単にVBAからFileCopyをしただけでは、パスワードを渡せないためエラーが出るのだと思います。 WSHを用いてパスワードを渡してコピーする(ファイルオブジェクトを作る?)事は可能でしょうか。よろしくお願いします。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #1 で書いた、Wendy02 です。 If Not .DriveExists(myPath) Then Exit Sub の代わりに、 If Not .DriveExists(myPath) Then Msgbox "存在していません。": Exit Sub If Not .IsReady Then Exit Sub の代わりに、 'myPath = "\\○○\××" If Not .IsReady Then Set objNetwork = CreateObject("WScript.Network") objNetwork.MapNetworkDrive "X:", myPath End If などとしてみるのも方法です。 うまく出来ないとしたら、他の要因があるかもしれませんが、私は、こちらの方面は詳しくありません。
お礼
ご回答ありがとうございます。 その後判明した事ですが、ネットワークフォルダーにフルアクセスのパスワードが一つ設定してあり、エクスプローラ上ではパスワードを記憶しているため、フォルダーが開け、一旦開通するとその状態が維持されるものの、それを行わずに単純にVBAからFileCopyしても、パスワードが違うとしてはねられてしまうと考えられます。上記操作をパスワードを渡して行う事は可能でしょうか?ご教示下さい。
- komet163
- ベストアンサー率51% (22/43)
こんにちは、わたしも同様に様子が解っていません (^_^; >しかし、エクスプローラーで一回ネットワークフォルダーを開いて・・・・ とありますので、コードからエクスプローラを 立ち上げてしまうのは、ドロくさいですか。例えば、 With CreateObject("Shell.Application") .Explore("\\コンピュータ名\フォルダ名") End With ただし、開いたエクプローラを閉じる方法を知りません。m(__)m あと、以下のコピー方法もお試しください。 With CreateObject("Shell.Application") On Error Resume Next .NameSpace("\\コピー先PC\コピー先フォルダ").CopyHere "コピー元パス", 16 If Err Then MsgBox "ユーザによりコピーが中断されました" End If On Error GoTo 0 End With これは、エクプローラの機能でファイルをコピーします。(引数 16 は上書コピー指定) コピー状況が表示され、またコピー元パスにワイルドカードが使えます。
お礼
試行した結果をお知らせします。 いきなりエラーが出て、原因調査のため試行錯誤を行っていたため、遅くなって申し訳ありませんでした。 コピー元のパスが、昔ながらのDOSのルールの命名でないと、ファイルシステムのエラーというのが出て、うまく行きません。フォルダーが"\My Document"の場合、ファイル名が2バイト文字の場合共にエラーが発生します。"C:\test\test.txt"といった名前だと、正常動作しました(コピー状況表示は出ませんでしたが)。制約が多すぎて、それ以上の検証は行っておりません。何か対応法がありましたら、ご教示下さい。
補足
アドバイスありがとうございます。Auto_Closeの中で、コピー元、先共にファイル名までフルパスを指定して、FileCopy sourceFile, destFile とやっているだけです。 教えていただいた内容を試行できるのは月曜になりますので、補足の形で返事をさせていただきます。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 コードをみないと、なんともコメントしがたいのですが、私は、状況をあまり把握していません。 コードの最初に MyPath = "\\サーバー名 \○○\" If Dir(MyPath & Fname) <> "" Then '-実行 End If とするか、 Set objFSO = CreateObject("Scripting.FileSystemObject") With objFSO If Not .DriveExists(myPath) Then Exit Sub With .GetDrive(myPath) If Not .IsReady Then Exit Sub End With End With '-実行 なんていう、オプションをつければよいのではないでしょうか?
補足
アドバイスありがとうございます。 ”コードをみないと”という程、大それたものではありません。Auto_Closeの中で、コピー元、先共にファイル名までフルパスを指定して、 FileCopy sourceFile, destFile とやっているだけです。 アドバイスいただいた内容に関しては、下記の通りのコードを、FileCopy sourceFile, destFileに先駆けてやってみましたが変化無しです。 Dim myPath As String Dim objFSO As Object myPath = "\\○○\××" Set objFSO = CreateObject("Scripting.FileSystemObject") With objFSO If Not .DriveExists(myPath) Then Exit Sub With .GetDrive(myPath) If Not .IsReady Then Exit Sub End With End With 帰宅間際に少しいじっただけなので、吟味は出来ていませんが、 上のような理解で良いのでしょうか?次に試行できるのは月曜になりますが、よろしくお願いします。
お礼
ご教示いただいたコードで、ネットワークコンピュータのフォルダにバックアップが取れるようになりました。勤務先のPCであり、スクリプトランタイムの最新版インストールにはシステム管理部門の承認が必要なため、とりあえず現状のままでやってみましたが、問題なく動作しました。 従来、ワークシート中にデータも保管していた時は、パス指定で保存する方法でバックアップを取っていましたが、それでも時々失敗することがありました。それも、今思うと同じ原因だったのでしょう。 これでスッキリしました。ありがとうございました。