|
▼ハチ さん:
ご回答ありがとうございます。
間違っていたらなんて、とんでございません。
If CreateObject("Scripting.FileSystemObject").FolderExists(FuPa) = False Then
MsgBox "ネットワークが不良です"
ActiveWorkbook.Saved = True
Application.Quit
ElseIf Dir(FuPa & "\" & WbName & ".xls") = "" Then
MsgBox "この様式は運用を中止している"
ActiveWorkbook.Saved = True
Application.Quit
Else
Worksheets(WsName).Range("B1").Value = "='" & FuPa & "\[" & WbName & ".xls]" & WsName & "'!$A$1"
If Worksheets(WsName).Range("A1").Value <> Worksheets(WsName).Range("B1").Value Then
MsgBox "この様式は旧版。使用できない。", vbOKOnly + vbCritical
ActiveWorkbook.Saved = True
Application.Quit
End If
End If
以上でバッチリ行きました。
(リンク式の削除は、Workbook_BeforeSave()でB1=""としています。)
エクセル本体の検知能力に任せた後で対応するのではなく、対象物がある事を確認して、参照式を入れるわけですね。
Dir関数のヘルプ(2000)を見ると、「該当するファイルが見つからないとき、Dir関数は長さ0の文字列を返します」と、ありました。
やりたい事から、命令文が引ける逆引きがあると便利ですね。素人だとヘルプからヒットさせる文言が浮かびません。
作動確認は直ちに取れたのですがご返事が遅れたのは、もう一つ壁に当たってしまったからです。
試行錯誤中に見つけたのですが、参照するシート名が該当するファイルに無いと、「シートの選択」画面が表示されます。
これもトラップして、例えば「原紙のシート名に誤りがある、管理者に問い合わせしろ」的な案内を出したいと思いました。
そこで、上記のElse以降に以下を入れてみたのですが、最初の「c = Workbooks(・・・」でインデックスが有効範囲に無いとエラーが出ました。
対象ファイルを開いていないとだめかと、やってみたのですが同じでした。
変数を使わずにストレートに「\\SV\原紙\62_2」としてみたのですが、同じです。
やっていることは、原紙のシート数を数え、インデックス番号を利用して、同じシート名が有れば自分のシートにリンク式を入力。
無ければ、B1セルが空欄のままなので、それを拾って、同じシート名が無いです。と表示させ抜けようとしています。
シート数は1ブックに原則1シート、多くても3シート以内です。
For Each・・NextやDo Loopを使えばスマートでしょうが、そこまで行かない所でこけてしまっています。(これだと、シートのインデックス番号が変わったり、飛び番号になったら、またエラーですものね。・・・今気が付きました)
ついでと言っては大変無礼で申し訳ないのですが、お分かりになりませでしょうか?
c = Workbooks(FuPa & "\" & WbName).Worksheets.Count
For i = 1 To c
If Workbooks(FuPa & "\" & WbName).Worksheets(c).Name =WsName Then
Worksheets(WsName).Range("B1").Value = "='" & FuPa& "\[" & WbName & ".xls]" & WsName & "'!$A$1"
End If
Next i
If Worksheets(WsName).Range("B1").Value = "" Then
MsgBox "保管されている原紙のシート名が間違っている"
ActiveWorkbook.Saved = True
Application.Quit
Else
If Worksheets(WsName).Range("A1").Value <> Worksheets(WsName).Range("B1").Value Then
MsgBox "この様式は旧版。使用できない。", vbOKOnly+ vbCritical
ActiveWorkbook.Saved = True
Application.Quit
End If
End If
|
|