VBAでネットワークコンピュータのファイルにアクセスできない(XL2000)

このQ&Aのポイント
  • EXCEL2000で、EXCELのファイルと、データ専用のファイルを組にして運用しています。VBA中でネットワークコンピュータ(LAN)のフォルダにFileCopyしようとすると、ファイルが見つからないエラーが出てコピーできません。
  • エクスプローラーでネットワークフォルダーを開いてからVBAを実行すると問題なくコピーできるようになります。
  • APIのCopyFileを用いても同じエラーが発生し、Windows98の場合はMicrosoftの情報が見つからないため解決策が見つかりません。
回答を見る
  • ベストアンサー

VBAでネットワークコンピュータのファイルにアクセスできない(XL2000)

EXCEL2000で、EXCELのファイルと、データ専用のファイルを組にして運用しています。都度データファイルのバックアップを取るために、VBA中でネットワークコンピュータ(LAN)のフォルダにFileCopyしようとするのですが、ファイルが見つからないというエラーが出て、コピー出来ません。しかし、エクスプローラーで一回ネットワークフォルダーを開いてから終了し、再度VBAを実行すると問題なくコピー出来ます(何か道筋が出来るらしい)。 また、WEBで調べてAPIのCopyFileを用いると良いという記事をみて、トライしましたが事態は同じでした。なお、過去の類似の質問で、WindowsXPの場合のMicrosoftの情報が紹介されていましたが、本ケースでは両方のPCともWindows98です。 以上、宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • komet163
  • ベストアンサー率51% (22/43)
回答No.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 用 スクリプトランタイムを入れてください。 下記からダウンロードできます。

参考URL:
http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=E74494D3-C4E1-4E18-9C6C-0EA28C9A5D9D
mitarashi
質問者

お礼

ご教示いただいたコードで、ネットワークコンピュータのフォルダにバックアップが取れるようになりました。勤務先のPCであり、スクリプトランタイムの最新版インストールにはシステム管理部門の承認が必要なため、とりあえず現状のままでやってみましたが、問題なく動作しました。 従来、ワークシート中にデータも保管していた時は、パス指定で保存する方法でバックアップを取っていましたが、それでも時々失敗することがありました。それも、今思うと同じ原因だったのでしょう。 これでスッキリしました。ありがとうございました。

その他の回答 (4)

  • komet163
  • ベストアンサー率51% (22/43)
回答No.4

こんにちは。 前回のアドバイス内容は、WSH(Windows Script Host)ネタの一種です。 WSH で検索すると色々と技が習得できます。 今回、Win98 だったので まるで動かないかな? と不安もありました(^^; >コピー元のパスが、昔ながらのDOSのルールの命名でないと・・・ ショートネームで動くのであれば、ロングネームをダブルコーテンションで括ってください。 前回の内容から例にすると、 .NameSpace("\\コピー先PC\コピー先フォルダ").CopyHere """C:My Document\コピー元パス.xls""", 16 引用符(ダブルコーテーション)内部に引用符を記述するには "" と 2回重ねてください。 また、コピー元パスを変数に格納した場合は、 .NameSpace("\\コピー先PC\コピー先フォルダ").CopyHere """" & strCopyPath & """", 16 になります。 コピー状況表示が表示されなかったのは、コピーサイズが小さかったか、 転送速度が速かったか、またその両方かで、表示するより早くコピーが終了した為です。 重いネットワーク、大きなサイズまたは多数のファイルをコピーすると出ます。

mitarashi
質問者

お礼

アドバイスありがとうございます。ダブルクォーテーション2重はまだ試行しておりませんが(勤務先でないと出来ない)、本日ひょんな事で原因が分かった様な気がします。エクスプローラで、当該ネットワークフォルダーを含むツリーを表示させ、別のMy Documentのフォルダーのウィンドウからファイルをドラッグ&ドロップすると、「ファイルシステムのエラーです、パスワードが違っていますという」エラーメッセージが出ました。このフォルダーへのパスワードはエクスプローラでは保存されているため、ダブルクリックすれば普通に開くことが出来ます。というわけで、単にVBAからFileCopyをしただけでは、パスワードを渡せないためエラーが出るのだと思います。 WSHを用いてパスワードを渡してコピーする(ファイルオブジェクトを作る?)事は可能でしょうか。よろしくお願いします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 #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 などとしてみるのも方法です。 うまく出来ないとしたら、他の要因があるかもしれませんが、私は、こちらの方面は詳しくありません。

mitarashi
質問者

お礼

ご回答ありがとうございます。 その後判明した事ですが、ネットワークフォルダーにフルアクセスのパスワードが一つ設定してあり、エクスプローラ上ではパスワードを記憶しているため、フォルダーが開け、一旦開通するとその状態が維持されるものの、それを行わずに単純にVBAからFileCopyしても、パスワードが違うとしてはねられてしまうと考えられます。上記操作をパスワードを渡して行う事は可能でしょうか?ご教示下さい。

  • komet163
  • ベストアンサー率51% (22/43)
回答No.2

こんにちは、わたしも同様に様子が解っていません (^_^; >しかし、エクスプローラーで一回ネットワークフォルダーを開いて・・・・ とありますので、コードからエクスプローラを 立ち上げてしまうのは、ドロくさいですか。例えば、 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 は上書コピー指定) コピー状況が表示され、またコピー元パスにワイルドカードが使えます。

mitarashi
質問者

お礼

試行した結果をお知らせします。 いきなりエラーが出て、原因調査のため試行錯誤を行っていたため、遅くなって申し訳ありませんでした。 コピー元のパスが、昔ながらのDOSのルールの命名でないと、ファイルシステムのエラーというのが出て、うまく行きません。フォルダーが"\My Document"の場合、ファイル名が2バイト文字の場合共にエラーが発生します。"C:\test\test.txt"といった名前だと、正常動作しました(コピー状況表示は出ませんでしたが)。制約が多すぎて、それ以上の検証は行っておりません。何か対応法がありましたら、ご教示下さい。

mitarashi
質問者

補足

アドバイスありがとうございます。Auto_Closeの中で、コピー元、先共にファイル名までフルパスを指定して、FileCopy sourceFile, destFile とやっているだけです。 教えていただいた内容を試行できるのは月曜になりますので、補足の形で返事をさせていただきます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 コードをみないと、なんともコメントしがたいのですが、私は、状況をあまり把握していません。 コードの最初に 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  '-実行 なんていう、オプションをつければよいのではないでしょうか?

mitarashi
質問者

補足

アドバイスありがとうございます。 ”コードをみないと”という程、大それたものではありません。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 帰宅間際に少しいじっただけなので、吟味は出来ていませんが、 上のような理解で良いのでしょうか?次に試行できるのは月曜になりますが、よろしくお願いします。

関連するQ&A

  • ネットワークコンピュータにファイルをコピーする

    ローカルドライブにあるファイルを、ネットワークコンピュータの所定のフォルダにコピーしたいのですが、FileCopyではコンピュータ名から始まるフォルダ名若しくはファイル名を使えません。 FileCopy("C:\a.txt","\\Other\C\Data\a.txt") これができるようなAPIとかはないでしょうか? OSは双方ともWindows2000、言語はVisualBasic6.0SP5です。 よろしくお願いいたします。

  • VBAでファイルのシートをコピーしたい。

    VBAでファイルのシートをコピーしたい。 現在、FileCopyでEXCELファイルをコピーしていますが、特定のシートだけコピーしたいのですが、、 (現在の一部です)  FileCopy fs.FoundFiles(i), "C:\集計" どのように書き換えればよいのでしょうか? 宜しくお願いします。

  • VB6でのファイルコピーの終了検知について

    FileCopyステートメントがありますが、FileCopyステートメントで大きなファイルをコピーしたり、ネットワーク上の別のPCにコピーしたりするとします。 コピーされた後のファイルをさらにコピーしたいのですが、コピーが完全に終了していないせいか、うまく動作しません。 ファイルのコピーが完全に終わったと検知する方法があるのでしょうか? また、ファイルの削除に関しても同様に、完全に削除し終えたと検知する方法があるのでしょうか? どなたか知っておられる方がおられましたらよろしくお願い致します。 FileCopyやKillなどのステートメントにはこだわっていません。 APIなどでもかまいませんのでよろしくお願い致します。

  • ネットワークドライブのファイルをFileCopyできない

    ネットワークドライブにあるLZHファイルをローカルドライブにコピーするために、VB6.0のFileCopy関数を使っています。 Windows2000までは特に問題なかったのですが、XPで「パス名が無効です」の実行時エラーが出ます。 FileCopy "\\He\共有フォルダ\a.txt", "c:\Data\a11.txt" Heには指定のファイルがあり、cドライブにコピー先となるファイルはないので問題ないはずなのですが、コピーできないのです。 OSの問題なのか何なのか見当もつかない状態です。 (ちなみにDosプロンプトで>dir "\\He\共有フォルダ\a.txt"とするとちゃんと見えています。またドライブ接続してG:\とかに変えても同じです。) このような経験がおありの方、小さなことでも構いませんので教えていただけないでしょうか?

  • VBA ネットワーク上のファイルでカレントフォルダを取得するには?

    VBA ネットワーク上のファイルでカレントフォルダを取得するには? VBA超初心者でネットで色々調べて、ところどころコピーしながらプログラムを作っています。 ローカルのPCでは問題なく動くまでになったのですが、実際にはネットワーク上の共有サーバで実行したいのですが、ネットワーク上ではカレントパスがうまく設定できていないようで、動きません。 CreateObject("WScript.Shell").CurrentDirectory = ThisWorkbook.Path というコードでVBAが置いてあるフォルダをカレントディレクトリに設定するようにしています。 どのようにしたらネットワークサーバで動くようになりますか?

  • ネットワーク上のコンピュータにファイルをコピーできない

    社内にWEBサーバーを置いています。 同じネットワークにいるので、自分のPCから公開しているフォルダを開いて(公開しているフォルダにはパスワードの設定がしてあります。ユーザー名とパスワードを入力するとフォルダは開けます。) 直接ファイルをコピーしようとしたら、 「ファイルまたはフォルダのコピーエラー」が出て、エラーメッセージは、「・・・をコピーできません。アクセスできません。ディスクがいっぱいでないか、書き込み禁止になってないかまたはファイルが使用中でないか確認してください」と書かれています。 しかし、この方法でコピーできた時もあります。 WEBサーバーはWinNTServer,自分のPCはWinXPProです。 アップロードをこのやり方でやろうとするのが間違っているのでしょうか? 教えて下さい。

  • Access VBAでファイルのインポートについて

    あるディレクトリにAccessのmdbファイルを置き、「インポート」フォルダを隣に置きます。 このフォルダ内にCSVファイルを置き、それをVBAでテーブル「tbl_import」にインポートさせたいのです。 ちなみにインポート後はディレクトリ「インポート」下層のディレクトリ「インポート済」に移動させたいのです。 下記例文では「file.csv」と書いていますが、このファイル名はインポートの都度、常に変わります。 インポートさせるファイルは常に一つです。 「*」を用いれば出来ると思っていたのですが、うまくいきません。 良い方法を教示いただけませんか。 DoCmd.RunSQL "DELETE * FROM tbl_import" DoCmd.TransferText acImportDelim, "インポート定義", "tbl_import", CurrentProject.Path & "\インポート\file.csv", True FileCopy CurrentProject.Path & "\インポート\file.csv", CurrentProject.Path & "\インポート\インポート済\file.csv" Kill CurrentProject.Path & "\インポート\file.csv"

  • ネットワーク上のファイルのコピー

    ネットワーク上のファイルをローカルにコピーする為に FileCopy("\\cp1\D$\aaa\a.txt", "d:\b.txt") を実行したところ ファイル名または番号が不正です(エラー52) が出てしまいます ネットワーク上のPCとユーザとパスワードが違うのでログインでエラーになっているのですが ネットワーク上のPCにユーザを登録するのではなく ユーザ名とパスワードを指定してログインしてから ファイルをコピーする方法はありますでしょうか?

  • エクセルVBA、ネットワーク上のフォルダーに保存

    エクセル2000VBAの記述で教えてください。 ネットワーク上のフォルダーにVBAファイルを開いて、使用後に年月日をファイルの頭に付けて名前を変えて、ネットワーク上の同じフォルダーに保存したいのですが、ネットワークドライブを使用しないで記述するにはどうすればよいでしょうか?ネットワークドライブを使用しないのは、VBAファイルを複数のパソコンで使用するためです。

  • ACCESS、VBAでEXCELファイルをコピーはできますか

    ACCESS、VBAでEXCELファイルをコピーはできますか。 同じフォルダーにあるEXCELファイル:Aファイルを削除してA_BACKファイルをAファイルとしてコピーしたい。 宜しくお願いします。

専門家に質問してみよう