• 締切済み

シートの保護解除を、変数で試したい

はじめて質問します。よろしくお願いします。 常用のパスワードを配列に準備しておき、 ActiveSheet.Unprotect Password:=mystrを実行して、保護解除ができない場合に、 パスワードを変更するようにエラー処理をして、適合するパスワードを探すようにしました。 結果、excel20101では、予定の動きをするのですが、 excel2007では、(1)を実行後、パスワードを求めるダイアログがでて、(2)以降を実行してしまいます。 Public Sub test() tt = False ps = Array("test", "rrr", "1234", "123", "qqq") p = 0 mystr = "" Application.DisplayAlerts = False Worksheets(1).Activate On Error GoTo e1 ActiveSheet.Unprotect Password:=mystr '・・・・(1) On Error GoTo 0 Application.DisplayAlerts = True          '・・・・(2) MsgBox mystr tt = True Exit Sub e1:   '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・(3) If p < UBound(ps) Then mystr = ps(p) p = p + 1 Resume Else mystr = InputBox("??", "EE", "") If mystr = "" Then Exit Sub Else Resume End If End If End Sub この Application.DisplayAlerts = False や On Error GoTo によるエラー処理は、 1 2010では機能するのに、2007では機能していないのでは?   *どこかに、設定する場所があるのでしょうか。 2 2007でも、シート保護の解除以外の時では、この記述で機能するのですが・・・・ <やりたいこと> 複数のユーザー作成のBookは、それぞれのパスワードが決まっている。ユーザーごとのパスワードをマクロで解除したいのですが、うまくいきません。  だらだらと、長い文章で分かりにくい質問ですが、どなたか、ご教授をお願いします。

みんなの回答

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

今のマクロで 変更前: mystr = "" 変更後: mystr = "+" などのように,空白ではなく「間違ったパスワード」をmystrの初期値にして作動させてみてください。 Excel2007では, activesheet.unprotect password:="" という操作を行うと,パスワードが入力されていないとみなしてパスワードの入力を求めますね。 パスワードを付けて保護したシートに対して,ただ activesheet.unprotect と命じたのと同じ動作をしています。 #間違ったパスワードを使ってUnprotectを試みると,意図通りその後エラーセクションにジャンプします。

関連するQ&A

  • パスワードでシート保護したExcelへの画像貼り付けについて

    Excel2000でロックしていないセルに画像を貼り付けようと思います。 パスワードでシート保護しています。 VBAで次のように処理したら画像は貼り付けられました。 しかしパスワード入力を求められ、入力すると画像の挿入後シートは保護されたのですが、パスワードは解除になっています。 パスワード解除にならずに画像挿入できる方法をご教示ください。 さらに挿入後のサイズ変更のVBAも併せて教えて頂ければ助かります。 当方VBAについては全くの初心者です。 Sub 画像挿入()   With ActiveSheet     'シート保護解除     .Unprotect     '画像挿入ダイアログ表示-->画像を挿入     Application.Dialogs(xlDialogInsertPicture).Show     '画像が挿入されたら、保護のロック対象外に設定     If TypeName(Selection) = "Picture" Then       Selection.Locked = False     End If     'シート保護     .Protect DrawingObjects:=False, Contents:=True   End With End Sub

  • エクセルマクロで 新規ブックにシートをコピーして保存

    エクセルのマクロを使い 名前の決まっている特定のシートを 新規ブックにして名前をつけて保存をしたいのです. 色々参考にして以下のようなマクロを書いたのですが これだと元々のファイル名が変わって保存されてしまいました。 どなたかお知恵をお貸しください。 今作ったマクロ Sub p() Worksheets("印刷用日誌").Copy MsgBox Year(Now) & "-" & Format(Now(), "yy-mm") & "-" & Range("k7") On Error Resume Next Application.DisplayAlerts = False ThisWorkbook.SaveAs Year(Now) & "-" & Format(Month(Now), "00") & "-" & Format(Day(Now), "00") Application.DisplayAlerts = True On Error GoTo 0 End Sub よろしくお願いします

  • Excel 置換? VBA

    先ほども質問したんですが、 A1に010と入力すると田中、020入力で鈴木と出来るように、 ------------------------------------------------------ Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub Select Case Target.Value Case "010": myStr = "田中" Case "020": myStr = "鈴木" Case "030": myStr = "岡田" Case "": myStr = "" Case Else: myStr = "非該当" End Select Application.EnableEvents = False On Error GoTo line Target.Value = myStr line: Application.EnableEvents = True End Sub ---------------------------------------------------- を教えていただきました! が、A2でも同じようなことを行いたいのです! VBAの知識が乏しいのでコピペでいろいろやってみたのですが、エラーで出来ませんでした…。 A1 A2 ・ ・ ・ と同じように入力できるようにするにはどのようにすればよいのでしょうか?もう一度教えて下さい。よろしくお願いします。

  • Excelシートの保護にパスワードが設定されているか

    行いたいのは、該当EXCELシートに所定のパスワードがかかっているか 判断したいのです。 Office2003では、 1.パスワードを空白で解除する 2.エラーでなければ、パスワード未設定でエラー 3.2.でOKの場合、所定のパスワードで解除する。 4.エラーの場合、パスワードエラー。 としていました。 しかし、2007では、1.の時点で 異なるパスワードで保護を解除しようとすると パスワード確認のメッセージBOXが出てきてしまいます。 Application.DisplayAlerts = False も効きません。 Bookのパスワード判断の[HasPassword]のようなものがあればよいのですが・・

  • 数値かどうかを取得したい IsNumberではダメ

    Sub Macro2() Dim mystr As String mystr = "1" If IsDate(mystr) = False Then MsgBox "NO" End If End Sub これなら日付型かどうかを取得できるのに、 Sub Macro1() Dim mystr As String mystr = "1" If IsNumber(mystr) = False Then MsgBox "NO" End If End Sub だと、IsNumberがコンパイルエラーになります。 変数に入っている値が数値として評価できるかを取得する方法を教えてください。

  • シート保護のパスワードは・・・

    下の「シート保護」マクロは、パスワード「111」でシートを保護しなさい。    「シート保護解除」マクロは、パスワード「111」でシートの保護解除をしなさい。 という命令だと思うのですが・・・ Sub シート保護()   ActiveSheet.Protect possword = "111" End Sub Sub シート保護解除()   ActiveSheet.Unprotect possword = "111" End Sub パスワードを入力してシートの保護を解除しようとすると、 入力したパスワードは間違っています。 CapsLockキーがオフになっていることを確認し、 大文字と小文字が正しく使われていることを確認してください。 というメッセージが出るのですが・・・、 マクロで作成した保護は、マクロで解除しないとダメという意味なのですか? シートで保護解除できるようにしたいのですが、できますか?

  • エクセルVBAで

    全シート保護(保護の解除)のコードなんですが、パスワードを求めない形にするには下記をどうすれば良いのですか? Sub 全シート保護の設定() Dim Sh As Worksheet x = Application.InputBox("パスワードを入力して下さい", Type:=3) For Each Sh In Worksheets Sh.Protect (x) Next Sh End Sub Sub 全シート保護の解除() Dim Sh As Worksheet On Error GoTo ErLine Do x = Application.InputBox("パスワードを入力して下さい", Type:=3) Loop While x = "False" For Each Sh In Worksheets Sh.Unprotect Password:=x Next Sh Exit Sub ErLine: y% = MsgBox("パスワードが違います ! 終了します", 48) End Sub 毎度すみませんがよろしくお願いします。

  • Excel VBAでのシートの削除について

    Excel VBAで、シート上に配置されたボタンをクリックすることで、メッセージを出さずにそのシートの削除をしたいと思っています。 サンプルとして、シート上(例えばSheet1)にボタンを1個配置し、 ------------------------------------------------------- Private Sub CommandButton1_Click() Application.DisplayAlerts = False Delete Application.DisplayAlerts = True End Sub ------------------------------------------------------- のようにすると、オートメーションエラーが起きます。 そこで、 Application.DisplayAlerts = True をコメントアウトしてやれば実行はできるのですが、その後別のシートで処理を行う場合には、再度メッセージを表示してほしいと思っています。 ためしに、Sheet1削除後にアクティブになるSheet2に次のようなコードを記述しました。Sheet1同様、シート上にボタンを1個配置しています。 ------------------------------------------------------- Private Sub CommandButton1_Click() MsgBox Application.DisplayAlerts End Sub Private Sub Worksheet_Activate() MsgBox "次に出るメッセージはアクティブ直後のDisplayAlerts設定。" MsgBox Application.DisplayAlerts Application.DisplayAlerts = True MsgBox "次に出るメッセージは変更後のDisplayAlerts設定。" MsgBox Application.DisplayAlerts End Sub ------------------------------------------------------- こうすれば、Sheet1削除後、アクティブになった直後はDisplayAlertsがFalse。その後設定変更してTrueになるかとおもったのですが、結果はFalseでした。しかしその後、ボタンをクリックするとTrueが返ってきました。 いろいろ調べましたが、なぜこのような結果になるのかわかりません。よろしくお願いいたします。

  • フォルダ内の複数ブック・シートを一括保護/解除する

    フォルダの中に複数のExcelファイル(ブック)が入っており、 それら全てのブック・シートの保護/解除を一括して行うマクロを現在使用しています。(後述) <現在の利用状況> ◆フォルダの中に複数のExcelファイル(ブック)が入っている(雛形、シート構成は全て同じ) ◆全てのブックにパスワード付きでブック保護・シート保護をかけている→パスワードは共通(1111) ◆マクロ用ブックは上記の処理対象ブックとは別フォルダに入れている (現在のVBAでは同一フォルダ内に入れた状態では作動しない) ◆マクロを実行する都度、任意のフォルダを選択する <改善希望> ◆マクロ用ブックと処理対象のブックを同一フォルダに入れた状態で作動するようにしたい (同一フォルダ内の自ブック以外のブックに対してブック・シートの保護/解除を一括処理したい) VBA初心者なので構文をどう書き換えるかで行き詰っています。 ThisWorkbook.Path を使うというのはなんとなく分かりますが、 何パターンか試してエラーの繰り返しです…。 ご教示頂けます様お願いいたします。 ------------------------------------------------------------------------- Sub 選択フォルダ内全て保護() Dim myFol As Object, myFile As Object, sh As Worksheet Dim openFilePath As String Const myPass As String = "1111" Set myFol = CreateObject("Shell.Application").BrowseForFolder(0, "フォルダを選択してください", 0) If myFol Is Nothing Then Exit Sub Application.ScreenUpdating = False openFilePath = myFol.self.Path & "\" With CreateObject("Scripting.FileSystemObject") For Each myFile In .GetFolder(openFilePath).Files If .GetExtensionName(myFile.Path) = "xls" Then With Application.Workbooks.Open(myFile.Path) For Each sh In .Worksheets sh.Protect Password:=myPass, DrawingObjects:=False, Contents:=True, Scenarios:=True, _ AllowFormattingCells:=True, AllowFormattingColumns:=True, AllowFormattingRows:=True, _ AllowInsertingRows:=True, AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True Next sh .Protect Password:=myPass, Structure:=True, Windows:=False .Save .Close False End With End If Next myFile End With MsgBox "終了しました" End Sub ------------------------------------------------------------------------- Sub 選択フォルダ内保護全て解除() Dim myFol As Object, myFile As Object, sh As Worksheet Dim openFilePath As String Const myPass As String = "1111" Set myFol = CreateObject("Shell.Application").BrowseForFolder(0, "フォルダを選択してください", 0) If myFol Is Nothing Then Exit Sub Application.ScreenUpdating = False openFilePath = myFol.self.Path & "\" With CreateObject("Scripting.FileSystemObject") For Each myFile In .GetFolder(openFilePath).Files If .GetExtensionName(myFile.Path) = "xls" Then With Application.Workbooks.Open(myFile.Path) For Each sh In .Worksheets sh.Unprotect Password:=myPass Next sh .Unprotect Password:=myPass .Save .Close False End With End If Next myFile End With MsgBox "終了しました" End Sub -------------------------------------------------------------------------

  • セルの値をワークシート名にする(エクセル2013)

    インストラクターのネタ帳さんより http://www.relief.jp/itnote/archives/003382.php 下記「セルの値をワークシート名にする?Worksheet_Change」 を拝借し利用させていただこうと思いましたが ---------------------- Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ERR_HANDLER If Target.Address(False, False) = "H1" Then ActiveSheet.Name = Range("H1").Value End If Exit Sub ERR_HANDLER: MsgBox "現在のH1セルの値はシート名にできません。" End Sub ---------------------- はそのまま出来るのですが、 H1セルにデータの入力規則:リストを指定しますと エラーとなりシート名が変わりません sheet1のリストA1:A50をsheet2のH1セルにリスト表示させ その表示名をそのままシート名に出来ませんでしょうか? ---------------------- Sub copy Range("H1").Copy Range("P1") End Sub ---------------------- Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ERR_HANDLER If Target.Address(False, False) = "P1" Then ActiveSheet.Name = Range("P1").Value End If Exit Sub ERR_HANDLER: MsgBox "現在のP41セルの値はシート名にできません。" End Sub ---------------------- としてH1のセルをP1にコピーしたものを指定して試しましたがやはりエラーとなり うまくいきませんでした。 全くの素人で恐縮ですがよろしくお願いいたします

専門家に質問してみよう