エクセルで1つのマクロを複数のシートに適用したい

このQ&Aのポイント
  • エクセルで複数のシートに同じマクロを適用する方法を教えてください。
  • セルの入力時に自動で保護をかけるマクロを使用していますが、複数のシートで有効にする方法を知りたいです。
  • ThisWorkbookにマクロを登録するために、各シートに範囲名を指定する必要があるのでしょうか?
回答を見る
  • ベストアンサー

エクセルで1つのマクロを複数のシートに適用したい

いつもお世話になっております。 以前ここで入力セルはファイル保存時に自動で保護かかるように、下記のコードを教わって便利に使い始めたのでですが、同じBookの複数のシート、あるいは一括で全てのシートで有効にしたいのですが。(この機能をデフォルトで選択機能にしていないのはおかしい位に思い始めています。) シート毎に範囲名を指定して、This Workbookにマクロを登録する必要があるのでしょうか? Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Const MyPassword = "" 'パスワード(省略可) Dim RowCnt As Long Dim ColCnt As Long Dim MyCell As Range With ThisWorkbook.Sheets(1) .Unprotect Password:=MyPassword For Each MyCell In Range("保護範囲") If MyCell.Value <> "" Then MyCell.Locked = True Else MyCell.Locked = False End If Next MyCell .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _ Password:=MyPassword End With End Sub

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.7

>.SpecialCells(xlCellTypeBlanks).Locked = False が黄色になっています。 普通は使われた領域内の空白セルを処理するのですが全く使われていない シートだと全セルが対象となり一定数を超えてエラーになるようです。 SpecialCells メソッドを使って特定の条件を満たしているセルに ロックを掛けたり、外したりしているのですが 条件を満たしているセルが全く無かったり、多すぎたりすると エラーになりますのでOn Error ステートメントで処理しました。m(__)m Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)   Const MyPassword = "1234" 'パスワード(省略可)   Dim sh As Worksheet   On Error Resume Next   For Each sh In Worksheets     sh.Unprotect Password:=MyPassword     With sh.Cells       '全セルのロックを外す       .Locked = False       '定数が含まれているセルにロックを掛ける       .SpecialCells(xlCellTypeConstants).Locked = True       '数式が含まれているセルにロックを掛ける       .SpecialCells(xlCellTypeFormulas).Locked = True     End With     sh.Protect DrawingObjects:=True, Contents:=True, _       Scenarios:=True, Password:=MyPassword   Next   On Error GoTo 0 End Sub

akira0723
質問者

お礼

ありがとうございました。 数日間のトライ&エラーからあっさり解放されました。 質問が適切でなかった為にwatabe007さん、HohoPapaさん、ご両名に何度もお手数をおかけしてしまいました。 本件は顧客様からの指摘事項で都度手動でロックしていたのですが、保護忘れが頻発するので自動化を考え出したのが始まりでした。 本当にありがとうございました。

akira0723
質問者

補足

テスト用Book(本物のコピー)で試してみたところうまく動きました。 最初からあったオープンマクロとバティング?したようですが、一旦全部削除してから再度こちらを先に入れて動作確認後、最初からのものをコピペしたら両方正常に動くことを確認しました。 更にシートを新規に追加しても問題なく動きました。 また、気になっていた保存、オープン時の時間も気にならない位で動作するようですのでこれで試用し始めてみようかと思います。 [本日の作業終了!!」といった感じです。

その他の回答 (6)

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.6

>「Range クラスのLockedプロパティを設定できません」 >デバックを見ると MyCell.Locked = Trueが黄色になっています。 先に説明した範囲名の設定要領が当方の期待と異なっていませんでしょうか? 少なくとも私の環境では期待通り動作しています。 添付画像の参照範囲列に埋まっているシート名と 範囲列に埋まっているシート名が1:1で一致しているかがポイントです。 >最悪、各Bookの3枚のシートに「範囲名1」~「範囲名3」とすれば >今のマクロの改良で出来るならそれで妥協もありです。 これで妥協し、 今までのコードを繰り返すコード (泥臭いコード、かっこ悪いコード)でよければ ↓のようなコードになります。 なお、このコードの場合は、添付画像の範囲列をブックにします。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  Const MyPassword = "" 'パスワード(省略可)  Dim RowCnt As Long  Dim ColCnt As Long  Dim MyCell As Range  With ThisWorkbook.Sheets(1)   .Unprotect Password:=MyPassword   For Each MyCell In Range("保護範囲1")    If MyCell.Value <> "" Then     MyCell.Locked = True    Else     MyCell.Locked = False    End If   Next MyCell   .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _   Password:=MyPassword  End With  With ThisWorkbook.Sheets(2)   .Unprotect Password:=MyPassword   For Each MyCell In Range("保護範囲2")    If MyCell.Value <> "" Then     MyCell.Locked = True    Else     MyCell.Locked = False    End If   Next MyCell   .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _   Password:=MyPassword  End With  With ThisWorkbook.Sheets(31)   .Unprotect Password:=MyPassword   For Each MyCell In Range("保護範囲3")    If MyCell.Value <> "" Then     MyCell.Locked = True    Else     MyCell.Locked = False    End If   Next MyCell   .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _   Password:=MyPassword  End With End Sub

akira0723
質問者

お礼

本当にいつもお世話になっております。 今回も何度も助けていただき感謝です。 上記の不具合も恐らく当方の無知に起因していることは間違いないと思うのですが、先ほどNo7さんのご回答でうまくいきそうなのでこれで試行してみることにします。 お手数をおかけして申し訳ありませんでした。

akira0723
質問者

補足

何度もお手数をおかけしています。 ご指摘の範囲の指定方法、範囲名等の間違いは当方の場合よくあるので朝一で何度も確認し、上の赤枠の表記が違っていないことを確認し、何度か思い当ることを試してみましたが駄目です。 1.結合セルは影響しませんか? 2.シートごとに保護範囲が違っていても問題ないですか? Sheet1は(A1:J500)、Sheet2は(A1:M200)というように。 両方とも試してみたのですが(あまり自信なし)うまくいきません。 困った。 上の妥協案は聞いておいて失礼ですが、当方には長すぎるて動く気がしないので今は試行は見送らせてもらいますのでご了承下さい。 午後にでも再度気分を変えてトライしてみます。(期待薄~)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.5

>今回の質問の背景には非常に多くのファイルが対象となるための では、全シートの値が入ったセルのみロックを掛けては Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)   Const MyPassword = "1234" 'パスワード(省略可)   Dim sh As Worksheet   For Each sh In Worksheets     sh.Unprotect Password:=MyPassword     With sh.Cells       '全セルにロックを掛ける       .Locked = True       '空のセルのみロックを外す       .SpecialCells(xlCellTypeBlanks).Locked = False     End With     sh.Protect DrawingObjects:=True, Contents:=True, _       Scenarios:=True, Password:=MyPassword   Next End Sub

akira0723
質問者

補足

何度もお手数をおかけします。 この発想はなかったのですが、これはコードのコピペだけで出来るのでとりあえずダミーファイルで試してみたのですが、保存する時に「該当するセルが見当たりません」とエラーメッセージが出てそれを無視すると保存され、マクロが動いてSheet1とSheet2の全セルにロックがかかってそれ以外のシートの全てのセルにはロックがかかりません。 つまり2枚のシートにのみ空白セルを含めて全セルにロックがかかります。 デバックを見ると .SpecialCells(xlCellTypeBlanks).Locked = False が黄色になっています。 このコードは非常に簡便でわかりやすいのでもう少し教えてください。 この仕組みは今後全てのBook(現状で200以上)に適用していくつもりなので出来るだけ手間いらずで出来るコードにしたいのでよろしくお願いします。

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.4

先刻承知かもしれませんが、 更に 保存するときに画面が瞬くのでこれを防ぎ 加えて、 保存する時に選択していたシートが選択された状態で 保存するようにしてみました。 Option Explicit Const MyRName = "保護範囲" Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  Dim ActSHNum As Long  Dim WkCounter As Long    ActSHNum = ThisWorkbook.ActiveSheet.Index  Application.ScreenUpdating = False    For WkCounter = 1 To (ThisWorkbook.Sheets.Count)   MyLock WkCounter  Next WkCounter    Application.ScreenUpdating = True  ThisWorkbook.Sheets(ActSHNum).Select   End Sub Sub MyLock(ShCount As Long)  Const MyPassword = "" 'パスワード(省略可)  Dim RowCnt As Long  Dim ColCnt As Long  Dim MyCell As Range  ThisWorkbook.Sheets(ShCount).Select  If isInMyRange(ShCount) = False Then Exit Sub  With ThisWorkbook.Sheets(ShCount)   .Unprotect Password:=MyPassword   For Each MyCell In Range(MyRName)    If MyCell.Value <> "" Then     MyCell.Locked = True    Else     MyCell.Locked = False    End If   Next MyCell   .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _   Password:=MyPassword  End With End Sub Function isInMyRange(ShCount) As Boolean  Dim MyName As Name  isInMyRange = False  '存在するかのチェック  For Each MyName In ThisWorkbook.Sheets(ShCount).Names   If InStr(MyName.Name, MyRName) > 0 Then    isInMyRange = True    Exit Function   End If  Next End Function

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.3

>同じBookの複数のシート、 >あるいは一括で全てのシートで有効にしたい ↑の前者の求めを見落としていました。 前回紹介したのはすべてのシートのそれぞれに、 "保護範囲"という範囲名が定義されている前提です。 一部のシートを対象にしたくない場合があるようですので、 "保護範囲"という範囲名が定義されていないシートは 対象としないようにしてみました。 Option Explicit Const MyRName = "保護範囲" Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  Dim WkCounter As Long  For WkCounter = 1 To (ThisWorkbook.Sheets.Count)   MyLock WkCounter  Next WkCounter End Sub Sub MyLock(ShCount As Long)  Const MyPassword = "" 'パスワード(省略可)  Dim RowCnt As Long  Dim ColCnt As Long  Dim MyCell As Range  ThisWorkbook.Sheets(ShCount).Select  If isInMyRange(ShCount) = False Then Exit Sub  With ThisWorkbook.Sheets(ShCount)   .Unprotect Password:=MyPassword   For Each MyCell In Range(MyRName)    If MyCell.Value <> "" Then     MyCell.Locked = True    Else     MyCell.Locked = False    End If   Next MyCell   .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _   Password:=MyPassword  End With End Sub Function isInMyRange(ShCount) As Boolean  Dim MyName As Name  isInMyRange = False  '存在するかのチェック  For Each MyName In ThisWorkbook.Sheets(ShCount).Names   If InStr(MyName.Name, MyRName) > 0 Then    isInMyRange = True    Exit Function   End If  Next End Function

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

各シートの保護範囲(A1:G30など) をそれぞれのシートの特定のセルに書いておき 書かれていないシートは処理をしないにしては、どうでしょうか Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)   Const MyPassword = "1234" 'パスワード(省略可)   Dim sh As Worksheet, strAdd As String   For Each sh In Worksheets     '各シートの保護範囲のアドレスを使用していないセル(ここでは仮にZ1としています。)     '処理しないシートにはアドレスを書かない     strAdd = sh.Range("Z1").Value     'アドレスが記されていないシートは処理しない     If strAdd <> "" Then       sh.Unprotect Password:=MyPassword       With sh.Range(strAdd)         'ロックを掛ける         .Locked = True         '空のセルのみロックを外す         .SpecialCells(xlCellTypeBlanks).Locked = False       End With       sh.Protect DrawingObjects:=True, Contents:=True, _         Scenarios:=True, Password:=MyPassword     End If   Next End Sub

akira0723
質問者

お礼

ご回答ありがとうございました。 このような方法もあること参考になりました。

akira0723
質問者

補足

毎度お世話になっております。 質問にぬけがあってお手数をおかけすることになってしまいました。 >各シートの特定のセルに・・・ というのはファイルが1つの場合だと有効ですが、今回の質問の背景には非常に多くのファイルが対象となるための解決策なのでご回答ではあまり効果的ではないと思われます。 説明不足で申し訳ありませんでした。

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.1

提示のコード、見覚えがあります。 ( ^^) _U~~ 範囲名を使うので、若干、手の込んだ処置が必要です。 まず、範囲名について 範囲名には、 ブック単位(ブック内で同じ範囲名を複数定義できない範囲名) と シート単位(シートが変われば同じ範囲名が定義できる範囲名) とがあります。 今回の処理では、後者を使う必要があり、 範囲名を定義するときに、添付画像のようにすれば、 後者の定義になります。 そのうえで、以下のコードにすれば 期待の動作になるはずです。 Option Explicit Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  Dim WkCounter As Long  For WkCounter = 1 To (ThisWorkbook.Sheets.Count)   MyLock WkCounter  Next WkCounter  ThisWorkbook.Sheets(1).Select End Sub Sub MyLock(ShCount As Long)  Const MyPassword = "" 'パスワード(省略可)  Dim RowCnt As Long  Dim ColCnt As Long  Dim MyCell As Range  Const HaniName = "保護範囲"  ThisWorkbook.Sheets(ShCount).Select  With ThisWorkbook.Sheets(ShCount)   .Unprotect Password:=MyPassword   For Each MyCell In Range(HaniName)    If MyCell.Value <> "" Then     MyCell.Locked = True    Else     MyCell.Locked = False    End If   Next MyCell   .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _   Password:=MyPassword  End With End Sub

akira0723
質問者

補足

いつも大変お世話になっております。 現在以前教えていただいた(1)範囲名を使う方法と、(2)決まった範囲(A16;J500)で動作するマクロの両方を使い分けています。 (2)はデスクトップに張り付けてあるワードからコピペするだけで設定できるので非常に便利なのですが、範囲内に結合セルがある場合には問題があることが分かりその場合は(1)を使うことにしています。 最近だんだん欲が出てきてBook内で複数の人が作業時に必ずいじる3つのシートはこのマクロの対象にしてやろうかと。。。 その他のシートは単に過去のデータの蓄積で、通常参照することすら殆どないのでマクロが複雑になるならとりあえずその3枚(複数)のシートでもOKです。という質問でした。 この説明が無かったため個別と一括の両方でお手数をおかけすることになったようで申し訳ありません。 さて、先ず思いついたことは「範囲名」という名前を各シートで共有すればThis Bookで解決できるのでは、と思ったのですが何故か動かず。どうしてかが気になるところですが、、、 とにかくご回答のNo1を今朝いちで試しているのですが、下記のエラーメッセージが出ます。 「Range クラスのLockedプロパティを設定できません」 デバックを見ると MyCell.Locked = Trueが黄色になっています。 このようなケースで当方によくあるミスはコード中の「シート名」等固有の文字、数字を入力することを見落としていることが多いのですが、今回はそのような個所もないように思えるのですが。 最悪、各Bookの3枚のシートに「範囲名1」~「範囲名3」とすれば今のマクロの改良で出来るならそれで妥協もありです。

関連するQ&A

  • エクセルで2つのマクロを結合したい

    毎度お世話名なっております。 以前ここで教えてもらった保存時に全シートの入力済みセルに自動で保護がかかる<マクロ1>を教えてえもらって非常に多くのBookに採用しているのですが、今回同じBookの「計算表」シートの特定のいくつかのセルだけ保護がかからないようにしたく試行錯誤で2つのマクロをつなげてみたのですが情けないことに期待通りに動かず。 単に最初のマクロのEnd Subを削除しただけではうまくいかず。 どなたかHELPお願い致します。 <マクロ1> Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Const MyPassword = "" 'パスワード(省略可) Dim sh As Worksheet On Error Resume Next For Each sh In Worksheets sh.Unprotect Password:=MyPassword With sh.Cells '全セルのロックを外す .Locked = False '定数が含まれているセルにロックを掛ける .SpecialCells(xlCellTypeConstants).Locked = True '数式が含まれているセルにロックを掛ける .SpecialCells(xlCellTypeFormulas).Locked = True End With sh.Protect DrawingObjects:=True, Contents:=True, _ Scenarios:=True, Password:=MyPassword Next On Error GoTo 0 End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sub 保護解除() <マクロ2> ' 保護解除 Macro '' Sheets("計算表").Select Range("C6:D6").Select ActiveSheet.Unprotect End Sub

  • エクセルでシートを保護するマクロの関数化

    いつもお世話になっております。 先日ここで複数の人が使用するエクセル(Ver.2016)シートで、入力されたセルだけに保護をかける下記のコードを教わって使い始めたのですが、当方にとっては非常に有益な機能なので他のブック、シートでも簡単に使えるようにマクロ化して関数で使えるようにしたいと思ったのですが、シートにより保護対象の行数と列数がちがうのでこのままでは関数化しても意味がないことに気付きました。 また、特定のセルに適用する関数ではないのでどうやって使うのかもわからないことに気付きました。 やりたいことは、どこかのセルで 関数=HOGO(範囲)、もしくは=HOGO(範囲、パスワード :省略可)のような使い方ができれば理想なのですが。 当方マクロはほとんど使えないので上記のようなことができるのかどうかもわからないのですが、もしできれば非常に便利な関数ですのでお知恵を拝借したく。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Const RowS = 16 'ロック範囲開始行 Const RowE = 500 'ロック範囲終了行’ Const ColS = 1 'ロック開始列 Const ColE = 8 'ロック終了行 Const MyPassword = "" 'パスワード(省略可) Const MySheet = "入力表" '保護したいシート名 Dim RowCnt As Long Dim ColCnt As Long With ThisWorkbook.Sheets(MySheet) .Unprotect Password:=MyPassword For RowCnt = RowS To RowE For ColCnt = ColS To ColE If .Cells(RowCnt, ColCnt).Value <> "" Then .Cells(RowCnt, ColCnt).Locked = True Else .Cells(RowCnt, ColCnt).Locked = False End If Next ColCnt Next RowCnt .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _ Password:=MyPassword End With End Sub

  • エクセルでマクロを別のbookにコピペしたら不具合

    いつもお世話になっております。 先日ここで下記のマクロを教わって非常に感動して使い始めて、今日は他のbookへも展開しようとしたのですが、何故かコピペしたbookではエラーがでて動きません。 何度もの試行錯誤で、保護範囲に結合セルが入った場合エラーになることが分かって以降順調に使えていたのですが。 > With ThisWorkbook.Sheets(MySheet) が黄色にハイライトになります。 bookやシートを特定するようなコードは無いように思うのですが。 何が悪いのでしょう? 問題ないbookとどこが違うのでしょう? =================================== Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Const RowS = 16 'ロック範囲開始行 Const RowE = 500 'ロック範囲終了行’ Const ColS = 1 'ロック開始列 Const ColE = 8 'ロック終了行 Const MyPassword = "" 'パスワード(省略可) Const MySheet = "入力表" '保護したいシート名 Dim RowCnt As Long Dim ColCnt As Long With ThisWorkbook.Sheets(MySheet) .Unprotect Password:=MyPassword For RowCnt = RowS To RowE For ColCnt = ColS To ColE If .Cells(RowCnt, ColCnt).Value <> "" Then .Cells(RowCnt, ColCnt).Locked = True Else .Cells(RowCnt, ColCnt).Locked = False End If Next ColCnt Next RowCnt .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _ Password:=MyPassword End With End Sub =====================================

  • マクロ・複数シートに適用するには?

    初心者です。以下のマクロを組みました。 これを複数シートに適用するにはどうしたらよいのでしょうか? worksheets selectではうまくいきませんでした>< 具体的には1~80までのシートが数字で分けられており、 「目次」と「新規」以外の全てに適用したいです。 Sub Macro3() Dim sl As String Dim mySht As Worksheet sl = Range("A65536").End(xlUp).Address Range("B1", sl).SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True For Each mySht In Worksheets Next End Sub

  • 複数のエクセルシートをまとめるマクロ

    下は複数のエクセルファイルを一つにするマクロですが、100万件を超えるためcsvで保存するようにするにはどこを変更したらよいでしょうか。 よろしくお願いします。 Sub Sample() Dim t As Single Dim strPath As String Dim strFileName As String Dim WB1 As Workbook Dim WS1 As Worksheet Dim WS2 As Worksheet Dim lngRowCount As Long 'A列に値が入っているデータ数 t = Timer 'まとめたいシート Set WS2 = ThisWorkbook.Worksheets(1) strPath = ThisWorkbook.Path strFileName = Dir(strPath & "\*.xls*") Do While strFileName <> "" If strFileName <> ThisWorkbook.Name Then Set WB1 = Workbooks.Open(strPath & "\" & strFileName) Set WS1 = WB1.Worksheets(1) With WS1.Range("A1") lngRowCount = .Worksheet.Cells(.Worksheet.Rows.Count, .Column).End(xlUp).Row - .Row If lngRowCount >= 1 Then With .Resize(lngRowCount, 14).Offset(1) .Copy WS2.Range("A" & WS2.Rows.Count).End(xlUp).Offset(1) End With End If End With WB1.Close False End If strFileName = Dir Loop MsgBox "まとめ処理をしました。処理時間 " & Format((Timer - t) / 60 / 60 / 24, "h:mm:ss") End Sub

  • VBA マクロ実行にてエラーが出ますが、原因を教えてください

    下記コードを実行すると、myCell.Selectのところで 実行時エラー’91’ オブジェクト変数またはWithブロック変数が設定されていません。 というエラーが出るのですが、どうすれば対策出来るのでしょうか? Sub test() Dim i As Long Dim myCell As Range With Range("A1").CurrentRegion For i = 2 To .Rows.Count Step 2 If i = 2 Then Set myCell = .Rows(i) Else Set myCell = Application.Union(myCell, .Rows(i)) End If Next i End With myCell.Select End Sub

  • マクロで複数のシートを保護&パスワードをかける為に下記式を作成しました

    マクロで複数のシートを保護&パスワードをかける為に下記式を作成しましたが エラー”400”のみ出て上手く行きませんでした。 どこか式がおかしいのでしょうか。。。 一応式を入力しておきます。 超初心者でまったく意味がわからないので、どなたか宜しくお願い致しますm(__)m Sub AllProtect() Dim sh As Worksheet Dim myPassword As String myPassword = InputBox("パスワードを入力してください", "パスワード") For Each sh In Worksheets sh.Protect Password:=1234 Next End Sub Sub AllUnprotect() Dim sh As Worksheet Dim myPassword As String myPassword = InputBox("パスワードを入力してください", "パスワード") For Each sh In Worksheets sh.Unprotect Password:=1234 Next End Sub

  • エクセルのマクロを有効にしないと表示しないようにする方法

    エクセルでマクロを有効にしないと、シートが表示されないように設定したいのですが、下記の様に(ほかの方の投稿から)入力すると三行目がエラーになります。素人なので、よくわかりません。どのようにしたら、マクロを有効にしないと全てのシートを表示しないようにできるのでしょうか? ご教授いただけますでしょうか Private Sub Workbook_BeforeClose(Cancel As Boolean) Sheets(\"Sheet1\").Visible = False Sheets(\"Sheet2\").Visible = False ActiveWorkbook.Protect Password:=\"error123\" End Sub Private Sub Workbook_Open() ActiveWorkbook.Unprotect Password:=\"error123\" Sheets(\"Sheet1\").Visible = True Sheets(\"Sheet2\").Visible = True Sheets(\"Sheet1\").Select End Sub

  • 複数のシートにコードを適用したい

    excel vbaについての質問です (vbaについて初心者です) 現在、エクセルで勤務記録表を作成しています。 同じシートが70枚くらいあります。 各シートは同じ構成で、B6からC36までは時刻を打ち込み、 4ケタの数字を打ち込むと時間になるようにしたいと思っています。 例)1234⇒12:34 以下のようなコードを貼り付けているのですが vbaの編集をする「microsoft visual basic」というウインドウのところで、各シートをダブルクリックすると 出てくるウインドウに一つ一つ貼り付けないとうまく動きません ■全てのシートに貼り付けをしなくても動作する方法を教えて いただきたく、お願いします。 コードに誤りがあれば教えていただきたくお願いします。 (標準モジュールや「this workbook」にも貼り付けをしてみたのですが、思うようになりませんでした) 以下 ====================== Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next Dim 入力値 As Variant Dim 時 As Long Dim 分 As Long If Intersect(Target, Range("B6:C36")) Is Nothing Then Exit Sub 入力値 = Target.Value '1 If 入力値 = 0 Then 入力値 = terget.Value '2 ElseIf Target.Count <> 1 Then 'And (入力値 <> 0) Then ' メッセージを出す MsgBox "複数セル選択できません", vbCritical With Application .EnableEvents = False .Undo .EnableEvents = True End With '3 ElseIf VarType(入力値) <> vbDouble Then MsgBox "時刻を表す数字を入力してください。" ElseIf 入力値 < 1 Then Exit Sub Else 入力値 = Target.Value 時 = 入力値 \ 100 分 = 入力値 Mod 100 Application.EnableEvents = False Target.Value = TimeSerial(時, 分, 0) Application.EnableEvents = True End If End Sub

  • マクロを組むとこんなエラーが出るようになりました

    捺印君:Vel 1.25→(エクセルのフリーソフトです) PicturesクラスのPasteプロパティを取得出来ません。 予期せぬエラーが発生しました。 とエラーが出ます。 ちなみに組んでいるマクロは下記です Sub 全シートの保護() Dim Sh As Worksheet Dim myPassword As String myPassword = InputBox("パスワードを入力してください", "パスワード") For Each Sh In Worksheets Sh.Protect Password:=myPassword Next End Sub Sub 全シートの解除() Dim Sh As Worksheet Dim myPassword As String myPassword = InputBox("パスワードを入力してください", "パスワード") For Each Sh In Worksheets Sh.Unprotect Password:=myPassword Next End Sub このマクロがおかしいからエラーが出るんですよね? 違うマクロにすれば問題ないでしょうか? ちなみにマクロは「全シートの保護一括解除」と「一括保護」で パスワード付きの物をとなっております。

専門家に質問してみよう