No.3
- 回答日時:
ご質問は、なかなか難しいです。
既存のものに、それを実現させるのは難しいです。
>1行目は項目があり、2行目からデータを入力をしていきます。
'標準モジュール(統一コード)
Sub チェック1_Click()
Dim chkName As Variant
Dim n As Variant
Dim i As Long
chkName = Application.Caller
n = InStr(1, chkName, " ")
If n > 0 Then i = Mid(chkName, n + 1)
With ActiveSheet
If Application.CountBlank(.Cells(i + 1, 1).Resize(, 4)) > 0 Then
MsgBox "未入力セルがあります", vbExclamation
.CheckBoxes(chkName).Value = xlOff
Else
.CheckBoxes(chkName).Value = xlOn
End If
End With
End Sub
解説:
フォームコントロールならではですが、同じマクロを利用します。どのチェックボックスを触ったか、Application.Caller で名前を取ります。ActiveXコントロールでは、自作で同じ機能を持つプロパティを取り付けなくてはなりません。
「チェック 1 」などの「名前+空白+数字」または、「名+空白+名+空白+数字」というオブジェクト名であることが、条件です。「チェック 1」の末尾の1を使って、処理をする関係で、オブジェクト名が重要です。オブジェクト名と行が合っていない場合は、予備的なマクロで、オブジェクト名と合わせなくてはなりません。オブジェクトから行の位置を取り出すことも可能ですが、とても不安定でまともには行かない例も多くあります。
この1を取り出して、1+1 =2行目をCountBlank(4列分)で、0 でなければ、
エラー・メッセージを出します。
なお、こういうマクロは、チェックボックスを取り付けから、全部、マクロで設定するのが一般的で、一瞬できれいに貼り付けまで終わってしまいます。
'//標準モジュール
Sub AddCheckBoxes()
Dim c As Variant
With ActiveSheet
.CheckBoxes.Delete 'チェックボックスは一旦すべて消します。
For Each c In Range("A2", Cells(Rows.Count, 1).End(xlUp)) 'A2~最後行まで
With .CheckBoxes.Add(c.Offset(, 4).Left + Int(c.Width / 2), c.Top + 0.1, _
c.Offset(, 4).Width, c.Height)
.Caption = ""
.Name = "Cb " & c.Row '行数とオブジェクト名を連動させる
.OnAction = "MyMacro1" '統一マクロの登録
.Placement = xlMove '行に合わせてオブジェクトが動く
.Visible = True
End With
Next
End With
End Sub
Sub MyMacro1()
'統一マクロ
Dim chkName As Variant
Dim n As Variant
Dim i As Long
chkName = Application.Caller
n = InStrRev(chkName, " ")
If n > 0 Then i = Mid(chkName, n + 1)
With ActiveSheet
If Application.CountBlank(.Cells(i, 1).Resize(, 4)) > 0 Then 'i+1 ではなく、iになる
MsgBox "未入力セルがあります", vbExclamation
.CheckBoxes(chkName).Value = xlOff
Else
.CheckBoxes(chkName).Value = xlOn
End If
End With
End Sub
以下は、興味がないようでしたら、無視して構いません。
●フォームコントロールかActiveX コントロールか?
同じ内容のActiveXコントロールで統一したマクロを作るつもりなら、Classインスタンス が必要です。実際に、似たようなマクロを100個も書いていたら大変なのです。
フォームコントロールとActiveX コントロールとどちらが良いというのは、はっきりと明言できませんでしたが、最近では、旧ファイルでActiveX コントロールで作ってきたものが、最近、トラブルを発生し、フォームコントロールに替えなくてはならない自体が起きています。
かつて、Microsoft 側では、Ver.5のフォームコントロールにあるものをなくす方法にあったようです。しかし、Office 2007以降、事情が変わったとしか言えません。その証拠に、開発-挿入-[フォームコントロール・ActiveX コントロール]と二者択一になっています。
ActiveX コントロールは、シートモジュール備え付けなので、同じ内容でも、基本的にはマクロの融通が利かない、別のコントロールを設けなくてはならないとか、コントロール配列が効かないなどの理由で、敬遠されることが多いようです。これは、あくまでも、ワークシート上のみに限られる問題です。Classで、擬似的にコントロール配列するぐらいなら、最初から、フォームコントロールを使ったほうが早いと言えます。
詳しいご説明までしていただきまして、ありがとうございます。
早速、2つ目のチェックボックスの貼り付けから全部マクロで行う方を実行してみたのですが、n = InStrRev(chkName, " ")→が方が違いますとエラーが出てきました。
そのまま貼り付けしたのですが・・・、何が問題なのでしょうか。教えてくださいませ。
No.4
- 回答日時:
こんにちは。
>このチェックボックスのチェックをもう一度クリックしてチェックを外すことがありますが、チェックをクリックしても外れないのです・・・。
不思議なロジックになりますが、統一マクロの中で、CountBlank に0がないなら、マクロは中止という命令を入れれば、全部揃ってチェックが入れられている行のみ、チェックを外すことが可能になります。
'//
Sub MyMacro1()
'統一マクロ
Dim chkName As Variant
Dim n As Variant
Dim i As Long
Dim bln As Boolean '*
chkName = Application.Caller
n = InStrRev(chkName, " ")
If n > 0 Then i = Mid(chkName, n + 1)
With ActiveSheet
bln = Application.CountBlank(.Cells(i, 1).Resize(, 4)) > 0 '*
If bln = False Then Exit Sub 'マクロ中止
If bln Then 'i+1 ではなく、iになる
MsgBox "未入力セルがあります", vbExclamation
.CheckBoxes(chkName).Value = xlOff
Else
.CheckBoxes(chkName).Value = xlOn
End If
End With
End Sub
お礼が遅くなり、説明不足もあり申し訳ありませんでした。
すごいです!!!
チェックが外れました!!!
本当にありがとうございます。
いただいたvbaを元に勉強させていただきます。
ありがとうございました。
No.5
- 回答日時:
もうお答え出ていますが
ActiveSheet..CheckBoxes(Application.Caller).TopLeftCell.Row
を使うと押されたチェックボックスの行が
番号に関係なく得られるので
それを想定しておりました。
>このチェックボックスのチェックをもう一度クリックしてチェックを外すことがありますが
多分あなただけが判る、あるあるじゃないでしょうか?
当初の説明からどういう場合にそういうケースがあるかを
読み取れないと思います。
if ActiveSheet..CheckBoxes(Application.Caller).value then exit sub
でもいけそうな。
No.6
- 回答日時:
チェックボックスってセルとリンクさせることができますよね。
その上で、Worksheet_Changeイベントプロシジャで、リンクしたセルの変更を拾って、チェックを行うのはどうでしょうか。
No.3の WindFallerさんの方式で、一括してリンク設定してしまえば、手間もかからないし・・・。
この後、チェックされている行だけを別シートに抽出みたいなことを行うと思うのですが、その際もセルの値で判断できるので、一石二鳥です。
すごい!
そうなんです。
この後チェックしている行だけ別シートに抽出するのですが、どうしようかなと今晩考えてみる予定でした。
ママチャリさんのご意見を軸に考えてみます。
またわからないところが出てきたら教えてくださいです。
No.7
- 回答日時:
遅くなってすみません。
パソコンが、ついに故障しはじめて、朝8:30頃から、本日の14時ごろ立ち上がりました関係で、まだおっかなびっくりでPC触っている状態です。以下は、既存のチェックボックスの付け足し機能ですが、マクロ自体は、同じ内容のものにしました。もし、思ったような具合でなかったら、私の、補足の読み間違えです。
''//
Sub AdditionalF_Checkboxes()
'前回のマクロの付け足し
Dim i As Long
Dim rng As Range
Dim cb As CheckBox
Dim flg: flg = False '★True にすると、付け足したCheckBoxの削除:通常 False
With ActiveSheet
If flg Then
'付け足しのチェックボックスのやり直し
For Each cb In .CheckBoxes
If UCase(cb.Name) Like "CB2*" Then
cb.Delete
End If
Next
End If
For i = 2 To .CheckBoxes.Count + 1 '★注意 2行目からなので、i=2
If UCase(.CheckBoxes(i).Name) Like "CB*" Then
.CheckBoxes(i).LinkedCell = "$G$" & CStr(i + 1) '2行目から始まるという条件で
Set rng = .Cells(i, "F")
With .CheckBoxes.Add(rng.Left + Int(rng.Width / 2), rng.Top + 0.1, rng.Width, rng.Height)
.LinkedCell = "$H$" & CStr(i)
.Name = "CB2" & Space(1) & CStr(i)
.Caption = ""
.OnAction = "MyMacro1"
.Placement = xlMove
End With
End If
Next i
End With
End Sub
お礼が遅くなり申し訳ございませんでした。
うまくいきませんでした。
私の説明が悪いと思います。
もう一度一から考え直します。
すみません。。。
何度も教えていただいてありがとうございました。
No.8ベストアンサー
- 回答日時:
パソコンが一時的だと思いますが、息を吹き替えしたようで今書き込み出来ています。
ただ、今、PCの主要部分はバックアップ中です。PCを新しくする予定です。>思ったような具合でなかったら、私の、補足の読み間違えです。
うまく行かなかったのは、補足の読み間違えと書いた通りですが、同じ内容のチェックボックスを取り付けることを考えて作られたものです。それは、まずいとは思いながらも、既存のチェックボックス(それも、私が先に出したマクロで作られたチェックボックスに限ります)に付け足すマクロですから、一気に作り上げるものと違うので、何らかの問題が出ないとも限らないのです。
今、言えるのは、最初から、一気に全体的に作り上げたほうが確実だというしかありません。
ありがとうございます。
もう一度考え直しまして、チェックボックスをやめて”1”を入力することにしました。作業列を設けてISBLANKの掛け算の計算式を入れ、E列に1を入力した時に『入力規を則』で(=OFFSET(E2,0,4)<>""を入力して)I列がブランクの時は入力規則のエラーメッセージを表示することにしました。
本当にいろいろとありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルVBAでチェックボックスにチェックを入れる 1 2022/09/14 00:52
- Visual Basic(VBA) 【VBA】データを入力後に,同一シート内に履歴として転記するVBAコードを教えていただきたいです。 3 2022/11/16 01:37
- Excel(エクセル) 表内で、Enterキーで横→行の最後入力したら次の行の先頭に移動するマクロを作りたい 3 2022/05/01 21:19
- Excel(エクセル) エクセルの散布図で新たに入力した値のデータラベルが空欄になる現象 1 2022/04/26 09:31
- Excel(エクセル) excelにおける転記マクロの書き方 2 2023/05/12 03:16
- Excel(エクセル) ユーザー定義について質問です。 2 2023/06/28 13:21
- Visual Basic(VBA) Excel vbaについて知恵もしくは、コード教えて下さいm(__)m ① 表にあるデータをコピー、 2 2022/09/01 23:57
- Visual Basic(VBA) VBA 検索と入力 Excel ブック ぶぶぶ シート ししし 列V 検索対象の列です 最終行は、お 6 2023/05/17 01:40
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Excel(エクセル) VLOOKUP が機能しない、その原因は何 ? 8 2022/10/19 12:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで特定の列が0表示の場...
-
Excel マクロ VBA プロシー...
-
Excel・Word リサーチ機能を無...
-
ExcelのVBA。public変数の値が...
-
特定のPCだけ動作しないVBAマク...
-
メッセージボックスのOKボタ...
-
一つのTeratermのマクロで複数...
-
エクセルで別のセルにあるふり...
-
サクラエディタ・マクロ → VSCo...
-
ExcelVBAでPDFを閉じるソース
-
Excel VBAからAccessマクロを実...
-
EXCELのVBAでRange("A1:C4")を...
-
エクセルに張り付けた写真のフ...
-
エクセルのマクロについて教え...
-
ユーザーフォームを起動しなが...
-
エクセルのマクロについて教え...
-
VBA アドインについて お詳しい...
-
VBA初心者 Ctrl+での操作、ボタ...
-
特定文字のある行の前に空白行...
-
2つのマクロでチェックボックス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
-
エクセルで特定の列が0表示の場...
-
Excel マクロ VBA プロシー...
-
メッセージボックスのOKボタ...
-
一つのTeratermのマクロで複数...
-
エクセルで別のセルにあるふり...
-
ExcelのVBA。public変数の値が...
-
エクセルに張り付けた写真のフ...
-
ExcelVBAでPDFを閉じるソース
-
EXCELのVBAでRange("A1:C4")を...
-
Excel VBAからAccessマクロを実...
-
TERA TERMを隠す方法
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
マクロ実行時、ユーザーフォー...
-
Excelのマクロについて教えてく...
-
ソース内の行末に\\
おすすめ情報
すみません、再度実行してみたら出来ました!!
このチェックボックスのチェックをもう一度クリックしてチェックを外すことがありますが、チェックをクリックしても外れないのです・・・。どこか項目をdeleteしてチェックをクリックするとメッセージがでてチェックが外れるようになっています。。。
もう一度教えてくださいませ。
何度も追加追加で申し訳ございません。
G列にチェックボックスのtrue false の表示をさせたいのと、F列にも同じ内容のチェックボックスを表示してこのtrue false の表示はH列に表示したいのですが、上手くいきません。。。
ご教授いただけませんでしょうか。
宜しくお願いいたします。