Excel changeイベントをループさせる方法

このQ&Aのポイント
  • Excel2007を使用しています。チェックボックスを190個作り以下のプロシージャの処理を実行したいのです。changeイベントをループさせることはできるのでしょうか?
  • Excel2007でチェックボックスの状態が変化した際に処理を実行したい場合、changeイベントを使用します。ここではチェックボックスが190個あるため、ループを利用してchangeイベントを連続して処理することが可能です。
  • VBAを使用してExcel2007のチェックボックスの状態変化を監視し、処理を行う方法を説明します。具体的には、チェックボックスのループ処理を行い、個別のchangeイベントを設定して処理を実行します。
回答を見る
  • ベストアンサー

Excel changeイベントをループさせる方法

ご質問させていただきます。 Excel2007を使用しています。 チェックボックスを190個作り以下のプロシージャを作成しました。 190個のチェックボックスは開発タブの挿入をクリックしてActive Xコントロールのチェックボックスを選択してデザインモードでコピーして作りました。 やりたいことは、チェックボックスのON/OFFの瞬間に以下のプロシージャの処理を実行したいのです。 changeイベントを使うみたいなのですが、チェックボックスが190個もあるのでループさせた方が良いと思うのですが、そもそもchangeイベントをループさせることはできるのでしょうか? ご存知の方がいらっしゃいましたら教えてください。 よろしくお願いいたします。 なお、私のVBAの知識は初心者レベルで、下記のプロシージャもこちらのサイトで教えていただいたものを自分で少し変更しただけです。 Sub チェックボックスのループ() Dim i As Integer For i = 0 To 189 sCtrlName = "CheckBox" & CStr(1 + i) If Me.OLEObjects(sCtrlName).Object.Value = True Then Cells(1 + i, 2).Value = Cells(1 + i, 2).Value Else Cells(1 + i, 2).Formula = "=Sheet2!A" & 1 + i & "" End If Next i End Sub

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

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

条件付き書式で赤や青(あるいは白)に塗られているセルでは,このマクロで,あるいは手動ででも,セルの色塗りをしても条件付き書式の発色の方が優先(上書き表示)してしまい色が現れません。 手口は色々考えられますが,一つの方法としては追加ご相談のマクロを Sub macro1()  Dim myCheck As Shape  Set myCheck = ActiveSheet.Shapes(Application.Caller)  myCheck.TopLeftCell.Value = Not myCheck.TopLeftCell.Value  With myCheck.TopLeftCell.Offset(0, 1)   If myCheck.ControlFormat.Value = 1 Then    .Value = .Value   Else    .FormulaR1C1 = "=Sheet1!R[1]C[8]"   End If  End With End Sub のような具合に変更してみると,チェックボックスを配置したセル(必要に応じて別列のセル)にチェックの状態に応じて-1か0の数字が現れます。 条件付き書式の方で,該当のセルが-1ならば白にするを最優先で発色させるように組み込んでみて下さい。 #チェックボックスを配置したセルでは,必要に応じて ・セルの色を白に,文字の色を白にしておく ・セルの書式設定の表示形式のユーザー定義で ;;; と設定しておく などで,-1や0の表示を隠しておいてください。 #参考 別の手として,今のマクロでmycheck.controlformat.valueの値に応じて対応するセルを「値」と「数式」とに書き換えているのに併せて,該当セルの条件付き書式も直接書き換えてしまうような方法も考えられます。 が,こちらの手を使うと各行ごとに条件付き書式が「まだらに」施された状態となってしまい,シートの安全性が損なわれる恐れがあります。 #余談 新しい課題や問題点が発生した際には,原則として新しいご相談として投稿し直すようになさって下さい。 今回の追加ご質問についても,まだ問題が継続したり「もうちょっとこうしたい」があるようでしたら,やはり新たなご相談として投稿なさってください。

hoully
質問者

お礼

keithin 様 ご回答ありがとうございました。 教えていただいた方法でできました。 実際に運用してみて再び直したい部分がでてきたのですが、上手く直せなかったので新しい質問を後で投稿させていただきますので、よろしくお願いいたします。 この度は本当にありがとうございました。

その他の回答 (1)

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

アプローチは色々考えられますが,そういうお話だった場合は,今度はActiveXコントロールではなくフォームコントロールのチェックを使った方が便利と思います。 手順: ALT+F11でVBE画面を開き,挿入メニューから標準モジュールを挿入し,下記をコピー貼り付ける sub macro1()  dim myCheck as shape  set mycheck = activesheet.shapes(application.caller)  with mycheck.topLeftcell.offset(0, -1)   If mycheck.controlformat.value = 1 then    .value = .value   else    .formular1c1 = "=Sheet2!RC[-1]"   end if  end with end sub シートに戻る 今のチェックボックスはすべて削除する 改めて「C1セルに」C1セルの大きさの中に収まるように,フォームコントロールのチェックボックスを1つ配置する チェックボックスを右クリックして「マクロの登録」を開始し,上記のmacro1を選んでOKする 「C1セルを」選び,下向けにえいやっと190個オートフィルドラッグして,C190セルまでコピーする。 フォームを選んでコピーするのではなく,フォームを載せたセルごとコピーするので間違えないこと。 #わざわざマクロを190通り用意することも,またご質問で書かれているように毎回全部のチェックボックスを巡回して調査反映するといった手間も要りません。

hoully
質問者

お礼

keithin 様 ご回答ありがとうございます。 できました!凄いです! 実際に運用してみて少し変更したいところがでてきたので、自分で変更を加えてみたのですが上手くいきませんでした。 もしよろしければ教えていただけないでしょうか? チェックボックスのONで値を記録させるセルには条件付書式が設定してあり、セルの値によって背景色が青・赤・白になるようにしてあります(この条件付き書式にはVBAを使用しておりません)。 変更しようとしたことは、チェックボックスのONで従来の仕様通りセルの値を記録させて、かつ、新たにセルの背景色を白にすることです。 そこで、教えていただいたプロシージャに.Interior.Color = RGB(255, 255, 255)を追加したのですが、無反応でした。 現在のプロシージャは下記の通りになります。 なお、もし質問を新しくした方がよろしければおっしゃってください。 よろしくお願いいたします。 Sub macro1() Dim myCheck As Shape Set myCheck = ActiveSheet.Shapes(Application.Caller) With myCheck.TopLeftCell.Offset(0, 1) If myCheck.ControlFormat.Value = 1 Then .Value = .Value .Interior.Color = RGB(255, 255, 255) Else .FormulaR1C1 = "=Sheet1!R[1]C[8]" End If End With End Sub

関連するQ&A

  • エクセル: Changeイベントが発生しないのはなぜ?

    エクセルでChangeイベントが発生しないので以下の方法で確認してみました。 やはり駄目でした。 なぜでしょうか。 条件:Excel2000 エクセルのセル に楽天証券から株価データをRSSでもらっています。 書いたコード Private Sub Worksheet(ByVal Target As Range) If Target.Address <> "" Then MsgBox "イベント確認" End if End Sub これで駄目なのですがセルをいじるとイベントは発生しているようです。 Intersectプロシージャも試しましたが駄目でした。 Case文で拾うことも試しましたが駄目でした。 RSSで信号を受けた場合イベントは発生しないものでしょうか? よろしくお願いいたします。

  • エクセル: Changeイベントが発生しないのはなぜ?

    エクセルでChangeイベントが発生しないので以下の方法で確認してみました。 やはり駄目でした。 なぜでしょうか。 条件:Excel2000 セル"A1" に楽天証券から株価データをRSSでもらっています。 書いたコード Private Sub Worksheet(ByVal Target As Range) If Target.Address <> "" Then MsgBox "イベント確認" End if End Sub これで駄目なのでセルにをいじるとイベントは発生しているようです。 Intersectプロシージャも試しましたが駄目でした。 Case文で拾うことも試しましたが駄目でした。 RSSで信号を受けた場合イベントは発生しないものでしょうか? よろしくお願いいたします。

  • エクセルマクロのchangeイベントについて

    こんばんわ changeイベントを使ってみようと思い、下記のマクロを作ってみたのですが、どうしても動きません。 Private Sub Worksheet_Change(ByVal Target As Range) Set Target = Range("b4") Application.DisplayAlerts = False Dim i As Long Workbooks.Open Filename:="c:\osaruPKsarch\sarch.xls"  For i = 1 To 5 Step 1   Cells(3, i + 50) = Cells(7, i + 50)  Next i End Sub なぜ動かないのかもわかりませんToT アドバイスの程よろしくお願いいたします。

  • VBA CHANGEイベントに複数イベントを

    いつもお世話になっています。 色々しらべて試してみたんですが、うまくいかないんで教えてください。 CHANGEイベントに複数のイベントを書き込みたいんですが。 今現在、問題なく動いている以下のイベントがあります。 (1) Private Sub Worksheet_Change(ByVal Target As Range) Dim rang3 As Range Dim rang4 As Range Dim ■■ As String Dim LastRow1 As Long LastRow1 = Worksheets("○○").Cells(Rows.Count, "b").End(xlUp).Row Set rang4 = Worksheets("○○").Range("b:I" & LastRow) Set rang3 = Range("h4") If Intersect(Target, rang3) Is Nothing Then Exit Sub On Error Resume Next ■■ = WorksheetFunction.VLookup(Target.Value, rang4, 2, 0) If Err.Number > 0 Then MsgBox Target.Value & "はありません。基本情報台帳に入力してください。" Range("h4").Select Else Application.EnableEvents = False Range("I4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 2, False) Range("j4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 3, False) Range("k4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 7, False) Range("l4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 8, False) Range("m4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 5, False) Application.EnableEvents = True Range("K4").Select End If End Sub このシートにもう一つ、イベントを入れたいのですが。 (2) If Target.Count > 1 Then Exit Sub If Intersect(Target, Range("E4")) Is Nothing Then Exit Sub Else If Range("e4").Value = "1" Then Target.Offset(0, 19).Value = "☆" End If どこに入れればいいのかわかりません。 (3) また、(2)のイベントの他に、 (1)のVLOOLUPが実行され、尚且つ(2)のイベントのE4が値が1だった場合、Y4にH4の値を入れたいのですが・・・。 (2)のみなら動くことは確認できましたが、(1)のexit sub の直前に入れたり、end ifの前に入れたりしましたが、片方は動くが、もうひとつが動かないです。 (3)については、まったくわかりません。 マクロについて、自分でネットで勉強した程度なので、基本がわかっていないからなのでしょうが・・・。 どなたか、教えてください。 お願いします。

  • エクセルのVBA、ループ処理について

    if文とループ処理をどう組み合わせればいいのかわかりません 以下のコードで、iの数をを増やしていく処理を行いたいのですが、エラーがでてしまいうまくいきません どのように書けばいいのでしょうか 教えてください For i = 2 To 11 If Cells("4,i") > 80 Then Cells("5,i").Value = "A" ElseIf Cells("4,i") > 70 Then Cells("5,i").Value = "B" ElseIf Cells("4,i") > 60 Then Cells("5,i").Value = "C" Else Cells("4,i").Value = "D" End If Next

  • VBAのchangeイベントについて

    初質問&VBA初心者のため記述が変なところがあると思いますがご了承ください。 現在changeイベントを使用してイメージした通りに動いてくれている(中身はぐちゃぐちゃですが・・・)のですがこれをすべてのシートでも機能するようにしたいのですが何かいい方法はないでしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub rc = MsgBox("納車日を更新してもよろしいですか?", vbYesNo + vbQuestion, "確認") If rc = vbYes Then MsgBox "納車日を更新しました" RID = ActiveSheet.Name Set b = Worksheets("シート名").Cells.Find(What:=RID) RID_height = Worksheets("シート名").Cells.Find(RID).Row RID_width = Worksheets("シート名").Cells.Find(RID).Column ThisWorkbook.Worksheets("シート名").Cells(RID_height, 10).Value = Date Else MsgBox "処理を中断します" End If End Sub

  • フォームのCheck boxとOLEObjectのCheckboxのマクロの違い?

    エクセル2003です。 ワークシート上に複数個のチェックボックスを配置し、オンの場合、その左隣のセルの値を返すマクロを作成する場合についての質問です。 普段はフォームのCheck boxを使っています。 フォームのCheck boxなら Sub ChkBx() With ActiveSheet.CheckBoxes(Application.Caller) If .Value = xlOn Then MsgBox .TopLeftCell.Offset(0, -1).Value End If End With End Sub と、標準モジュールに一つだけプロシージャを書いて、複数個のCheck boxに同一のマクロを登録すれば簡単に出来ます。 ところがこれをOLEObjectのCheckboxでやってみようと思ったところ、フォームのように一つのプロシージャを使いまわすことができず、シートモジュールに以下のように各Checkboxごとのマクロを書かなくてはいけないようです。 Private Sub CheckBox1_Click() With OLEObjects("CheckBox1") If .Object.Value Then MsgBox .TopLeftCell.Offset(0, -1).Value End If End With End Sub Private Sub CheckBox2_Click() With OLEObjects("CheckBox2") If .Object.Value Then MsgBox .TopLeftCell.Offset(0, -1).Value End If End With End Sub Private Sub CheckBox3_Click() With OLEObjects("CheckBox3") If .Object.Value Then MsgBox .TopLeftCell.Offset(0, -1).Value End If End With End Sub 3つや4つくらいならどうってことはないのですが十数個もあるとかなり面倒です。 OLEObjectのCheckboxでももっと簡単にする方法はないのでしょうか? それともわたしが何かOLEObjectのCheckboxの使い方について思い違いをしているのでしょうか? ご教示をお願いいたします。

  • エクセルVBAで無限ループ

    教えてください。 以下の2つのエクセルマクロはまったく同じことをさせようとしているのですが、test02の方は.Offset(1).Activateが働かないのか、無限ループに陥ってしまいます。 単にActiveCell.という記述をWith~End Withでまとめただけなのになぜこうなるのでしょうか? Sub test01() ActiveSheet.Cells(1, 1).Activate Do While ActiveCell.Value <> "" If Not IsNumeric(ActiveCell.Value) Then ActiveCell.Offset(0, 1).Value = "文字" ElseIf ActiveCell.Value > 0 Then ActiveCell.Offset(0, 1).Value = "正数" ElseIf ActiveCell.Value < 0 Then ActiveCell.Offset(0, 1).Value = "負数" Else ActiveCell.Offset(0, 1).Value = "その他" End If ActiveCell.Offset(1).Activate i = i + 1 Application.StatusBar = i Loop End Sub Sub test02() ActiveSheet.Cells(1, 1).Activate With ActiveCell Do While .Value <> "" If Not IsNumeric(.Value) Then .Offset(0, 1).Value = "文字" ElseIf .Value > 0 Then .Offset(0, 1).Value = "正数" ElseIf ActiveCell.Value < 0 Then .Offset(0, 1).Value = "負数" Else .Offset(0, 1).Value = "その他" End If .Offset(1).Activate i = i + 1 Application.StatusBar = i Loop End With End Sub

  • 2つのVBAを組み合わせる方法

    お世話になります、2つのVBAを組み合わせる方法で迷っています。 1つ目が Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, k As Long, myNum As Long If Intersect(Target, Range("C1,B9:B39")) Is Nothing Or Target.Count > 1 Then Exit Sub Application.EnableEvents = False With Target If .Column = 3 Then myNum = WorksheetFunction.Max(Range("B9:B39")) If IsDate(.Value) Then For i = 9 To 39 If Cells(i, "A").Value = "" Then Cells(i, "B").Value = "" Else Cells(i, "B") = myNum + i - 8 End If Next i End If Else i = .Row If .Value = "" Then Range(Cells(i + 1, "B"), Cells(39, "B")).ClearContents Else For k = i + 1 To 39 If Cells(k, "A").Value = "" Then Cells(k, "B").Value = "" Else Cells(k, "B") = Cells(k - 1, "B") + 1 End If Next k End If End If End With Application.EnableEvents = True End Sub です。 2つめが Private Sub Worksheet_Change(ByVal Target As Range)  Application.EnableEvents = True If Intersect(Target, Range("R8:R38")) Is Nothing Then Exit Sub Application.EnableEvents = False Range(Cells(Target.Row, 18), Cells(39, 18)).Value = Target.Value Application.EnableEvents = True End Sub です。2つのPrivate Sub Worksheet_Change(ByVal Target As Range)イベントのVBAですが、どのようにして組み合わせれば良いのでしょうか?

  • VBA changeイベントを複数入れたい

    VBA changeイベントを複数入れたい VBAは初心者で、以前もこちらでお世話になりました。 F4セルに入力した際、VLOOKUPで検索し、該当がなければメッセージボックスを出し、 該当があれば、そのまま次に進む、というchangeイベントが既にあります。 ここに、E4セルに入力した数字が、同じシートのE列5行目以下と重複していた場合、 エラーメッセージを出す、とのをつけたしたいと思っています。 IFを使えばいい、ということはわかるのですが、どこに入れたらいいのかがわからず・・・。 すでにあるVBAは以下のとおりです。 Private Sub Worksheet_Change(ByVal Target As Range) '処分受託者(入力用名称)を入力して、処分業者名簿になければエラーメッセージを出す。 Dim rang1 As Range Dim rang2 As Range Dim 処分受託者名称 As String Dim LastRow As Long LastRow = Worksheets("処分業者名簿").Cells(Rows.Count, "b").End(xlUp).Row Set rang2 = Worksheets("処分業者名簿").Range("b4:b" & LastRow) Set rang1 = Range("f4") If Intersect(Target, rang1) Is Nothing Then Exit Sub On Error Resume Next 処分受託者名称 = WorksheetFunction.VLookup(Target.Value, rang2, 1, 0) If Err.Number > 0 Then MsgBox Target.Value & " はありません" Range("f4").Select Else End If End Sub この、どこに重複の場合はエラーメッセージを出す、というのを入れればいいのか、 教えてください・・・。

専門家に質問してみよう