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

教えて下さい。
前任者(故人)が作成したエクセルファイルを任されました。
が別のPCで開こうとするとエラーになります。
下記の構文が影響していることは分かったのですが、意図するところがよく判りません。

このエクセルファイルは開く時に、パスワードを要求され正しい入力をすると開き、フォームが立ち上がります。パスワードはあるセルに格納され変更が可能です。
下記構文を削除すると、パスワードなしで、自動でフォームも開きません。

ShellExecute はネットで調べました。
しかし、このHyperLinkが何を意味するのか、URLはなになのか判りません。
カレントプロジェクト内検索でもこの構文以外には引っかかりません。
ハイパーリンクなので、このエクセルファイル内ではなくPC内にインストールされているものなのでしょうか?

PCを知らない人にも簡単に入力できるようにと作成したらしいのですが、内容に対し膨大なVBAがあり、もっと変更を簡単にできるようにしたいと考えています。
そのため不用なVBAは削除したいのですが、内容が判らず削除するのが怖く、教えていただけましたら助かります。
どうぞよろしくお願いします。

================ HyperLink ==========================
Public Sub HyperLink(ByVal URL As String)
#If VBA7 And Win64 Then
Dim rc As LongPtr
Const cst_hwnd0 As LongPtr = 0
#Else
Dim rc As Long
Const cst_hwnd0 As Long = 0
#End If

On Error Resume Next
rc = ShellExecute(cst_hwnd0, "Open", URL, _
vbNullString, vbNullString, SW_SHOWNORMAL)
On Error GoTo 0
End Sub

質問者からの補足コメント

  • 今私のPCのCドライブに、「C:\S○○○ai」フォルダを作成し、開かなかったエクセルファイルを開いてみました。
    と、問題なく開けました。

    問題のコードはやはりパスワード確認のためのコードでした。
    これが必要かどうかは別問題として、このコードの意図することは判りましたので、これで解決とさせていただきます。

    ベストアンサーはこれを教えてくださった kikosiさんとさせていただきます。
    皆様ありがとうございました。

      補足日時:2017/11/14 14:58

A 回答 (8件)

直接回答じゃないですが、引数URLに開きたいものへのリンクアドレスが書かれていて、それをShellExecuteで開いているように

見えるので、そのsubを呼び出している部分で引数URLに何を入れているかを見れば、わかりませんかね?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

私もそう思うのですが、引数URLがどこにあるのかわからないのです。
カレントプロジェクト内検索でもこの構文以外に「URL」という文字は引っかかりません。
どこを探していいのかわかりません。

お礼日時:2017/11/14 10:44

ここのShellExecuteは、ファイルを開こうとしてます。

おそらく、URLは、実行ファイルのパスだと思います。そのファイルは、パスワードを入力させるものです。

なので、以下のことを試して見てください。

1.On Error Resume Next
の前に
MsgBox("パス=" & URL)
を追加してください。

それは、URLの値を表示するものです

2.おそらく、何かのファイルのパスですので、そのパスの通りに、もともとのパソコンから、そのファイルを探し出し、新しいパソコンで同じパスにそのファイルを格納してください



そうすれば、うまくいくと思います。
もし、それでもダメなら、その時のエラーのスクショをアップしてください
    • good
    • 0
この回答へのお礼

kikosi様、回答ありがとうございます。

今新しいPCで試してみました。
(問題の構文に「'」をつけたもの)
「'」をはずしたのですが、パスワードなし、メッセージなし、フォームたちあがらず通常で開いてしましました。
問題のPCがある部署には来週参りますので、その時に試してみます。
早々の回答を頂きながら、返事が遅れてしまい、申し訳ありません。

回答感謝いたします。

お礼日時:2017/11/14 11:09

うまくいったら、そのMsgBoxを消しましょう

    • good
    • 0
この回答へのお礼

ありがとうございます。
いただいた回答から確認方法が判りました。
今パスワード入力(再設定)のVBAを確認致しました。
URLは下記の 「C:----」ですね、きっと。
来週、前任者PCのCドライブにあるテキストファイルを確認致します。
Open~ Close の構文はよく判りませんが、調べてみます。
途中経過ですが、ご報告させていただきました。
啓示、ありがとうございます。
-----------------------
Private Sub CommandButton1_Click()
Dim P1, P2
P1 = Sheets("定数").Range("D1")
pass:
P2 = InputBox("新しいパスワードを記入してください。", "新パスワード", P1)
If P2 = "" Then Exit Sub
If P1 <> P2 Then
If P2 = InputBox("もう一度パスワードを記入してください。", "パスワード確認入力") Then
Sheets("定数").Range("D1") = P2
ActiveWorkbook.Password = P2
Open "C:\S○○○ai\so○i.ini" For Append As #1
Print #1, Date & " " & Time & ":"; P2
Close #1
Else
MsgBox ("パスワードが同じでありません。再入力してください。")
GoTo pass
End If
End If
End Sub

お礼日時:2017/11/14 11:35

拝承です。

この部分のコード
Open "C:\S○○○ai\so○i.ini" For Append As #1
Print #1, Date & " " & Time & ":"; P2
Close #1

は、新しいパスワードとパスワードの変更日時を
C:\S○○○ai\so○i.ini
に追記で書き込むための処理です。つまり、パスワード変更履歴ですね。
なので、新しいマシンには、そのファイルがなくてもいいですが、
  C:\S○○○ai\
フォルダがないと、エラーが発生します。


ちなみに、新しいパスワードをiniファイルにそのまま書き込むのって、セキュリティ上問題ないでしょうかね。
    • good
    • 0
この回答へのお礼

引き続きのご教示、ありがとうございます。

とすると問題のファイルは、テキストファイルに記入されたパスワードを参照して開いている、ということになるのですね。
確かに、セキュリティ上何のためのパスワード?です。

お礼日時:2017/11/14 12:06

>Public Sub HyperLink(ByVal URL As String)


ですので、「URL」という文字列はこのプロシージャー内で使用する引数名です。
「URL」の内容を毎回確認するのであればNo2さん方法でもできますが、
Call HyperLink(○○) を検索して「○○」の部分を確認すれば、
いつ(どのような処理中に)、何を渡しているかが確認できると思います。
※call は 省略可能ですので、実際に記述されているかは不確定です。
    • good
    • 0
この回答へのお礼

Zincer様 回答ありがとうございます。

カレントプロジェクト内検索で、HyperLinkがヒットしないのです。
又引数「URL」が何であるか、このプロシージャ内にありません。
カレントプロジェクト内検索でもヒットしません。

お礼日時:2017/11/14 12:40

>とすると問題のファイルは、テキストファイルに記入されたパスワードを参照して開いている、ということになるのですね



もし、HyperLinkに渡したのは、
  "C:\S○○○ai\so○i.ini"
であれば、そうなりますね。

ただ、私的には、HyperLineの問題ではない気がします。
理由は、新しいパソコンでエラーが発生したタイミングです。
  パスワード変更の時に発生したものですか?それとも、別の処理が発生した時ですか?別の処理で発生する場合は、やはり、そのURLは、別のものだと思います。

また、エラー発生の場所についても、HyperLinkではない気がします。
なぜなら、ShellExceuteの前に、
On Error Resume Next
があります。つまり、エラーが発生しても、何事もないように処理を続けることです。
なので、ShellExecuteでエラーが発生しても、エラーダイアログは表示されません。


なので、一番いいのは、デバッグしてみることですね。
そして、差し支えなければ、エラー発生時のメッセージを見せていただければ、適切なアドバイスが可能かもしれません。
    • good
    • 0

直接、本件には関係がないけれども、コードは、いくぶん古い書き方のような気がしますし、今どき、ShellExecute を使うというのは、あまりしないのですが、本人は、将来性を考えた上のことでしょう。



ShellExecute というのは、拡張子で規定のプログラムが立ち上がるAPIで、別にAPIで書かなくても良さそうなものですが。大げさ過ぎますね。

さて、本題なのですが、
>フォームが立ち上がります。パスワードはあるセルに格納され変更が可能です。
これが何のフォームかだと思います。そのフォームの種類が分かりません。
VB6で作ったものか、.Net か、.Htaか、または、Excelファイルのいずれかだと思います。

>カレントプロジェクト内検索でもこの構文以外には引っかかりません。
構文ではなく、URLの変数の代入がどこかです。そして変数の元は、どこにあるかですが、ブックを越えたグローバル変数というものがあったのか、あまり記憶にありませんが、Custom Propertyやレジストリにも入れることは可能です。

>このHyperLinkが何を意味するのか、URLはなになのか判りません。
別に、HyperLinkで呼出しているなら、そこに、ブレークポイントを設ければよいだけです。(F9)すると、行の色が変わります。それがブレークポイントです。その直前でマクロが止まります。

ブレークポイント(F9)で、実行(F5)後は、F8ですステップモードで進めればよいのです。

● Call Hyperlink(URL)

または、
● Sub HyperLink(ByVal URL As String)

で、マクロを止めて、URLの中身をローカルウィンドウや、右クリックプロパティで、名称を調べます。それが分からないということはありません、暗号化していなければですが、そこまでしても、それほど強い暗号化しませんから、ここで教えてくれれば、たぶん、デコードできます。

次に、その中身はどこにあるか調べます。
後は、そのファイルを直接呼び出せば良いのか、呼出したフォームを解体すればよいのです。

Excel最大の致命的な部分は、いくらプロテクトを掛けていても、通常の開いたファイルは、コピー&ペーストでも、上書きパスワードなしでも、可能だということです。そこに特別な仕掛けをしない限りは、という条件ですが。

エラー?
もちろん、それは、外部エラーで、VBA内ではありませんね。もう一つの呼出ファイルがないからではありませんか?
    • good
    • 0

No.5です


もう一方と話が進んでいるので、邪魔はしたくはないのですが。
検索しても見つからないプロシージャーが影響する理由については見当もつきません。
「stop」やブレークポイントを入れてみて、本当に作動しているか確認するもの手かもしれません。

それとついでに、
ご存知と思いますが、
>#If VBA7 And Win64 Then

"EXCELは2010以上”
かつ
”EXCELのビット数は64bit版”
ということを示しています。
つまり、2010以上でも、32Bit版では
>Dim rc As Long
>Const cst_hwnd0 As Long = 0
の方で処理をすすめていることになります。
「別のPCで開こうとするとエラーになります。」
の点が気になったので追加しておきます。
    • good
    • 0
この回答へのお礼

再度の回答ありがとうございます。

追記で記入したように、なぜエラーが出てファイルが開かないのか? という問題は一応解決しました。
タイムラグでこの回答に気付かず失礼致しました。
教えていただきありがとうございました。

お礼日時:2017/11/14 15:07

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