教えて下さい。
前任者(故人)が作成したエクセルファイルを任されました。
が別の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
No.2
- 回答日時:
ここのShellExecuteは、ファイルを開こうとしてます。
おそらく、URLは、実行ファイルのパスだと思います。そのファイルは、パスワードを入力させるものです。なので、以下のことを試して見てください。
1.On Error Resume Next
の前に
MsgBox("パス=" & URL)
を追加してください。
それは、URLの値を表示するものです
2.おそらく、何かのファイルのパスですので、そのパスの通りに、もともとのパソコンから、そのファイルを探し出し、新しいパソコンで同じパスにそのファイルを格納してください
そうすれば、うまくいくと思います。
もし、それでもダメなら、その時のエラーのスクショをアップしてください
kikosi様、回答ありがとうございます。
今新しいPCで試してみました。
(問題の構文に「'」をつけたもの)
「'」をはずしたのですが、パスワードなし、メッセージなし、フォームたちあがらず通常で開いてしましました。
問題のPCがある部署には来週参りますので、その時に試してみます。
早々の回答を頂きながら、返事が遅れてしまい、申し訳ありません。
回答感謝いたします。
No.3
- 回答日時:
うまくいったら、そのMsgBoxを消しましょう
ありがとうございます。
いただいた回答から確認方法が判りました。
今パスワード入力(再設定)の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
No.4ベストアンサー
- 回答日時:
拝承です。
この部分のコード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ファイルにそのまま書き込むのって、セキュリティ上問題ないでしょうかね。
引き続きのご教示、ありがとうございます。
とすると問題のファイルは、テキストファイルに記入されたパスワードを参照して開いている、ということになるのですね。
確かに、セキュリティ上何のためのパスワード?です。
No.5
- 回答日時:
>Public Sub HyperLink(ByVal URL As String)
ですので、「URL」という文字列はこのプロシージャー内で使用する引数名です。
「URL」の内容を毎回確認するのであればNo2さん方法でもできますが、
Call HyperLink(○○) を検索して「○○」の部分を確認すれば、
いつ(どのような処理中に)、何を渡しているかが確認できると思います。
※call は 省略可能ですので、実際に記述されているかは不確定です。
Zincer様 回答ありがとうございます。
カレントプロジェクト内検索で、HyperLinkがヒットしないのです。
又引数「URL」が何であるか、このプロシージャ内にありません。
カレントプロジェクト内検索でもヒットしません。
No.6
- 回答日時:
>とすると問題のファイルは、テキストファイルに記入されたパスワードを参照して開いている、ということになるのですね
もし、HyperLinkに渡したのは、
"C:\S○○○ai\so○i.ini"
であれば、そうなりますね。
ただ、私的には、HyperLineの問題ではない気がします。
理由は、新しいパソコンでエラーが発生したタイミングです。
パスワード変更の時に発生したものですか?それとも、別の処理が発生した時ですか?別の処理で発生する場合は、やはり、そのURLは、別のものだと思います。
また、エラー発生の場所についても、HyperLinkではない気がします。
なぜなら、ShellExceuteの前に、
On Error Resume Next
があります。つまり、エラーが発生しても、何事もないように処理を続けることです。
なので、ShellExecuteでエラーが発生しても、エラーダイアログは表示されません。
なので、一番いいのは、デバッグしてみることですね。
そして、差し支えなければ、エラー発生時のメッセージを見せていただければ、適切なアドバイスが可能かもしれません。
No.7
- 回答日時:
直接、本件には関係がないけれども、コードは、いくぶん古い書き方のような気がしますし、今どき、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内ではありませんね。もう一つの呼出ファイルがないからではありませんか?
No.8
- 回答日時:
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で開こうとするとエラーになります。」
の点が気になったので追加しておきます。
再度の回答ありがとうございます。
追記で記入したように、なぜエラーが出てファイルが開かないのか? という問題は一応解決しました。
タイムラグでこの回答に気付かず失礼致しました。
教えていただきありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。 9 2022/06/17 10:33
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBから参照できないCのDLLを使...
-
batファイルでレジストリキーの...
-
「パス名が無効です」の発生原因
-
VBでファイルが開かれているか...
-
access テキストボックスの値取得
-
VBインストールエラー
-
マクロについての質問
-
Excelvbaのマクロのファイル名...
-
CSVファイルが開かれているかど...
-
システムのシャットダウンは既...
-
freadでデータがない場合の読込...
-
エクセル Fill.UserPictureで...
-
Excelファイルのマクロによる排...
-
アクセスのクエリでコンパイル...
-
Adobeのプレミアプロの書き出し...
-
Access2010 コンパイルエラー...
-
outlook2010のcopy方法
-
すでにファイルが開かれている...
-
エクセル VBA dll 読み込...
-
[VBS]ファイルコピーで怪奇現象
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
batファイルでレジストリキーの...
-
FTPの送信結果を検知したい
-
「パス名が無効です」の発生原因
-
VBでファイルが開かれているか...
-
アクセスのクエリでコンパイル...
-
NAS上のファイルの使用中が解除...
-
Returnに対するGoSubがありません
-
PowerShellを使って関連付けら...
-
access テキストボックスの値取得
-
VBから参照できないCのDLLを使...
-
VB6 Dir関数で52エラー発生
-
freadでデータがない場合の読込...
-
すでにファイルが開かれている...
-
ACCESS VBAでのインポート
-
Access2013にてドラッグ&ドロ...
-
エクセルマクロでエラーの原因...
-
DisplayAlertsブロパティで ”実...
-
OUTLOOK VBA 指定フォルダ内の...
-
FORTRANの実行エラーについて
-
EXCELのVBAでWORDが開いてある...
おすすめ情報
今私のPCのCドライブに、「C:\S○○○ai」フォルダを作成し、開かなかったエクセルファイルを開いてみました。
と、問題なく開けました。
問題のコードはやはりパスワード確認のためのコードでした。
これが必要かどうかは別問題として、このコードの意図することは判りましたので、これで解決とさせていただきます。
ベストアンサーはこれを教えてくださった kikosiさんとさせていただきます。
皆様ありがとうございました。