- 締切済み
メッセージボックスを使い下記のようなものを作りたいのです
メッセージボックスを使い下記のようなものを作りたいのです BOOKを開くときに 読み取り専用で開きますか→はいORいいえ →はいのときはBOOKを読み取りで開くよう設定したい →いいえのとき→パスワードを要求 パスワード入力→”OK"or”NG" OK→書き込みできる状態でBOOKをひらく NG→パスワードがちがいます。→読み取り専用で開きます で読み取り専用でBOOKを開く という具合に進めたいのですがアドバイスをおねがいします
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- DexMachina
- ベストアンサー率73% (1287/1744)
No.4のDexMachinaです。 > 書き込みが終わったあと又保護するときに 当該ファイルを開く時に『書き込みパスワード』などを使用すると、 確かに保護は解除されますが、それは「その場限りの一時的な もの」です。 ファイルアイコンをダブルクリック→ダイアログでパスワードを入力 →編集→上書き保存して閉じる(パスワードは特にいじらない) →再度アイコンをダブルクリック→再度パスワードが要求される ですので、「元のパスワードの再設定」のみなら、その操作を 省略してしまっても問題ありません。 もちろん、定期的なパスワード更新を行われている、ということなら 対応が必要と思いますが、念のため確認する次第です(汗) さて、コードですが・・・既にWendy02さんが提示された後ですので、 「パスワードが正しくなかった場合は、再度パスワードを要求」と したコード例を書いてみました。 なお、ここで要求するパスワードは、コード内へのパスワード記述を 避ける意味で、ファイルの書き込みパスワードそのものとしました。 また、InputBoxでは「*」でのマスクは行えませんので、マスクする 場合はユーザーフォームの自作が必要です。 Private Sub CommandButton1_Click() On Error GoTo エラー処理 Dim Xls As Excel.Application, Wkb As Excel.Workbook Dim strMsg As String, strPwd As String Const vbBlankLine As String = vbCrLf & vbCrLf Const strPath = "C:\Documents and Settings\○○\デスクトップ\pwd.xls" Set Xls = Me.Application strMsg = "以下のファイルを読み取り専用で開きます:" & vbBlankLine & strPath If MsgBox(strMsg, vbYesNo) = vbYes Then Call Xls.Workbooks.Open(strPath, , True) Else Do strMsg = "空白またはキャンセル時は、読み取り専用で開きます。" strPwd = InputBox(strMsg, "書き込みパスワードの入力") If strPwd = "" Then Set Wkb = Xls.Workbooks.Open(strPath, , True) Else Set Wkb = Xls.Workbooks.Open(strPath, , , , , strPwd) End If Loop While (Wkb Is Nothing) And Len(strPwd) 'パスワードが違う限りループ End If 終了処理: Set Wkb = Nothing Set Xls = Nothing Exit Sub エラー処理: Select Case Err.Number Case 1004 strMsg = "パスワードが違います。" & vbBlankLine _ & "正しい書き込みパスワードを入力して下さい。" MsgBox strMsg, , "確認" Resume Next Case Else MsgBox Err.Number & ":" & Err.Description, , Me.Name & " CommandButton1" End Select Resume 終了処理 End Sub ・・・以上です。
- Wendy02
- ベストアンサー率57% (3570/6232)
#4の補足を読みました。ご質問のロジックをコードにしました。パスワードを間違えても、開いてしまうのは、ロジックとしては疑問ですが、そのままにしました。2バイト文字は、失敗しやすいで、辞めたほうがよいです。ブックの保存のパスワード設定も可能です。 以下は、Excel2000用で開発したものですが、ひとつのブックを開けておいてから、別のブックを開けるためのマクロで、自ブックにパスワードの処理は、#3で書いたように無理です。なお、サブルーチンの引数は、セルに置いても読ませるようにしても可能です。 '//標準モジュール Sub OpenMacro() 'マクロで開く Dim fName As String Dim myPath As String Dim oPsw As String Dim rPsw As String Dim wb As Workbook oPsw = "a" rPsw = "b" 'デフォルトパス myPath = Application.DefaultFilePath & "\" fName = "A.xls" On Error Resume Next Set wb = Workbooks(fName) If Err.Number = 0 Then MsgBox "ブックは開いています。", 64 wb.Activate Set wb = Nothing Exit Sub End If On Error GoTo 0 Call sbOpenMacro(fName, myPath, oPsw, rPsw) End Sub Sub SettingPassWord() 'パスワード付き保続 Dim oPsw As String Dim rPsw As String oPsw = "a" rPsw = "b" Call sbPWS(oPsw, rPsw) End Sub '//以下はサブルーチン Sub sbOpenMacro(ByVal fName As String, ByVal myPath As String, ByVal oPsw As String, rPsw As String) Dim msg1 As Integer Dim rdFlg As Boolean Dim ret As Variant Const vbYes = 6 Const vbNo = 7 msg1 = MsgBox("読み取り専用で開きますか", 35) If msg1 = vbYes Then rdFlg = True ElseIf msg1 = vbNo Then rdFlg = False Else Exit Sub End If ret = InputBox("パスワードを入れてください") If StrComp(ret, oPsw, vbBinaryCompare) <> 0 Then MsgBox "パスワードが違うので、読み取り専用で開きます", 64 rdFlg = True Else rdFlg = False End If Application.DisplayAlerts = False Workbooks.Open myPath & fName, , rdFlg, , oPsw, rPsw Application.DisplayAlerts = True End Sub Sub sbPWS(ByVal oPsw As String, ByVal rPsw As String) 'パスワード設定 Dim fName As Variant Const sFILTER As String = "Excel(*.xls),*.xls" If ThisWorkbook Is ActiveWorkbook Then MsgBox "本ブックには、パスワード設定は出来ません。", 48 Exit Sub End If fName = Application.GetSaveAsFilename(, sFILTER) If VarType(fName) = vbBoolean Or fName = "" Then Exit Sub ActiveWorkbook.SaveAs fName, , oPsw, rPsw, True MsgBox "パスワード設定をしたブッが出来ました。", 64 End Sub
- DexMachina
- ベストアンサー率73% (1287/1744)
> BOOKを開くときに ご質問の意図としては、「ある特定のブックを開くときに」、ということで よろしでしょうか。 そうであれば、Excelの基本機能で、概ねご希望を満たすのではないか と思いますので、その方法をご紹介します(なお、当方はExcel2003): 1)当該ブックを開く 2)Excelのメニューから「ツール(T)→オプション(O)」を選択 3)『オプション』ダイアログが開くので、『セキュリティ』タブを選択 4)『このブックのファイル共有の設定』の領域に『書き込みパスワード(M)』 の項目があるので、そこにパスワードを入力し、『Ok』をクリック 5)『パスワードの確認』ダイアログが開くので、先ほどと同じパスワードを 入力して『Ok』をクリック 6)ブックを保存して閉じる ・・・以上です。 これで、同ファイルを再度開くと、添付画像の『パスワード』ダイアログが 出るようになりますので、 読み取り専用で開くなら『読み取り専用(R)』ボタンを 上書き保存可能にするなら、正しいパスワードを入力してOkボタンを それぞれクリックすれば、所定のモードで開くことができます。 (ここでの『読み取り専用』は、「ファイルの上書きができない」という意味 で、セルへの入力などがロックされるという意味ではありません: 編集した上で、別名での保存は可能、ということです) なお、セルの編集ロックなども含めて制御したいということなら、VBAで 独自にコーディングすることになります。 (これも、特定ファイルに限定した前提での話になります) この場合は a)パスワードの認証を行うためのExcelブック b)上記ブックでの認証結果を元に、編集可否を制御されて開かれる 本体ブック という2つのブックを使用する構成にすることで、目的を達せられるかと 思います。 (後者のブックには、予め「読み取りパスワード」を設定しておいた上で、 前者のブックから開くときに、パスワードを指定して開く形にします) ※とりあえず、こちらは(今回は)流れのイメージのみということで・・・※
- Wendy02
- ベストアンサー率57% (3570/6232)
私は、せっかく回答されている人たちに水を指すのは、本意ではありませんが、この辺りは研究してきませんでした。理由は、自明なことだと思っていたからです。もし、私の考え方が間違っているなら、他の回答者の方は、解決策だけを書いてください。私も勉強させていただきます。 あくまでも、Excelのファイル設定として、既にPsswordやReadOnlyの設定されているという条件の上での話です。そうすると、ある意味では、パスワード解除の技術と似ているような気がします。シート解除のコードは案外見かけるものですが、Bookパスワードの解除は、外部からでないと出来ません。それと同じことだと思います。 BOOKを開くときに ・ 「読み取り専用で開く」選択 ・ 「パスワード入力」 といのは、Office自身のセキュリティとして、Excelのファイル側に、予め設定されていたとしたら、両方とも無理だと思います。 もちろん、言うまでもなく、自分自身のブックに、VBAなど(Ver.4マクロを含む)で、設定しても無理だと思います。Officeのセキュリティ自体は、ExcelのApplication 側の仕様ではなく、そうした機能が設定されているわけです。 ファイルを開く前に、Excel アプリケーション側がチェックして機能しています。だから、アプリの機能の後のVBAが先行できるとは思えません。別のアプリケーションや別の言語を用意しなければ、私にはできるとは思えないのですが。何も設定されていないブックに、「読み取り専用で開きますか?」と聞くのは、ナンセンスです。本体のExcelアプリケーションとは別に、オートメーションのエラーが返ることで、それをチェックすることは可能だとしても、内部からは不可能です。 ReadOnly(読み取り専用) は、ファイル側のAttribute ではなく、ファイル側のReadOnly だとしたら、それを読み出す方法があったのでしょうか。数日前に、ずっと調べてみたけれども、公開されていませんでした。Binary で調べるなどして、キーを見つけるぐらいしかないし、そういうことは、結局、クラックと同じ技術につながるものだと思います。 それから、外部言語としては、VBScriptですが、XPでは、暗号化することも可能ですし、パスワードを、「*(アスタリスク)」に変えることもできたのですが、Vistaなどでは、出来なくなっています。秘匿性のある言語を持っていない場合は、例えば、MSは、子ども向けのVB系のフリーの新しい言語(Small Basic)を出したそうですから、そんなもので試してみるしかないような気がします。 なお、設定のマクロ--セキュリティの「中」「高」「最高」という対策については、可能ですが、自主規制ですが、掲示板では公開することはしていません。それをプログラム(VBSを含む)に組んでも、他人の環境ではウィルス・チェックでおそらくは引っかかってしまいます。ファイル自身のプロパティのセキュリティの属性を変えないといけません。
- keithin
- ベストアンサー率66% (5278/7941)
基本形: 標準モジュールに。 Sub Auto_Open() Dim res res = MsgBox("read only", vbYesNo) If res = vbNo Then res = InputBox("pass") If res = "correct" Then Exit Sub End If MsgBox "wrong. read only", vbOKOnly End If Application.DisplayAlerts = False ThisWorkbook.ChangeFileAccess Mode:=xlReadOnly Application.DisplayAlerts = True End Sub 勿論メッセージボックスでは,「パスワードを記入」させたりとかは出来ません。 プログラムのコアになる読み取り専用にする事や,メッセージボックスへの応答による分岐などについて参考にした上で,引き続き… ○ユーザーフォームを自作してパスワードの記入を***表示でマスクしたり, ○マクロそのものに判定用に正しいパスワードが記入されているのをオープンにしないようプロジェクトを表示用にロックしたり, ○マクロを無効で開かれたときはブックそのものが用をなさないようにあれこれ隠したり といった追加の細工について,さらに研究したり必要に応じて別途ご相談を投稿してみてください。
- layy
- ベストアンサー率23% (292/1222)
BOOKオープン時に実行されるモジュール部(=準備されているもの)で記載になります。 「MSGBOX」は、 単にメッセージ表示するものと メッセージ表示しYES・NO選択をさせてその結果で処理続行させるものと あります。 また何か文字列を入力させる場合は「INPUTBOX」というのがあります。 ヘルプファイルで各コマンドの用途、使用例を確認してみてください。 開こうとするブックは、保存のときのオプションで 読取パスワード設定や書込パスワード設定とかしているのでしょうか?。
補足
layyさんお世話になります。 今はBookの保護(当方EXCEL2000)を使用しております。 書き込みの時にパスワード入力で保護を解除、書き込んだあと改めてパスワード入力し、保護 ということをやっています。
補足
DexMachinaさんありがとうございます。 当方Excel2000を使用し、今はそのBOOKを保護しています。 が、書き込みが終わったあと又保護するときにパスワードの入力間違い("ん"を"n"ではなく"nn"と入力) が多発したため今回アドバイスをおねがいしました。