プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (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? …
    • good
    • 1
この回答へのお礼

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

お礼日時:2005/07/26 00:28

こんにちは。


前回のアドバイス内容は、WSH(Windows Script Host)ネタの一種です。
WSH で検索すると色々と技が習得できます。
今回、Win98 だったので まるで動かないかな? と不安もありました(^^;

>コピー元のパスが、昔ながらのDOSのルールの命名でないと・・・
ショートネームで動くのであれば、ロングネームをダブルコーテンションで括ってください。
前回の内容から例にすると、

.NameSpace("\\コピー先PC\コピー先フォルダ").CopyHere """C:My Document\コピー元パス.xls""", 16

引用符(ダブルコーテーション)内部に引用符を記述するには "" と 2回重ねてください。
また、コピー元パスを変数に格納した場合は、

.NameSpace("\\コピー先PC\コピー先フォルダ").CopyHere """" & strCopyPath & """", 16

になります。

コピー状況表示が表示されなかったのは、コピーサイズが小さかったか、
転送速度が速かったか、またその両方かで、表示するより早くコピーが終了した為です。
重いネットワーク、大きなサイズまたは多数のファイルをコピーすると出ます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/07/22 00:35

こんにちは。


#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

などとしてみるのも方法です。

うまく出来ないとしたら、他の要因があるかもしれませんが、私は、こちらの方面は詳しくありません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/07/22 00:41

こんにちは、わたしも同様に様子が解っていません (^_^;



>しかし、エクスプローラーで一回ネットワークフォルダーを開いて・・・・

とありますので、コードからエクスプローラを
立ち上げてしまうのは、ドロくさいですか。例えば、

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 は上書コピー指定)
コピー状況が表示され、またコピー元パスにワイルドカードが使えます。

この回答への補足

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

補足日時:2005/07/16 00:20
    • good
    • 1
この回答へのお礼

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

お礼日時:2005/07/20 22:46

こんばんは。


コードをみないと、なんともコメントしがたいのですが、私は、状況をあまり把握していません。

コードの最初に

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
帰宅間際に少しいじっただけなので、吟味は出来ていませんが、
上のような理解で良いのでしょうか?次に試行できるのは月曜になりますが、よろしくお願いします。

補足日時:2005/07/16 00:12
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A