• ベストアンサー

【Excel】保護パスワード自動入力について

いつもお世話になります。 ユーザーフォームを利用した不特定多数の人間が利用する計算書を下記の方法で作成しています。 (1)ユーザーフォームへ値を入力 (2)計算 (3)ワークシートへ転記 (4)印刷し計算書として使用 不正な値を入力入力し、印刷されない様にワークシート上の値と計算値が異なる場合、印刷できないようにしました。 しかしながら、画面コピー(プリントスクリーン)を防止する為の手段がいまひとつ浮かびません。 現在検討中の手段として、 (1)保護 (ActiveSheet.Protect) (2)実行 (3)保護解除 (ActiveSheet.Unprotect) (4)ワークシートへ転記 (5)保護 (ActiveSheet.Protect) ※括弧内はコードのつもりです・・・ 上記(2)・(5)の保護の際にパスワードを設定出来ないのですが、設定する方法はあるのでしょうか? ※保護しっぱなしだと”(4)ワークシートへ転記”が出来ないので・・・ 以上何卒よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

> 上記(2)・(5)の保護の際にパスワードを設定出来ないのですが、設定する方法はあるのでしょうか? ありますよ。 ActiveSheet.Protect Password:="パスワード" です。 解除は ActiveSheet.Unprotect Password:="パスワード" ただ、一度  ActiveSheet.Protect Password:="pass", UserInterfaceonly:=True  と、UserInterfaceonly:=True をいれておくと、保護解除しなくともマクロからの変更は受け付けてくれますから解除する必要はないです。 あるいは、 (1)ユーザーフォームへ値を入力 (2)計算 (3)非表示にした保護していないワークシートへ転記 (もちろんブック保護しておき表示されないようにする) (4)そのワークシートから式で(=で)参照した印刷用のワークシートはシート保護し変更不可とする。 (5)印刷用のワークシートを印刷し計算書として使用 するのはいかがでしょう?

eliemylove
質問者

お礼

まさに私がやりたかったことです!! ありがとうございました♪

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 一応、適当な場所でよいので、#2の merlionXXさんのところに、以下の二行を入れておいたほうがよいです。 ActiveSheet.EnableSelection = xlNoSelection ActiveWorkbook.Protect Structure:=True, Windows:=True こうすると、マウス等で引っかからなくなりますから、シートを範囲のコピーが利かなくなります。ブックの構成と、Window のプロテクトもしておけば、シートコピーや移動が利かなくなります。(ただし、UserForm 自体を、ModalMode(ShowModal) =True にして、UserForm が立ち上がっていない状態では、ブックは閉じてしまうということで、あれば必要ありません) >しかしながら、画面コピー(プリントスクリーン)を防止する為の手段がいまひとつ浮かびません。 私の書いたものは、よく知られた技法です。もし、以下が分かるようなら使ってみてください。ただ、複雑な環境下では、以下のコードは失敗しますし、また、解除をしないと、その影響は、Excelを終了した後まで、残っています。(ブックが正常終了すれば、解除されます) 画面コピーが利かなくなります。Workbook_Open で、Disabled_PrintScreen を呼び出し、Workbook_BeforeColse で終わらせます。なお、メッセージは英語で書いてありますが、これは、私が書いた英語です。ヘンでしたらスミマセン。 また、もう少し複雑な方法も可能ですが、今度は、それを作る側の問題や掲示板の都合もあろうかと思いますので、これ以上のものはやめておきます。本来は、データとExcelは別々にして、必要に応じて、パスワードからバイナリ・データを変換しインポートするという方法が良いと思います。 ------------------------------------------------ 'ThisWorkbook Module Private Sub Workbook_Open()  Call Disabled_PrintScreen End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean)  Enabled_PrintScreen End Sub 'General(標準)Module Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function RegisterHotKey Lib "user32.dll" (ByVal hWnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long Private Declare Function UnregisterHotKey Lib "user32.dll" (ByVal hWnd As Long, ByVal id As Long) As Long Private Const VK_SNAPSHOT As Long = &H2C Public HookFlg As Boolean Sub Disabled_PrintScreen()  Dim rtn As Variant  Dim hWnd As Long  hWnd = FindWindow("XLMAIN", Application.Caption)  rtn = RegisterHotKey(hWnd, 1&, 0&, VK_SNAPSHOT)    'Controls Name 'Edit', SubControl Name 'Copy'  With Application.CommandBars("Worksheet Menu Bar").Controls("編集(&E)").Controls("コピー(&C)")   .Enabled = False  End With  If rtn = 0 Then   MsgBox "Not Success, Please check staying HardCopy Tool or any other tools", vbCritical, "Err"  Else   HookFlg = True   MsgBox "Success Hotkey Hooked"  End If End Sub Sub Enabled_PrintScreen() 'Released  Dim rtn As Variant  Dim hWnd As Long  If HookFlg = False Then Exit Sub  hWnd = FindWindow("XLMAIN", Application.Caption)  rtn = UnregisterHotKey(hWnd, VK_SNAPSHOT)   'Controls Name 'Edit', SubControl Name 'Copy'  With Application.CommandBars("Worksheet Menu Bar").Controls("編集(&E)").Controls("コピー(&C)")   .Enabled = True  End With  If rtn <> 0 Then    MsgBox "Due to Unknown Cause, Not Unhooked", vbCritical, "Err"  Else   HookFlg = False    MsgBox "Success, Unhooked And Copy Button Enabled"  End If End Sub

eliemylove
質問者

お礼

ありがとうございます。 長文のご回答感謝いたします。 ただ真に申し訳ございませんが、御回答頂きました内容が理解出来る力量にはありません。 印刷ボタンを作りたくないという誠に勝手な理由から、印刷プレビューをコピーされるとお仕舞いという壁につき当たってしまいました。 御回答頂きましたものにかんしてはじっくりと理解すべく勉強いたします。 本当に感謝申し上げます。

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.3

>画面コピー(プリントスクリーン)を防止する為の手段がいまひとつ浮かびません。 画面コピーも防止したいのでしたら、印刷する間もそのシートは表示しない(非アクティブ)状態にしておきたいということになりますよね? 面白そうなので実験してみました。(Excel 2000です) 保護に関してはNo2の方が説明しておられるので、保護の操作は以下省略します。 まず、いつも表示しておくシート(Shee1)を1ページ目に、プリント用のシート(印刷用)を2ページ目にセットして、印刷用シートは非表示にしておきます。   (1) フォームからの入力   (2) Sheets("印刷用").Visible = True  '# シートを表示(アクティブになってしまう。)   (3) Sheets("Sheet1").Select      '# 印刷用シートを見えなくする。   (4) 計算して印刷用シートに記載    (5) ActiveWorkbook.PrintOut From:=2, To:=2, Copies:=1 '# 印刷用シート(2ページ目)をプリント   (6) 計算結果を消す   (7) Sheets("印刷用").Visible = False '# シートを非表示にする とすれば(2)、(3)の間で記入されていないシートが一瞬だけ見えますが、あとは見えないままに出来ます。 シートだけを印刷しようとすると、印刷用シートがアクティブになってしまうようなので、(5)ではブック全体の印刷としながら2ページ目だけ印刷するようにしています。(こうすると表示されないですむ) 残る可能性としては、マクロ実行中にブレイクされるとシートが無防備な状態になってしまう可能性がありますが、そこまでは実験していません。 (例えば、プリンター接続をはずして実行すると、計算結果がシートに入った状態でプリント時にエラーとなる。)

noname#79209
noname#79209
回答No.1

フォームで入力しているなら、 通常は、シートの文字を白くしておいて、印刷時に黒文字化、 印刷が終わったらまた白文字に戻す。 なんて、姑息な手段じゃダメですかね。

eliemylove
質問者

お礼

早々の回答感謝です。 参考になりました。 ありがとうございます。

関連するQ&A