アプリ版:「スタンプのみでお礼する」機能のリリースについて

詳しい方、ご教授ください。

大量にチェックボックスを作成する必要がある為、一つ一つセルを連動せずに、ネットを参考にして以下のマクロで作成しました。①

Sub チェックボックス作成()
With ActiveSheet.Shapes(Application.Caller).TopLeftCell.Offset(0, 10)
.Value = Not .Value
End With

その後特定の列ごとに一括でチェックボックスのオンオフができるように以下のマクロを作成しました。②

Sub 稼働3()
Dim chk
For Each chk In ActiveSheet.CheckBoxes
If chk.TopLeftCell.Column = 3 Then
chk.Value = False
End If
Next
End Sub

そうすると②のマクロを実行した結果が①の値を返すセルに反映しません。

解決方法がわからずどなたかお知恵を貸してください。
宜しくお願いします。

質問者からの補足コメント

  • 画像添付します

    「2つのマクロでチェックボックスが連動しま」の補足画像1
      補足日時:2024/04/27 14:58
  • 画像です

    「2つのマクロでチェックボックスが連動しま」の補足画像2
      補足日時:2024/04/27 15:12
  • ご回答ありがとうございます。とても勉強になります。
    VBAの基礎を全く知らない素人が無理やりやろうとしているので、詳しい方からしたらヘンテコな点がたくさんあるのがよくわかりました。
    素直にリンクセルの機能を使う仕組みで作成しようと思います、がリンク先が絶対参照になってしまうのをどうマクロで登録するのかわかりませんでした。もしよければ教えていただけるとありがたいです。宜しくお願いします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2024/04/27 17:06

A 回答 (2件)

No1です。



>リンク先が絶対参照になってしまうのをどうマクロで
>登録するのかわかりませんでした。
個別に登録するので、絶対参照でもかまいません。

不明点が不明なままなので、以下の条件が成立しているものと仮定します。
・チェックボックスは全てフォームコントロールのチェックボックスである。
・シート上にあるチェックボックス全てに、右側10セル目のセルを
 リンクセルとして設定しても良い。
・チェックボックスの位置はTopLeftCellを基準としても良い。
※ TopLeftCellとは、チェックボックスを選択した際に表示される選択ボックスの左上に相当するセルを意味します。
チェックボックスの範囲が広いと、実際にチェックボックスがある(ように見える)セルとは位置が異なってしまう可能性がありますが、そのようなことが無いように全てのチェックブックスが設置されていると仮定しても良いという意味です。


上記の仮定が成立しているとして良いなら、以下のマクロを実行することで、
 ・現在、チェックボックスに設定されているマクロを解除
 ・各チェックボックスのリンクセルを右へ10セル目に設定
できます。(一度だけ実行すれば良いです)
なお、エクセルのリンクセルの機能なので、セルの表示値はチェックの状態によって TRUE/FALSE の表示になります。
(ご提示の画像のような 0/-1にはなりません)

※ 対象のシートを表示した状態で実行してください。

Sub Sample()
For Each c In ActiveSheet.CheckBoxes
c.OnAction = ""
c.LinkedCell = c.TopLeftCell.Offset(0, 10).Address
c.Value = Not c.Value = 1: c.Value = Not c.Value = 1
Next c
End Sub
    • good
    • 0
この回答へのお礼

何度もありがとうございます!
補足頂いた通りの設定で、記述していただいたものをコピペしてできました!
感謝感謝です。
わかりやすく丁寧に教えて頂き本当にありがとうございました。

お礼日時:2024/04/30 01:50

こんにちは



ひとまずチェックボックスはTopLeftCellに存在するものと仮定しても良いものと考えました。
(範囲が少し大きいとずれたりするので、必ずしも正確な位置把握にはならない可能性がありますけれど)

ご提示の①のマクロは、ご説明にある通りセルとの連動を行うものではありません。
その時の値を逆転して反映するものです。
説明文にはありませんけれど、各チェックボックスにこのマクロを登録してあるものと想定しました。
(その割には「チェックボックス作成」というネーミングはいただけませんけれど)
また、同じマクロを呼び出せる仕様ということから、チェックボックスはフォームコントロールのチェックボックスであると仮定しました。
(フォームコントロールとActiveXのコントロールでは、扱いが変わります)


以下は、上記の仮定の元ですが・・・
ご提示のマクロ①が実行されるのは、「各チェックボックスがクリックされた時」ですので、マクロから値を変えても①は実行されません。
ですので、ご質問の事象は当然の結果といえます。
そのままの仕組みで処理をしたいのなら、②のマクロでセルの値も併せてセットするようにすれば良いでしょう。

別法として、ActiveXのチェックボックスを利用するなら、値のChangeイベントを取得できますので、マクロで値を変えてもそれに応じて実行することが可能になります。
ただし、イベントの設定が各オブジェクト毎になるので面倒ですが・・

あるいは、素直にリンクセルの機能を使う仕組みにしておけば、②のマクロはそのままでも良くなります。
各チェックボックスにリンクセルを設定するのが面倒なのでしょうから、その作業をマクロで行えば、1度だけ実行しておけばセットを完了できますので、その後チェックボックスを移動しない限り実行する必要はありませんし、①のマクロも必要がなくなります。
この回答への補足あり
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。とても勉強になります。
VBAの基礎を全く知らない素人が無理やりやろうとしているので、詳しい方からしたらヘンテコな点がたくさんあるのがよくわかりました。
素直にリンクセルの機能を使う仕組みで作成しようと思います、がリンク先が絶対参照になってしまうのをどうマクロで登録するのかわかりませんでした。もしよければ教えていただけるとありがたいです。宜しくお願いします。

お礼日時:2024/04/27 16:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A