Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(指定なし : 指定なし)
ネットワークサーバ上でのマクロエラーについて
投稿日時: 21/08/18 15:35:54
投稿者: tako552101

マクロ入りファイルを各担当者に渡して入力してもらっているのですが、例えば当該PCのデスクトップなどに置いて作業してもらう分には何もトラブルはないのですが、ネットワークサーバー上にコピーしたそのファイルでのマクロ実行で実行時エラーが起きることがわかりました。
 
excelファイルをネットワーク上の共有サーバー上に置いて誰でもさわれるようにすること自体には問題なそさそうなのですが、デスクトップはOKで、サーバー上はダメな要因として一番考えられるものは何なのか、ご指導いただきたく投稿いたしました。
 
そのマクロはカレントディレクトリを探してファイルを選択する構文が含まれており、サーバー上ではこれがうまく行かない要因の1つと想定していますが、デスクトップはOKでサーバー上ではダメな構文が他にあればエラーの対処に役立つと思いますし、多ければネットワークサーバー上での使用をお断りする材料として情報を集めたいと思っております。
 
ご指導よろしくお願いします。

回答
投稿日時: 21/08/18 16:25:23
投稿者: WinArrow
投稿者のウェブサイトに移動

当該PCの共有フォルダのアクセス権を確認してみましょう。
「更新」権限が設定されているか?

投稿日時: 21/08/18 19:32:28
投稿者: tako552101

詳しくは確認が必要ですが、仮に設定されているとして「実行時エラー」が出るのはやはり、そのファイルのマクロに原因があることになりますか。

投稿日時: 21/08/18 20:49:44
投稿者: tako552101

引用:
カレントディレクトリを探してファイルを選択する構文
'ファイルを選択
Application.ScreenUpdating = True
'自ファイルのドライブを設定
ChDrive Left(ThisWorkbook.Path, 1)
'自ファイルをカレントフォルダにする
ChDir ThisWorkbook.Path
fn = Application.GetOpenFilename("CSVファイル(*.csv),*.csv")
Application.ScreenUpdating = False

これで当該ファイルと同じ階層のCSVファイルを探しに行きます

やはりここに問題がありそうです。ネットワークドライブ上では「ChDir」使えないとか…
代替え案の掲載もありましたが、ローカルなら、ネットワークドライブ上ならと分岐させることは可能なのでしょうか。

回答
投稿日時: 21/08/18 20:51:05
投稿者: WinArrow
投稿者のウェブサイトに移動

tako552101 さんの引用:

詳しくは確認が必要ですが、仮に設定されているとして「実行時エラー」が出るのはやはり、そのファイルのマクロに原因があることになりますか。

 
アクセス権が「更新」ではない(参照)だとすれば、
マクロでは対応することはできません。

投稿日時: 21/08/18 21:21:32
投稿者: tako552101

引用:
アクセス権が「更新」ではない(参照)だとすれば、
マクロでは対応することはできません。

ありがとうございます。上記の件、担当者に確認してみます。
 
ということは「カレントディレクトリを探してファイルを選択する」コードが改良できたとしても、対応不可ということでしょうか。

回答
投稿日時: 21/08/18 22:56:03
投稿者: simple

横から失礼します。
# サーバー上でExcelを起動するというので、
# https://cu-kansai-it.org/?p=453
# のような話を想像したのですが、違うようですね。
 
# 21/08/18 20:49:44の記事の引用は、どなたかの投稿の引用ですか?
 
GetOpenFilenameの初期フォルダの指定をChdrive,ChDirで実行する手法ですが、
ネットワークドライブにChDriveは使えないので、
http://officetanaka.net/other/extra/tips15.htm
にある SetCurrentDirectory を使うとよいという話なんですね。
 
それで、両者を使い分けるとしたら、
On Error Resume Next で ChDriveを実行し、
もしError が発生していたらネットワークドライブと判定し、
SetCurrentDirectoryを使うと言う方法もあるでしょうね。
 
(2)
別の方法として、

    With Application.FileDialog(msoFileDialogFilePicker)
        .InitialFileName = ThisWorkbook.Path
'        .Filters.Clear
'        .Filters.Add "Excelファイル", "*.xls*"
        If .Show = True Then
            MsgBox .SelectedItems(1)      '例示
        End If
    End With
のような方法ではどうなんでしょう。手元で試せませんが。
 
(3)
なお、ネットワーク上のパスは長くなりがちで、
パス名の文字数上限255に抵触しやすいということも
注意点としてはあるかもしれませんね。(かなり縁遠いですか)

回答
投稿日時: 21/08/19 06:40:21
投稿者: WinArrow
投稿者のウェブサイトに移動

すみません。
>ChDrive Left(ThisWorkbook.Path, 1)
の行を見落としていました。
 
simpleさんからのアドバイスを参考にしてください。
 
 
なお、エラーが発生したときは、
ステップ実行することと
エラーの個所を特定した説明をお願いします。

投稿日時: 21/08/20 13:10:35
投稿者: tako552101

みなさん、ありがとうございます。
 
元々サーバー上で使うことを想定していなかったので、こんなことに。
 
今回の件のほかにもコードで「サーバー上の場合は書き方が異なる」といったものはあるのでしょうか。
全てのコードを見渡して再設定を行うのは大変ですので、教えていただきたいです。

回答
投稿日時: 21/08/20 15:03:48
投稿者: Suzu

サーバーであっても、ネットワークドライブを割り当て、その中のファイルなのであれば
今回の構文でエラーになる事はありませんでした。
 
 
・使っている手法(コード)
・ネットワークサーバー上のファイルの指定方法
・ネットワークサーバーの設定 (権限)
・ネットワーク速度 (同時アクセス人数)
・1ファイルを複数人が同時に開いた際に、読み取り専用になる
 
エラーの原因としては、色々考える事が可能です。
 
それらは、複合している事もあるので、一概に「コレ」と 言うことはできません。
 
地道に 実行してみて、エラーになるかどうか 確認する事をお勧めします。
 
 
 
個人的な話にはなりますが、
 TCP/IPv4 の マシン上の ファイル に対し
    \\IPアドレス\〜ファイル 形式 にて アクセスする設定を行っていました。
 
  OSのバージョン
    同一マシンであっても、OS起動からの経過時間によって
     エラーになっていました。
 
 設定の前提として
  NETBIOS の NETBOIS over TCP/IP 無効
   SMB 1.0/CIFS の無効化
 
 症状として
  ネットワーク上にマスターブラズマシンが存在しなくなる
  \\IPアドレス による ブラウズに失敗する
 
 ネットワークドライブ設定不可
 別セグメントの IPアドレスの為 IPアドレス を指定しアクセスする必要がある
 
 
 いろいろ試しても 時間が経過すると、\\IPアドレス には接続できなくなる事があり
 \\IPアドレス にブラウズワークステーションサービスを再起動してから アクセスする様にしました。

投稿日時: 21/08/21 03:17:15
投稿者: tako552101

Suzuさん、いつもありがとうございます。

引用:
地道に 実行してみて、エラーになるかどうか 確認する事をお勧めします。

同一環境にないので事前にテストすることもできませんし、その担当者に使ってもうらうしか方法はなさそうですが、その時はOKでもタイミングや環境の変化などによってはエラーが起きる可能性が否めないのであれば、やはりローカルで使ってもらうほうが安心ですね。
 
ファイルパスの問題だけであれば、それは前述のコード部分のみなので、カレントディレクトリを見に行く処理を削ってファイル選択のみで最初のエラーは回避できています。
 
おっしゃるように様々な要因が考えられると思うのですが、結果、ファイル破損など最悪の事態だけは避けたいです。

回答
投稿日時: 21/08/21 12:41:27
投稿者: simple

事前に不測の事態を網羅することは誰もできないと思います。虫が良すぎませんか?
そもそもですが、サーバー上のブックをそのまま使う趣旨はどんなことなんですか?
今更で恐縮ですが、後学のために教えてください。
各人が共通してそれになんらかの書き込みをするんですか?
そのブックが変更されてしまうリスクはないんですか?
# ちなみに私の過去発言は役に立ったのでしょうか。
# 使われたのかどうかとか、結果を明確に頂いていないように思いますが。

回答
投稿日時: 21/08/23 08:55:52
投稿者: Suzu

tako552101 さんの引用:
おっしゃるように様々な要因が考えられると思うのですが、結果、ファイル破損など最悪の事態だけは避けたいです。

 
コードの書き方によって、ファイル破損につながる事は考えにくいです。
今回の ChDir も、ファイル破損に直結する話では無いですよね。
 
開発時点で、全てについて確認する事は難しいですから、
エラートラップ をきちんと入れて、
 どの部分のコードでどんなエラーになっているのか
 
が、フィードバックできる様な運用を行い都度対応していくのが良いと思います。

回答
投稿日時: 21/08/24 15:59:25
投稿者: QooApp

tako552101 さんの引用:
引用:
カレントディレクトリを探してファイルを選択する構文
'ファイルを選択
Application.ScreenUpdating = True
'自ファイルのドライブを設定
ChDrive Left(ThisWorkbook.Path, 1)
'自ファイルをカレントフォルダにする
ChDir ThisWorkbook.Path
fn = Application.GetOpenFilename("CSVファイル(*.csv),*.csv")
Application.ScreenUpdating = False

これで当該ファイルと同じ階層のCSVファイルを探しに行きます

やはりここに問題がありそうです。ネットワークドライブ上では「ChDir」使えないとか…
代替え案の掲載もありましたが、ローカルなら、ネットワークドライブ上ならと分岐させることは可能なのでしょうか。

 
このマクロ付エクセルをネットワークの階層に設置して
 
sub texttest()
    debug.print Len(ThisWorkbook.Path)
end sub
 
を実行したら何文字とカウントされますでしょうか。
 
simpleさんが下記の通り意見を出されてますがどうでしょうか。
引用:
(3)
なお、ネットワーク上のパスは長くなりがちで、
パス名の文字数上限255に抵触しやすいということも
注意点としてはあるかもしれませんね。(かなり縁遠いですか)

 
自分の中でネットワーク上に設置してエラーが出たとき、想定以上のパステキストの長さが原因だったことが多々ありましたのでなんとなくそんな気がしてます。
 
Dir系の関数って1バイト超える文字数でエラーになるのでファイルダイアログから選択したCSVのファイル階層が長すぎてDir()に渡したらエラーになったとか。
 
すごーくそんな感じがしてならないんですがどうでしょう。
 
とりあえずブレークポイントで適当なところからF8で進めて何のコマンドで止まってるのか教えてほしいです。あとエラーとして画面になんて表示されているかとか。
 
>>>simpleさんへ
「サーバー上のブックをそのまま使う趣旨」ですが、うちの会社の場合の話になりますが、
同じフォーマットのエクセルをローカル環境にコピーして修正してからサーバに戻したら他の人が上書きしていたために先祖返りした。という事件が定期的に発生するため、原則ローカルにDLせずに共用なデータはサーバー上で開封してその場で処理。ということはよくやります。
 
あと、機密情報関連の契約でサーバーからローカルにDLしてはいけないとか滅茶苦茶な契約もあったりします。
 
ネットワークの負荷もパソコンの負荷も大きいので嫌いですが、ルールとして順守せざるを得ない感じでそういう作業方法を取ることがあります。参考にならなかったらすみません。

回答
投稿日時: 21/08/24 17:53:01
投稿者: WinArrow
投稿者のウェブサイトに移動

サーバーにファイルを置く目的は、ファイルを共有したいということだと思いますが、
「サーバー上のブックをそのまま使う」は、非常に危険です。
サーバーに限らず、ファイルを共有する場合は、最初に排他制御を検討する必要があります。
閲覧だけの共有でも、「読み取り専用」で開くとかの対応が必要です。
それでも、更新する人が存在するため、
サーバーのファイルを直接こうしんするのか?
ローカルで更新しておいてサーバーにアップロードするか?
というような検討が必要ということです。
 
複数の人が更新するというようなことがあるとすれば、
「ブックの共有」をお勧めします。
「ブックの共有」には、複数の人が更新できるというメリットがあるが、
幾つかの制約(使えない命令)もあるので、そのあたりを充分検討することです。
その他、ファイルを開いたまま、席を離れることが無いようなことにならないようなルールも必要です。
 
単純にローカル運用のファイルをそのままサーバーに移動するだけでは、必ず問題が発生します。
 
 

トピックに返信