VBAで次のような条件を満たすように処理を行いたいと思いますが
上手い方法が分からずにいます。下の★マークのところで、
条件を複数選択できるようにしたいのですが、
スマートな方法はあるでしょうか。
なお、使用するのは自分自身だけです。
・選択した範囲のセルを走査して、セルの値の一部に特定の文字(ここでは HIT とします)が
含まれた場合に、そのセルに色をつける。
・その際、次のように対象セルの周りのセルを同時に色付けするようにしたい。
プロージャを実行する際に、オプションとして同時に任意に複数選択できるようにしたい。★
1 対象セルに色付けする
2 対象セルの上のセルに色付けする
4 対象セルの下のセルに色付けする
8 対象セルの右のセルに色付けする
16 対象セルの左のセルに色付けする
上記の 0,1,2,4,8 はこのQAの説明のために付けた番号なので、
プログラミングでは別の番号や文字列で処理してよい
よろしくお願いします。
以下、自分なりに考えた方法
① 上で書いた1,2,4,8,16 のうち、実行したいものの番号を足し合わせた数を入力して処理する。
たとえば、対象セルとその上のセルに色付けする場合は 1+2=3 と考え 3 を入力する。
2進法を利用した方法なのですが、入力された数をVBA側で受け取ったあとの
処理を簡単にかけずにいます。
受け取った値 X を2で割って、その余り R1 が0なら~~、その余り R1 が1なら~~
次に、X-R1 を2で割って、その余り R2 が 0 なら~~
・・・
② ユーザーフォームを使って、条件をえらぶチェックボックスなどを配置し、
チェックボックスがチェックされたかどうかを判定して処理する。
全部で最大 5 つの複数選択となるので、5 つのチェックボックスを配置する。
IF~End IF 文を5回使って処理する。
など、考えられますが、ベテランの方はどのようにプログラミングするのでしょう。
No.1ベストアンサー
- 回答日時:
and を行うとビットの積が取得できます。
例えば、nに1+2=3が与えられたとき、
①ret= 1 and n
②ret= 2 and n
③ret= 4 and n
④ret= 8 and n
を行うと
① ret=1
② ret=2
③ ret=0
④ ret=0
となります。
以下は、実装例です。
Sub マクロ実行()
Dim n As Long
n = 1 + 2
If (1 And n) <> 0 Then
Debug.Print "1がON"
End If
If (2 And n) <> 0 Then
Debug.Print "2がON"
End If
If (4 And n) <> 0 Then
Debug.Print "4がON"
End If
If (8 And n) <> 0 Then
Debug.Print "8がON"
End If
End Sub
実行結果
1がON
2がON
回答ありがとうございます!
And によるビットの積、このようなシンプルな演算があると知りませんでした。複数の条件のAnd積は、1 TRUE と 0 FALSE のビットの積ということでしょうか。And 、、、よく使う演算子なのに、それがご回答のようなビット積であったなんて。目から鱗です。
No.4
- 回答日時:
案③ 実行したいものの英字を連ねた文字列を入力して処理する
n = "cudrl"
If InStr(n, "c") > 0 Then 対象セルに色付け
If InStr(n, "u") > 0 Then 上のセルに色付け
If InStr(n, "d") > 0 Then 下のセルに色付け
If InStr(n, "r") > 0 Then 右のセルに色付け
If InStr(n, "l") > 0 Then 左のセルに色付け
参考)
https://learn.microsoft.com/ja-jp/office/vba/lan …
回答ありがとうございます。InStr関数による条件処理、こちらは、色付けしたいセルの場所が文字列で設定できるため、ユーザーインターフェースの視点でも1つの考え方の参考になります。
No.3
- 回答日時:
こんにちは
そのままマッピングできるように配列などでデータを設定しておくと、ループ処理ができるので簡単そうに思います。
(5種類程度なら、個別に判定しても大差はないでしょうけれど・・)
VBAの場合は配列の設定が面倒ですが、以下では、ご質問文のままに相対座標を併せて定義しておく方法にしてみました。
ご参考にでもなれば。
※ 上下左右のセルが、シート外や想定範囲外になることは考慮していません。
Dim map As Variant
map = Array(Array(1, 0, 0), Array(2, -1, 0), _
Array(4, 1, 0), Array(8, 0, 1), Array(16, 0, -1))
Set c = Range("C4") ' [ 対象セル ]
opt = 8 ' [ オプション(1~31)]
col = vbRed ' [ 指定色 ]
For i = 0 To UBound(map)
If opt And map(i)(0) Then _
c.Offset(map(i)(1), map(i)(2)).Interior.Color = col
Next i
回答ありがとうございます。
Arrayの中にArrayを連ねることは考えたこともありませんでした。このArray内のArrayの用い方がとても賢く、初学者にはなかなか発想できない方法であると思います。この方法は、オプションの選択肢が多くなった場合でも、コードの記述量が増えず、非常に効率的な方法だと感じます。非常に参考になります。
No.2
- 回答日時:
いろいろやり方はあるとは思いますが、私なら原始的に対象セルとその上下左右のセルに対して色づけを行います。
If cCell.Value = "HIT" Then
cx = -1
rx = -1
If cCell.Row = 1 Then rx = 0
If cCell.Column = 1 Then cx = 0
For rxi = rx To 1
For cxi = cx To 1
Cells(cCell.Row + rxi, cCell.Column).Interior.ThemeColor = xlThemeColorAccent4
Cells(cCell.Row, cCell.Column + cxi).Interior.ThemeColor = xlThemeColorAccent4
Next
Next
End If
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA初心者です。 VBAで行単位で条件付き書式の色をカウントしたいです。 大量のデータがあるExc 3 2022/06/08 10:02
- Visual Basic(VBA) VBA初心者です。 VBAで行単位で条件付き書式の色をカウントしたいです。 大量のデータがあるExc 3 2022/06/08 10:00
- Excel(エクセル) 【Excel】指定のセル内容を基に別シートのセルを検索して選択する【VBA】 1 2022/06/16 16:16
- Excel(エクセル) 重複しているか否かをソートせずに判断する方法ありますか? 2 2022/07/06 21:16
- Excel(エクセル) Excel アクティブセルのみ条件付き書式の色を他の色にしたい。 4 2022/06/11 22:19
- Excel(エクセル) Excel VBA 空白行があるセル範囲に色を付ける 3 2022/06/13 15:58
- Excel(エクセル) エクセルの条件付き書式で*を使いたい 4 2022/05/13 16:49
- Excel(エクセル) エクセルで”入力シート”の文字書式の変更を”出力シート”で同じ文字書式で印刷したいです。VBA希望 4 2023/04/24 11:07
- Excel(エクセル) Excel2010 数式の編集をさせたくない 4 2024/02/27 16:11
- Excel(エクセル) マクロ、条件付き書式のfont.color 1 2023/03/28 01:10
このQ&Aを見た人はこんなQ&Aも見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
Excel-VBAのmsgBox()の不思議
Visual Basic(VBA)
-
VBAなくなるの?
Visual Basic(VBA)
-
VBAに詳しい方教えてください。
Visual Basic(VBA)
-
-
4
Excel VBA 定義されたプロージャ名、関数名の取得
Visual Basic(VBA)
-
5
VBAで大量のファイルをシート名ごとに転記やらいろいろしたい!
Visual Basic(VBA)
-
6
Vba 実数および実数タイプの変数について教えてください
Visual Basic(VBA)
-
7
Vba SelStart、SelLen教えてください教えてください
Visual Basic(VBA)
-
8
現在のブックを閉じないで、マクロ抜きの(現在のブックの)コピーを作成したい
Visual Basic(VBA)
-
9
Excelのマクロについて教えてください。
Visual Basic(VBA)
-
10
エクセルVBAについて
Visual Basic(VBA)
-
11
VBA レジストリの値の読み方について教えてください
Visual Basic(VBA)
-
12
エクセルVBAについて
Visual Basic(VBA)
-
13
VBA一覧取得 再投稿
Visual Basic(VBA)
-
14
VBAコードのインデント表示
Visual Basic(VBA)
-
15
Excelのマクロについて教えてください。
Visual Basic(VBA)
-
16
ExcelVBAのFindFirstエラーについて
Visual Basic(VBA)
-
17
Sub 要具ライフ() ActiveSheet.Cells.Find(what:=TOPゴム")."
Visual Basic(VBA)
-
18
VBA SaveChanges 上書きされない
Visual Basic(VBA)
-
19
VBA 複数のエクセルから一つのエクセルに貼り付ける
Visual Basic(VBA)
-
20
vba 削除
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
特定の色のついたセルを削除
-
【Excel VBA】一番右端セルまで...
-
DataGridViewのフォーカス遷移...
-
エクセルVBA 配列からセルに「...
-
VBA:日付を配列に入れ別セルに...
-
【VBA】【ユーザーフォーム_Lis...
-
Excel VBAでCheckboxの名前を変...
-
Excelで空白セル直前のセルデー...
-
Excel UserForm の表示位置
-
VBA にて、条件付き書式で背景...
-
EXCEL VBA 文中の書式ごと複写...
-
入力規則のリスト選択
-
【VBA】写真の貼り付けコードが...
-
「VBA」会議室予約表の作成
-
EXCEL 2010 VBAでピボットで複...
-
Excel VBA でFunctionプロシジ...
-
ユーザフォームを使ってのデー...
-
Excel VBAで特定の範囲の空白セ...
-
ASP.NETでWebアプリケーショ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
Excel UserForm の表示位置
-
エクセルVBA 配列からセルに「...
-
EXCEL VBA 文中の書式ごと複写...
-
特定の色のついたセルを削除
-
【Excel VBA】一番右端セルまで...
-
Excelで空白セル直前のセルデー...
-
【VBA】写真の貼り付けコードが...
-
VBAコードについて教えてくださ...
-
【VBA】【ユーザーフォーム_Lis...
-
Excel 範囲指定スクショについ...
-
VBAでユーザーフォームにセル値...
-
VBA:日付を配列に入れ別セルに...
-
VBA にて、条件付き書式で背景...
-
Excel VBAでCheckboxの名前を変...
-
複数指定セルの可視セルのみを...
-
Excel VBA IF文がうまく動作し...
-
エクセルのカーソルを非表示に...
-
入力規則のリスト選択
-
VBA 複数条件の分岐処理の上手...
おすすめ情報
質問文中に誤りがありました。
誤 上記の 0,1,2,4,8 はこのQAの説明のために付けた番号なので、
正 上記の 1,2,4,8,16 はこのQAの説明のために付けた番号なので、