• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:書式の条件に合致したら〇を付ける)

Excelマクロで変更する方法

このQ&Aのポイント
  • Excelマクロを使用して、3つのグループのいずれかに太字で色塗りがある行を特定する方法を教えてください。
  • 初心者向けに、BooleanのTrueとFalseの使い方を説明してください。
  • 以前の質問と画像のリンクを提供しています。

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

  • ベストアンサー
  • SI299792
  • ベストアンサー率48% (719/1487)
回答No.1

グループ内の3つのうち1つが色塗りで太字ならという条件は変わっていないのでしょうか?、であれば、一番簡単なのは、     LFlag = False にして、       LFlag = LFlag Or GFlag にすればいいです。 しかし、そのような条件であれば、グループ分けの必要はなくなり、9つのうちどれか1つが条件に合っていたら、という風に考えることもできます。 ' Sub Macro2() '   Dim IY As Long   Dim IX As Integer   Dim LFlag As Boolean '   Application.ScreenUpdating = False '   For IY = 1 To Cells(Rows.Count, "A").End(xlUp).Row     LFlag = False '     For IX = 1 To 9       With Cells(IY, IX).DisplayFormat         LFlag = LFlag Or .Font.Bold And .Interior.Pattern = xlSolid       End With     Next IX '     If LFlag Then       Cells(IY, "J") = "〇"     Else       Cells(IY, "J").ClearContents     End If   Next IY End Sub この方がプログラムは簡単です。 Boolean は論理型変数で、比較の結果を格納します。値はTrueとFalse しかありません。 例えば   If A = 5 Then を   LFlag = A = 5   If LFlag Then に置き換えることが可能です。   If LFlag = True Then でも構いません。私はこの書き方は嫌いですが。 今回の場合、 .Font.Boldは太字の時、Trueになります。 .Interior.Pattern は背景色が指定してあればxlSolid になるので、 .Interior.Pattern = xlSolid は背景色が指定してあればTrueになります。 この2つをAnd でつないでいるので、両方Trueになってはじめて結果がTrueになります。 LFlag = LFlag Or …はA = A + …と同じ感じです。   S = A(1) + A(2) は   S = 0   For IX = 1 To 2     S = S + A(IX)   Next IX と書くことができます。同様に   If A(1) = 1 Or A(2) = 1 Then は   LFlag = False   For IX = 1 To 2     LFlag = LFlag Or A(IX) = 1   Next IX   IF LFlag Then と書くことができます。これは沢山の項目をOrでつなぎたいときに威力を発揮します。

honeybeans
質問者

お礼

度々ありがとうございます。そうですね、この場合はグループ分けは考えなくてもよいですね。でも、ORの場合はそうやればいいのかと勉強になりました。Booleanはまだ難しくて分からないです。なぜLflag=Flase となって、そこの位置なのか、LFlag = LFlag Or GFlagはどういうことなのか???

honeybeans
質問者

補足

すみませんが、もう一つ質問が出てきました。こちらの方にも回答いただけませんでしょうか? マクロ IF分岐 結果がうまく表示されない https://okwave.jp/qa/q9348392.html

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • SI299792
  • ベストアンサー率48% (719/1487)
回答No.2

最初の説明はわかりにくかったですね。 あれは、前のプログラムをどうすればいいかという質問だったので、 前のプログラムの必要最低限の修正箇所を上げました。     LFlag = True         ↓     LFlag = False 。       LFlag = LFlag And GFlag         ↓       LFlag = LFlag Or GFlag に置き換えるように、という意味です。 新しいこるグラムを利用するのであれば、前のプログラムの修正は必要ありませんね。余計なことを書いてしまいました。 なぜこうするか。 「いすれかに」ということであれば、And をOrに置き換えればいいわけです。その場合初期値をFalse にする必要があります。 「いすれにも」であれば逆に言えば、どれか1つが条件に合わなければということになります。最初にTrueにして置き、条件に合わないものが出てくればFalse にすればいいわけです。

honeybeans
質問者

お礼

何度もありがとうございます。まだまだ、初心者でわからないのですが、勉強してみます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルVBA:ある有名な方のサイトで・・・

    VBA初心者です。よろしくお願いします。 いま、VBAを勉強しています。 有名なT氏のエクセルVBAに関するサイト(オフィスT・・)の、「高速化テクニック」のところで、下記、★ ★ ★以下のような例がありました。 「Cells(j, 1).Font.FontStyle = "太字"」 が目的の作業であるならば、 「Dim i As Integer」「For i = 1 To 100」を何のために宣言し、記述しているのでしょうか?「j」の変数の宣言は「Cells(j, 1).・・・」で理解できますが、「i」の宣言また、「For i = 1 To 100」は不要のように思われるのです。 最初は何かの間違いかと思っていましたが、同氏の他の解説にも同様の記述がありましたので、きっと、意味があるのですね。教えてください。 ★ ★ ★ Sub Test2() Dim i As Integer, j As Integer For i = 1 To 100 For j = 1 To 10 Cells(j, 1).Font.FontStyle = "太字" Next j Next i End Sub

  • vba boolean変数を開放する方法

    エクセルのセルに「○○○○○○○○○○××××××××××」と入っているものをランダムに並べ代えるマクロを探してみました。 Sub macro2() Dim i, m As Integer Dim b, c As String Dim flg(1 To 20) As Boolean b = Cells(1, 1).Value Randomize For i = 1 To 20 Do m = Int(20 * Rnd + 1) If flg(m) = False Then flg(m) = True Exit Do End If Loop c = c & Mid(b, m, 1) Next i Cells(1, 2).Value = c End Sub これはうまく動くのですが、10行分やろうとして、以下のように変更すると暴走(終わらない)します。 Sub macro2() Dim i, m, n As Integer Dim b, c As String Dim flg(1 To 20) As Boolean For n = 1 To 10 b = Cells(n, 1).Value Randomize For i = 1 To 20 Do m = Int(20 * Rnd + 1) If flg(m) = False Then flg(m) = True Exit Do End If Loop c = c & Mid(b, m, 1) Next i Cells(n, 2).Value = c next n End Sub 一行目が終わってもboolean変数の値がそのまま残っているのが原因らしいのですが開放する方法がわかりません。 取りあえずもう一つマクロを追加してやりたいことはできたのですが、 Sub macro1() Dim n As Integer For n = 1 To 10 Call macro2(n) Next n End Sub Sub macro2(n As Variant) 以下略 なんかスッキリしません。 boolean変数を開放し、マクロひとつですます方法を教えて頂きたくお願いします。 flg(m) = Falseを挿入してもダメでした。

  • マクロ 書式の条件に合致したら〇をつける

    添付をご覧ください。 A~C列、D~F列、G~I列、それぞれの3グループのうち、1行ずつで、色塗りがあり、かつ太字フォントがあれば、J列に〇を付けるというマクロが知りたいです。添付の例だとJ10に〇が付きます。分かりにくいですが、赤と緑のフォントが太字で、どちらも含める、色は3色あり、すべて含める、としたいので、「色塗りで太字なら、」で大丈夫です。エクセル2013使用です。

  • VBAで行列を作る方法

    次のようなプログラミングで1,0,-1の要素で作られる3×3行列を全通り調べています。 この場合3の9乗通り調べることができます。 これを4×4や5×5行列など数を大きくして調べたいのですが、このプログラムを配列を使うなどして 簡単にできる方法を教えてください。 よろしくおねがいします。 Sub test() Dim a As Integer '行 Dim b As Integer '列 Dim c As Integer, i As Integer, j As Integer, d As Integer, e As Integer Dim 内積 As Integer, step As Integer Dim f As Integer, g As Integer, h As Integer, l As Integer, m As Integer, n As Integer, k As Integer, x As Integer Dim sum As Integer, total As Integer Dim aa As Integer, aaa As Integer, aaaa As Integer, bb As Integer, bbb As Integer, bbbb As Integer a = 3 '行 b = 3 '列 c = 0 内積 = 0 con = 0 sum = 0 tatal = 0 aa = 0 aaa = 0 aaaa = 0 bb = 0 bbb = 0 bbbb = 0 x = 0 For n = 0 To 2 For m = 0 To 2 For l = 0 To 2 For k = 0 To 2 For h = 0 To 2 For g = 0 To 2 For f = 0 To 2 For e = 0 To 2 For d = 0 To 2 '要素がすべて1 For i = 1 To a For j = 1 To b Cells(i, j) = 1 Next j Next i If bbbb = 1 Then Cells(a - 2, b - 2) = 0 ElseIf bbbb = 2 Then Cells(a - 2, b - 2) = -1 End If If bbb = 1 Then Cells(a - 1, b - 2) = 0 ElseIf bbb = 2 Then Cells(a - 1, b - 2) = -1 End If If bb = 1 Then Cells(a, b - 2) = 0 ElseIf bb = 2 Then Cells(a, b - 2) = -1 End If If aaaa = 1 Then Cells(a - 2, b - 1) = 0 ElseIf aaaa = 2 Then Cells(a - 2, b - 1) = -1 End If If aaa = 1 Then Cells(a - 1, b - 1) = 0 ElseIf aaa = 2 Then Cells(a - 1, b - 1) = -1 End If If aa = 1 Then Cells(a, b - 1) = 0 ElseIf aa = 2 Then Cells(a, b - 1) = -1 End If If total = 1 Then Cells(a - 2, b) = 0 ElseIf total = 2 Then Cells(a - 2, b) = -1 End If If sum = 1 Then Cells(a - 1, b) = 0 ElseIf sum = 2 Then Cells(a - 1, b) = -1 End If If con = 1 Then Cells(a, b) = 0 ElseIf con = 2 Then Cells(a, b) = -1 End If con = con + 1 Next d con = 0 sum = sum + 1 Next e sum = 0 total = total + 1 Next f total = 0 aa = aa + 1 Next g aa= 0 aaa = aaa + 1 Next h aaa = 0 aaaa = aaaa + 1 Next k aaaa = 0 bb = bb + 1 Next l bb = 0 bbb = bbb + 1 Next m bbb = 0 bbbb = bbbb + 1 Next n End Sub

  • エクセルマクロ配列で変数は使えますか

    エクセル2013です。 初めて配列を使います。 以下のように作成し思ったようにできました。 Sub 計算() '成功 Dim a As Integer Dim c As Integer Dim b(5) As Integer Dim 最終行 Dim 値列  値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To 5 b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub ただ計算する列の範囲をインプットボックスで入力した値 にしたい為以下のように改造しました。 Dim b(対象列) As Integerでエラーになります 配列には変数は使用できないのでしょうか? よろしくお願いします。 Sub 計算() '失敗 Dim a As Integer Dim c As Integer Dim b(対象列) As Integer’★ここでERRになる Dim 最終行 Dim 対象列 Dim 値列  対象列 = 22'インプットボックスで入力した値 値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To (対象列 - 17) b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub

  • Excel VBAライフゲーム

    ExcelのVBAでライフゲームを作りたいのですが、次のプログラムの途中以降がわかりません。 もしよろしければ、このつづきの簡単な実行できるVBAライフゲームを教えてください。 続きのプログラムを教えていただけたら幸いです。 Option Explicit Const ALIVE As Integer = 1 Const DEAD As Integer = 0 Const SIZE As Integer = 19 Const Tmax As Integer = 100 Dim C(SIZE, SIZE) As Integer Sub LifeGame() Dim InitRate As Single Dim T As Integer Dim N As Integer Dim Cnext(SIZE, SIZE) As Integer Dim I As Integer, J As Integer InitRate = -1 Do While InitRate < 0 Or 1 < InitRate Loop For I = 0 To SIZE For J = 0 To SIZE If Rnd() < InitRate Then C(I, J) = ALIVE Else C(I, J) = DEAD End If Next J Next I For T = 1 To Tmax For I = 0 To SIZE For J = 0 To SIZE If C(I, J) = ALIVE Then Cells(I + 1, J + 1).Value = "■" Else Cells(I + 1, J + 1).Vallue = "" End If Next J Next I For I = 0 To SIZE For J = 0 To SIZE N = Count(I, J) Next J Next I For I = 0 To SIZE For J = 0 To SIZE C(I, J) = Cnext(I, J) Next J Next I Next T End Sub Function Count(I As Integer, J As Integer) As Integer End Function

  •  条件付き書式での色付けで以下のコードを教えて頂いたんですが、色付けを

     条件付き書式での色付けで以下のコードを教えて頂いたんですが、色付けを 適用する範囲をどうやって変更すればいいのでしょうか? もしよろしければ、範囲の変更の仕方と、コードの意味を教えて頂けますか? めんどうですがよろしくお願いします・・・。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Columns(3).Interior.ColorIndex = xlNone Dim i, j As Long For i = 1 To Cells(Rows.Count, 3).End(xlUp).Row For j = 1 To Cells(Rows.Count, 6).End(xlUp).Row If Cells(i, 3) = Cells(j, 6) Then Cells(i, 3).Interior.ColorIndex = Cells(j, 7).Interior.ColorIndex End If Next j Next i End Sub

  • データ検索ネスト Excel VBA

    excel2003でデータ検索の処理をするというマクロをVBAで作成したいのですが、うまく動作しません。自作のVBAを記載してみましたので何が原因なのか教えてください。初心者です、よろしくお願いします。 Sub データ検索() Dim i As Integer, j As Integer, k As Integer, l As Integer Dim myRange As Range Dim IngLastrow As Long IngLastrow = Range("A65536").End(xlUp).Row For i = 3 To IngLastrow For j = 3 To 25 For k = 8 To 53 For l = 3 To 9 Set myRange = Worksheets("データベース").Cells(i, "o").Find(what:=Worksheets("コード").Cells(j, "o").Value, _ LookIn:=xlValues) If Not myRange Is Nothing Then Worksheets("予定").Cells(k, l).Value = myRange.Offset(, -12).Value End If Next l Next k Next j Next i End Sub

  • Excel マクロ:変数を複数使う場合

    マクロ初心者です。 For文で、変数を2つ定義し、それぞれが1つずつ増えてくれるような マクロを組みたいのですが、うまくいきません。 例えばA列の並んだ数字を、B列に一個とばしで入力するとして・・・ 例) Dim i As Integer Dim j As Integer For j = 2 To 10 Step 2 For i = 1 To 9 Cells(j, 2).Value = Cells(i, 1).Value Next i, j ではだめですよね。iが1つ増える時に、jも1つ増える、 というようにVBAを組むことが可能なのでしょうか? ど素人な質問ですみませんが、教えてください。

  • マクロのプロシージャーの修正

    シートの加工場設定マスタの列が最初は、B列の4行目からD列の30行まで あったのですが、B列が不要になったのでB列を削除しました。 下記のようなマクロを記述していますが何処を修正すればよいか 教えてください。 Private bmas(20,3) Sub Kmas_call() Dim i As Integer, j As Integer, k As Integer Windows("加工品.xls").Activate Sheets("加工場設定マスタ").Select For i = 1 To 20 For j = 1 To 3 Bmas(i, j) = Cells(i + 4, j + 1) Next j Next i End Sub