• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:1つのワークシートでイベントを続けて実行する方法)

1つのワークシートでイベントを続けて実行する方法

tom04の回答

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

No.1です。 補足を読ませていただきました。 (1)複数Sheetの場合ですが、(仮にSheet数が複数だとします) 単純に >If ActiveSheet.Name = "担当1" Then の行を >If ActiveSheet.Name = "担当1" or ActiveSheet.Name = "担当2" Then といった具合でも良いのですが、これだとSheet数が増えた場合は大変だと思います。 そこでSheetのインデックス番号を利用してみてはどうでしょうか? (担当1・担当2のSheetがSheet見出しの左から順にあるとします) Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim i As Long i = ActiveSheet.Index If i <= 2 Then If Range("A1") = "" Then Dim ans As String・・・以下続く のようにすれば「or」でつなぐ必要はありません。 インデックス番号はSheet見出しに配置してあるSheet順で左から1・2・・・となります。 (2)エラーの件ですが、 単純にA1セル以外でDeleteキーを押した場合はメッセージボックスを表示しないようにすれば良いだけですかね? ※ 余計なお世話かもしれませんが、A1セルを空白にした場合はSheet名も「担当○」のように変えてみました。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row = 1 And Target.Column = 1 Then '保護解除 ActiveWorkbook.Unprotect Password:="1111" 'シート名入力 If Range("A1") <> "" Then ActiveSheet.Name = Range("A1").Value '再度保護 ActiveWorkbook.Protect Password:="1111" Exit Sub Else MsgBox "選択されているセルの値はシート名にできません。" _ & vbCrLf & "他のセルを選択するか、データを修正してください。" ActiveSheet.Name = "担当" & StrConv(ActiveSheet.Index, vbWide) End If End If End Sub こんな感じですかね? ※ 上記コードは大前提として各担当SheetがSheet見出しの左側から配置してあるとしてのコードです。 (2)が的外れかもしれませんので間違っていたらごめんなさいね。m(_ _)m

komakoma5050
質問者

お礼

お返事が大変遅くなり申し訳ありません。 No.3・No.4で教えて頂いたコードに書き換えてみると、 今回はエラーも無く完璧に希望通りの処理になりました! >A1セルを空白にした場合はSheet名も「担当○」のように変えてみました。 こちらも教えて頂いて大変助かりました。 VBAは奥が深く、まだまだ学ぶ事がたくさんありそうです。 また機会がありましたらご助言頂けると嬉しいです。 本当にありがとうございました(^^)

関連するQ&A

  • セルの値をワークシート名にする(エクセル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にコピーしたものを指定して試しましたがやはりエラーとなり うまくいきませんでした。 全くの素人で恐縮ですがよろしくお願いいたします

  • Excel2010 イベントプロシージャが動かない

    VBAはほとんどいじったことのない初心者です。 イベントプロシージャをインターネットから探してきて、コピペして使おうとしてます。 Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ERR_HANDLER If Target.Address(False, False) = "E2" Then ActiveSheet.Name = Range("E2").Value End If Exit Sub ERR_HANDLER: MsgBox "現在のE2セルの値はシート名にできません。" End Sub やりたいのは、セルE2の値に変更があったら、そのセルの値をシート名にしたいということです。 初心者には難しいでしょうか? ご教示いただけると幸いです。 よろしくお願いします。

  • EXCELのイベントの保存について

    EXCEL2000で新規にBOOKを作り、microsoft excel objectsのsheet1に、次のイベントを書きました。 Private Sub Worksheet_Calculate() If Sheet1.Cells(1, 2).Value = 1 Then Sheet1.Cells(1, 3).Value = "当たり” End If End Sub B1のセルは、A1のセルの値をコピーするようにしています。 A1のセルに1を入力されると、C1のセルに”当たり"が表示されるのですが、 BOOKを登録した後、BOOKを閉じ、そのBOOKを開けた後に、A1のセルに1を入力しても、C1のセルに”当たり"が表示されません。 イベントを登録する際に、足りない操作があるのでしょうか? よろしくお願いします。

  • マクロ シートの順番を認識してシートをアクティブに

    シート名に反応して、シートをアクティブにするマクロは分かるのですが、 シートの順番を元に、アクティブにするマクロを実行したいです。 例えば、 1枚目のシートに あああ、2枚目のシートに いいい、3枚目のシートに ううう と名前を付けているブックがあるとして、あああ のシートをアクティブにしたいとき、 Sub あああ のシートをアクティブにする() Sheets("あああ").Activate End Sub としたいわけではなく、「1枚目だからアクティブにした」 といったマクロを実行したいと思っています。

  • シートのイベント VBA

    シートをクリックしたらシートをクリアしたいのですが クリックするセルがA1の場合は、マクロを実行させたくないのですが 下記のコードだとエラーになってしまいます。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not Target.Range = Range("a1") Then Cells.Clear End If End Sub ”Range("a1")でなければ、Cells.Clearする” にはどうすればいいですか?

  • ワークシートのChangeイベントについて

    シート1のA1セルの値を変更したらシート2のA1・A2・A3と変更内容を順に記録するような以下のようなコードがありますが、うまく動作しません。問題点を指摘していただければ大変助かります。 【Worksheet】 Private Sub Worksheet_Change(ByVal Target As Range) Static r Dim s As Range Set s = Sheets("sheet1").Range("$a$1").Value If s Is Nothing Then Else If r = "" Then r = 1 Sheets("sheet2").Cells(r, 1) = Sheets"sheet1").Range("$a$1").Value r = r + 1 End If End Sub

  • 別シートのセルの文字をシート名に自動で変更

    いつもありがとうございます。 下記の添付の「勤務表」のシートのA4の日付を変更すれば、「Sheet1」のシート名も自動的に変換できるようにとネット検索で見つけてきた下記のマクロ(?)の記述をセル名を変えてコピペし、「勤務表」のシートのA4の日付を変えて見たのですが、何の変化もありません。エラーメッセージも出ません。 Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ERR_HANDLER If Target.Address(False, False) = "勤務表!A4" Then ActiveSheet.Name = Range("勤務表!A4").Value End If Exit Sub ERR_HANDLER: MsgBox "現在のセルの値はシート名にできません。" End Sub 「勤務表」のシートのA4以下は、B1とE1の数値から自動で一ヶ月分の日付を入れる関数を入れて日付を作成しています。 =IF(DATE($B$1+1988,$E$1,ROW(A21))>DATE($B$1+1988,$E$1+1,20),"",DATE($B$1+1988,$E$1,ROW(A21))) 念のため、「Sheet1」内のA1でシート名が変わるかどうか試してますと、直接入力した文字の場合、シート名が入力した文字に問題なく変わりますが、関数で呼び込んだ文字は「現在のセルの値はシート名にできません。」のエラーメッセージが返って来ました。 このことから、関数で呼び込んだ文字では、シート名の自動変更はできないのが判りましたが、「勤務表」から呼び出した場合、エラーメッセージも出ないところを見ると、そのことの対処だけでは、解決しないような気がしています。 色々、ネットで検索したりもしましたが、未熟な私の知識と経験では、行き詰ってしまいました。 関数で呼び込んだ別シートのセルの日付で、シート名が自動で変更できるように、 お助け頂けないでしょうか? 当方はエクセル2010を使用しております。 よろしくお願いいたします。

  • 〖緊急〗エクセルのVBAについて質問です。

    エクセルのVBAを使用して、下記の動作を実行したいのですがうまくいきません。 おしえてください。 sheet1に移動したいシート名の一覧を作成し、一覧を参照してシートを移動したいです。 RangeにカーソルをあてるとA1に入力したシート名前が反映しているようなのですが・・・。 sheet1のセルA1に移動させたいシート名を入力しています。 Sub Worksheet() Worksheets(Range("A1")).Activate End Sub ※❝インデックスが有効範囲にありません❞とエラーがでます。 ※同一のBOOK内での作業です。 よろしくおねがいします。

  • 開いているシートをチェックする

    いつもこちらでお世話になってます。 VBAで、ひとつのブックの開いているシートをチェックする方法を教えてください。 "sheet1" "sheet2"  "sheet3" と同じブックにあるとし、 "sheet1"を開いてマクロを実行したら、 「シート1です」とメッセージボックスを出し、"F4"を選択。 "sheet2"を開いてマクロを実行したら、 「シート2です」とメッセージボックスを出し、"G4"を選択。 "sheet3"を開いてマクロを実行したら、 何もしない。 というようなコードをどうすればいいいのでしょうか? 自分なりに試してみたのは、以下のようなものです。 ' Macro () If Sheets("sheet1").Activate Then MsgBox "シート1です"   Sheets("sheet1").range("f4").select End If If Sheets("sheet2").Activate Then MsgBox "シート2です" Sheets("sheet2").range("g4").select End If End Sub これだと、どのシートを開いていても、 "sheet1"が開いて、"シート1です" のメッセージが出て、OKを押すと、"F4"を選択し、そのまま "sheet2"が開いて、"シート2です" のメッセージが出て、OKを押すと、"G4"を選択してし、 "sheet2"が開いた状態になってしまいます。 今現在は、2つのマクロが別々にあります。 マクロのオプションでCtrl+半角キーを同じにしたい、と考えています。 マクロのオプションで同じ半角キーをすることはできるようなのですが、 そうすると、Private Sub Worksheet_Activateで "sheet1"が開いたときは"E4"を選択するようにしているので、デバックが出てしまいます。 どのようにすればいいのでしょうか?

  • エクセルVBAで複数シートにマクロ実行

    エクセル2000です。 Sub 行列非表示() For i = 2 To 120 If Cells(i, "A").Interior.ColorIndex = 3 Then Cells(i, "A").EntireRow.Hidden = True End If Next i For n = 1 To 50 If Cells(1, n).Interior.ColorIndex = 3 Then Cells(1, n).EntireColumn.Hidden = True End If Next n End Sub 上記マクロを、シートAAAとCCCとEEEに実行する場合、 Sub test() Sheets("AAA").Activate Call 行列非表示 Sheets("CCC").Activate Call 行列非表示 Sheets("EEE").Activate Call 行列非表示 End Sub と書くよりももっとすっきり実行する方法は無いでしょうか? 各シートの非表示対象の行や列はそれぞれことなります。 また Sub 行列非表示 自体も、もっと効率的にやる方法はないでしょうか?