• ベストアンサー

シートに入力しようとするとダイアログを表示させたい

エクセルVBAでマクロを実行させて、他のシートの内容をシート1にコピーするようにしてあります。 標準モジュールのModule1でコードをかきました。 それとは別に、MicrosoftExcelObjectsのSheet1の部分に Sub AutoClicked() Worksheets("Sheet1").Activate msg = "こちらのシートは入力は禁止しています" End Sub を追加して、シート1上(シート2以降は対象外)をクリックするとダイアログが表示される機能 を実現したかったのですが機能しませんでした。どこをどのように直せばよいのでしょうか?

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

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

方法1 確実な方法(推奨) シート1をシートの保護する #ご利用のエクセルのバージョンが不明ですが,2003までではツールメニュー,2007以降では校閲タブ 標準モジュールのマクロを sub macro1() worksheets("Sheet1").protect userinterfaceonly:=true ’以下今のシート1に記入するマクロ end sub とする。 方法1’ご質問に書かれている内容に照らすと適切な方法 シート1を「非表示」にしてしまえば,シート1を「触る」ことは(わざわざ再表示しない限り)そもそも出来ません。 シート1を再表示させないためには,「ブックの保護」を行います。 方法2 あまりお奨めではない方法 シート1のシートモジュールの今のマクロを消して,次のマクロをコピー貼り付ける private sub Worksheet_SelectionChange(byval Target as excel.range) msgbox "DO NOT TOUCH" end sub 方法3 あまりお奨めではない方法 標準モジュールのマクロを sub macro1() application.enableevents = false ’以下今のシート1に記入するマクロ application.enableevents = true end sub とする。 さらにシート1のシートのモジュールの今のマクロを消して,次のマクロをコピー貼り付ける private sub Worksheet_Change(byval Target as excel.range) msgbox "forbidden" application.enableevents = false application.undo application.enableevents = true end sub #参考として補足しておきます 方法2が,今のところアナタのオリジナルアイデアに一番近いアプローチです。 が,こういった手段では,たとえば「シート1を開く・そのままいきなり書き込む」を阻止できません。 方法3は,シート1への記入を阻止し,かつたとえば「シートが保護されていると出来ないこと」を特にシート1で許可したい場合に利用できる方法です。 しかしアナタのご相談は「シート1に触らせたくない」ですので,方法1’のようなアプローチが実は最も安全と言えます。

kiseki777
質問者

お礼

方法3がドンピシャです。 解決しました。有難うございます。

その他の回答 (2)

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

No.1です! たびたびごめんなさい。 前回の投稿で誤記がありました。 >(2)Sheet2の別セル選択でメッセージボックスを出す は >(2)Sheet1の別セル選択でメッセージボックスを出す の間違いです。 何度も失礼しました。m(_ _)m

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

こんにちは! ご希望の方法と異なるかもしれませんが・・・ 一つの案です。 (1)Sheet1をアクティブにした段階でメッセージボックスを出す (2)Sheet2の別セル選択でメッセージボックスを出す 上記(1)(2)のマクロをSheet1に設定し、Sheet1を保護してはどうでしょうか? Sheet1のSheet見出し上で右クリック → コードの表示 → VBE画面に↓のコードをコピー&ペーストしてみてください。 Private Sub Worksheet_Activate() MsgBox "こちらのSheetは入力禁止となっています" End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox "こちらのSheetは入力禁止となっています" End Sub 次にSheet2以降に関しては「対象外をクリックすると・・・」と言うコトですが 対象範囲の「編集許可」をしてそれぞれのSheetを保護する方法はどうでしょうか? ※ この場合はSheetを保護している旨のメッセージがそのまま表示されます。 この程度しか思いつきませんが、他に良い方法があればごめんなさいね。m(_ _)m

kiseki777
質問者

お礼

アクティブ時にはできれば出したくないですが、 参考にさせていただきます。 有難うございました。

関連するQ&A

  • シート間のコピー時の列幅と行の高さ

    マクロ初心者です。下記はシート間のコピーですが、列幅と行の高さも一緒にコピーするにはどのように書いたらよいでしょうか。マクロは"sheet1"に入っています。よろしくお願いいたします。 Sub macro1() Worksheets("sheet2").Activate Cells.Clear Worksheets("sheet1").Activate Worksheets("sheet1").UsedRange.Copy ActiveSheet.Paste Destination:=Worksheets("sheet2").Range("A1") End Sub

  • EXCEL ファイルをあけた後いつも「TOP」シートを開く方法を教えてください。

    のみこみが悪くてすみません。 マクロ自動記録でマクロをほんの少し進めている初心者です。 ファイルをあけたときに「TOP」シートを開きたいのですが 以前次のように教えていただいたのですが その後の操作についてさらに教えてください。 標準モジュール→ModueL 1 をダブルクリックをしました。 そして画面の右側に Sub Auto_Open() Worksheets("TOP").Activate End Sub と入れました。 この後どのようにしたら良いのか教えてください。 よろしくお願いします。 別件でModueL 1~ModueL 10ぐらいはありますが そもそもモジュールとは何ですか。 どのようなときに活用するのですか。 こんな基本的な質問ですみませんがよろしくお願いします。

  • シートの表示を移動をしないようにするには

    初心者のため、簡単なことかも知れないのですが、ご教授ください。 シート1内にコマンドボタンをつけて、クリックするとシート2のデータを全部クリアする簡単なVBAが実行します。 実行後、シート2が表示されます。 実行した時点でのシート1をそのまま、表示しておくには、どのような 定義が必要ですか? 今は下記のように書いています Sub ClearCell_1() 'シート名:sheet2のクリア Worksheets("sheet2").Activate Worksheets("sheet2").Cells.Clear End Sub どなたか教えてください。よろしくお願いします

  • シートを挿入したと同時にイベントを生成することは可

    VBAでシートを挿入したと同時に そのシートにイベントを生成することは可能ですか? 例えば、 Worksheets.Add でシートを挿入し、 そのシートに Private Sub Worksheet_Activate() Msgbox “” End Sub というイベントをVBAで記述させることはできないのでしょうか?

  • エクセルVBAでSheet1.ActivateとSheet(n).Activate

    エクセル2000です。 VBAでの疑問点を教えてください。 Sub test1() Sheet1.Activate MsgBox ActiveSheet.Name End Sub これは問題なく作動します。 Sub test2() x = ThisWorkbook.Worksheets.Count For n = 1 To x Sheet(n).Activate MsgBox ActiveSheet.Name Next End Sub これは「SubまたはFunctionがていぎされていません」というエラーになります。 もちろん、 Sub test3() x = ThisWorkbook.Worksheets.Count For n = 1 To x Sheets(n).Activate MsgBox ActiveSheet.Name Next End Sub のように書けばOKなのは存じておりますが、これではSheet名に係らず、左から順番となってしまいます。 Sub test4() x = ThisWorkbook.Worksheets.Count For n = 1 To x Sheets("Sheet" & n).Activate MsgBox ActiveSheet.Name Next End Sub のように明確にシート名として記述すればOKなのですが、それでは、Test1のSheet1.Activate が通って、Sheet(n).Activate が通らないのはなぜでしょう? しょうもない質問でごめんさない。

  • エクセルVBAで、シートに条件を付けて処理させたい

    エクセルVBAで 『コピー用』シートと『あああ』シートと『いいい』シートと『ううう』シートがあり、 『あああ』シートと『いいい』シートと『ううう』シートの全ての情報を 『コピー用』シートにコピーしてまとめるようにしました。 マクロを処理するには、 『あああ』シートと『いいい』シートと『ううう』シートに設置したボタンを押すと処理する。 ここまでは実現することができました。 私がやりたいことは、 シートの内容を変更したのに、そのボタンを押し忘れてしまい、 そのまま『コピー用』シートを使用してしまうことを避けるために、 【「あああ」シートか「いいい」シートか「ううう」シートが変更されている】 かつ 【マクロを処理させるボタンを押していない】 この場合に、「コピー用」シートをアクティブにしたときに マクロ処理をするかしないかを選択させるダイアログを表示させる。 シートが変更されていない または マクロを処理させるボタンを押した後にシートを変更していない この場合は、「コピー用」シートをアクティブにしたときに マクロ処理をするかしないかを選択させるダイアログは表示させない。 といった処理を可能にしたいです。 詳しくは↓のサンプルページを参考にして下さい。 http://blog-imgs-17.fc2.com/s/k/s/sksfiosjdijf34/sampledesu.htm ボタンを押して全シートをコピーする処理のコードは↓のような感じで作りました。 ダイアログの処理は調べて作ってみましたが、ちゃんと動作しませんでした。 Microsoft Excel Objectsのsheet1(sheet2とsheet3とsheet4は空白)に Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim keizoku As Integer keizoku = MsgBox("内容が変更されていますが、「あああ」シートか「いいい」シートか「ううう」シートのマクロ処理開始のボタンをまだ押していないためマクロ処理がされていません。処理しますか?", vbYesNo) Select Case keizoku Case vbYes Application.EnableEvents = False Call macro1 Application.EnableEvents = True Case vbNo myMsg = "" Case Else myMsg = "" End Select End Sub を入れ、 次に、標準モジュールのModule1に Sub macro1() Worksheets("あああ").Range("B2:AD51").Copy _ Destination:=Worksheets("コピー用").Range("B1:AD50") Worksheets("いいい").Range("B2:AD51").Copy _ Destination:=Worksheets("コピー用").Range("B51:AD100") Worksheets("ううう").Range("B2:AD101").Copy _ Destination:=Worksheets("コピー用").Range("B101:AD200") Application.ScreenUpdating = False For RowCount = 400 To 1 Step -1 If Application.WorksheetFunction.CountA(Worksheets("コピー用").Rows(RowCount)) = 0 Then Worksheets("コピー用").Rows(RowCount).Delete End If Next Application.ScreenUpdating = True Application.OnKey "a" End Sub を入れました。 詳しくは↓のサンプルページを参考にして下さい。 http://blog-imgs-17.fc2.com/s/k/s/sksfiosjdijf34/sampledesu.htm アドバイスをお願いいたします。

  • エクセルのシートの移動禁止方法について

    'UserForm1 Public 着目シート名  Public シート変更禁止 As Boolean Private Sub CommandButton1_Click() 着目シート名 = "Sheet1" シート変更禁止 = True End Sub Private Sub CommandButton2_Click() 着目シート名 = "Sheet2" シート変更禁止 = True End Sub 'ThisWorkbook Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) If シート移動禁止 = True Then Worksheets(着目シート名).Activate End If End Sub '標準モジュール Sub test() UserForm1.Show End Sub 'UserForm1には、CommandButton1,CommandButton2のみ貼り付けています。 'フォームは、ShwoModal=Falseにしています それぞれのモジュールに上記のコードを書いて、フォーム上のボタンを押すと、 シートの変更が出来ないようにしようと考えています。 シートは、任意に変更しようと考えていますので、シート名の指定に変数を使いたいのですが、スコープの問題からか? 着目シート名がEmpteyになってしまい、自由に変更が可能となってしまいます。 何が、悪いのでしょうか? どなたか詳しい方教えて頂けないでしょうか?宜しくお願いいたします。 (Workbook_SheetDeactivateによる方法は、ここで教えて頂いた方法をアレンジしようとしている部分です。) QNo.2503758の続きの質問です。

  • VBAで作成したComboboxにVBAでマクロを割り当てたい。

    下記コードでcomboboxをつくったのですが 作成されたCombobox1のComboBox1_Changeエベントに 標準モジュール内のSub cal をVBAで割り当てたいのですが可能でしょうか。 コンボボックス作成マクロ x=0 y=0 With Worksheets("Sheet1").OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, DisplayAsIcon:=False) .Left = X .Top = Y .Width = 53.25 .HEIGHT = 18 .ListFillRange = "AAA" End With これで作成したコンボボックスに標準モジュール内マクロをVBAで割りあてしたい。 標準モジュール sub cal ・ ・ end sub

  • 複数のシートに 転記

    Sub べんきょう()   Worksheets(Array(1, 3)).Select   Range("3:3").Activate   ActiveCell.ClearContents  End Sub シート1,3の3行目のデータを消したい もしくは Sub べんきょう()   Worksheets(Array(1, 3)).Select   Range("3:3").Activate   ActiveCell.Interior.color = xlNone  End Sub シート1,3の3行目の色を消したい うまくいかなくて困ってます…。 どなたかどうかご指導よろしくです。

  • ExcelVBAで行の非表示、表示をコード化

    現在、Excel2003をつかっており、VBAを用いて sheet1シートの2行目、4行目、10行目を非表示にするマクロ(HIDDEN)と すべての行を表示にするマクロ(APPEAR)を使っています。 Sub HIDDEN() ThisWorkbook.Worksheets("sheet1").Rows("2").HIDDEN = True ThisWorkbook.Worksheets("sheet1").Rows("4").HIDDEN = True ThisWorkbook.Worksheets("sheet1").Rows("10").HIDDEN = True End Sub Sub APPEAR() ThisWorkbook.Worksheets("sheet1").Rows.HIDDEN = False End Sub いま、2つのマクロを併合し 「Sheet1の2行目、4行目、10行目のいずれかが非表示であれば、すべての行を表示 そうでなければ、2行目、4行目、10行目のすべてを非表示にしたい」 と考えています。 ここで私が困っているのは、2行目、4行目、10行目のいずれかが非表示であれば というのをどうVBAで記述するのかです。

専門家に質問してみよう