VBA初心者のための赤いセルに反応する結合コード

このQ&Aのポイント
  • VBA初心者の方から、赤いセルの背景色に反応して、C~Eのセルを結合して文字を入れるVBAコードについて質問があります。
  • 現在のコードでは、10/5の結果以外は正しく動作しているようですが、9~11のセルが結合されない問題があります。
  • 質問者は、10/1と同様の結果を得るためにコードを修正したいとしています。
回答を見る
  • ベストアンサー

VBA教えてください

VBA初心者です 画像を添付します 赤いセルの背景色に反応し、 C~Eのセルを結合してその中に文字を入れると言うものですが 10/1みたいに全て結合出来れば良いのですが コードを実行した結果 10/5の結果はC~Eのセルは結合されてますが 列の9~11のセルは結合されてないです これをまとめて結合出来るようにしたいです (10/1の結合セルみたいな事をしたいです) コード sub test() const hani as string="A1:E11" dim rng as range for each rng in range(hani) if rng.interior.colorindex= 3 then range(cells(rng.row,3),cells(rng.row,5)).merge cells(rng.row,3).value="停止" end if next rng end sub です。 試行錯誤しましたが変な結果になって手詰まりしてます。 コード書いてもらえるとすごく助かります! 回答お願いします!

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

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

上記のプログラムでは、横にしかつながりません。C3からE5は、プログラム実行前からつながっていたのではないですが。 この場合、赤が出て来たら、場所を記憶し、赤でなくなったら、処理をすべきです。 また、"A1:E11" となっていますが、これだと、5回処理がされます。やるなら、"A1:A11"にすべきです。Eが全角文字になっているのも気になります。Range を使うより、数値型変数を使う方がいいと思います。 それと、プログラムの頭で、C~Eをきれいにすべきです。そうしないと、2回目に動かしたときに、途中で止まります。 画像は、写真で撮ったみたいですね。PrintScreen ボタンを押せば、画像かコビーされます。Paint を開き、ペーストすればきれいな画像が取れます。あとはトリミングして下さい。 ' Option Explicit ' Sub Macro1() '   Dim iy As Long   Dim iyw As Long '   Columns("C:E").MergeCells = False   Columns("C:E").ClearContents '   For iy = 3 To Cells(Rows.Count, "A").End(xlUp).Row + 1 '     If Cells(iy, "A").Interior.ColorIndex = 3 Then '       If iyw = 0 Then         iyw = iy       End If     Else '       If iyw > 0 Then         Cells(iyw, "C").Resize(iy - iyw, 3).Merge         Cells(iyw, "C") = "停止"         iyw = 0       End If     End If   Next iy End Sub

kousukebojto
質問者

お礼

回答ありがとうございます。 思った通りの結果がでました! ベストアンサーNO.3の方と悩みましたが 早く回答下さったNO.2の方にしました! 丁寧にありがとうございました!

その他の回答 (2)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.3

 回答No.2様が仰っておられる様に、質問者様のVBAでは横方向にしか結合されません。  背景色が赤色になっているセルを、変数型がRangeとなっている単一の変数の中に次々とまとめて格納して行き、最後に「その変数内に格納されているセルが存在する全ての行」と「C列~E列の列範囲」が交差するセル範囲を、まとめて結合してやれば良いのです。 Sub QNo9246413_VBA教えてください() Const hani As String = "A1:E11" Const MergeColumns = "C:E" Dim rng As Range, myRange As Range For Each rng In Range(hani) If rng.Interior.ColorIndex = 3 Then If myRange Is Nothing Then Set myRange = rng Else Set myRange = Union(myRange, rng) End If End If Next rng Set myRange = Intersect(myRange.EntireRow, Range(MergeColumns)) Application.DisplayAlerts = False myRange.Merge Application.DisplayAlerts = True myRange.Value = "停止" End Sub

kousukebojto
質問者

お礼

回答ありがとうございます。 コードを試したところ思った通りの結果がでました! NO.2の方と違ったコードでもいけるという別のやり方でもいけるということも学べました。 ありがとうございます!

  • akauntook
  • ベストアンサー率19% (295/1481)
回答No.1

>VBA初心者です でしょうね。 このカテゴリーはVisual Basic あなたが言っているのはVBA ( Visual Basic for Applications) 名前は似ているけど違うものです。 https://digitalfan.jp/75548 とりあえず、このあたりで。 >VBA初心者です [技術者向] コンピューター 技術者だとそれで金もらってるってことなんで、丸投げならばやらないことはないですけど、お金下さいねってなります。 そもそも、技術者じゃないのになんでこのカテゴリー選んだのか。意図的なんだとしたらあまりいい気はしません。 ただ、学びたい気持ちの人なら応援するつもりはあります。 http://www.officepro.jp/excelvba/ 一通りやってみるといいです。

kousukebojto
質問者

お礼

すいません わざわざありがとうございます。 サイトを参考にして勉強します。

関連するQ&A

  • VBA教えてください

    VBA初心者です。 画像を添付します 赤く塗られているセルには C~Eまでセルを結合し なおかつ結合したセルの中に「停止」の文字をいれます。 これを手動で行うのではなく 自動で(VBAで) 赤く塗られているセルだけに反応し その行のセル(C~E)を結合し なおかつその結合されたセルの中に 「停止」の文字を中央添えにされた状態で 自動入力できるようにしたいです 教えてもらったコードでは Private sub worksheet_change(byval target as range) If target. Interior.colorindex=3 then Range(cells(target.row,3),cells(target.row,5)).merge Cells(target.row,3).value="停止" End if End sub でした。 これでは出来ませんでした 改善点か 新しくコードを書いてもらえると めちゃくちゃ助かります。 回答お願いします

  • Excel  VBAのマクロについて

    以下のようなマクロを作りました。 P4に開始番号P6に終わりの番号があるのですが、P4=P6、つまり、一つだけのシートを作成する分には問題なく動きます。しかしP4に1、P6に5と範囲を増やすとエラーが出て動きません。どこをなおしたらよろしいでしょうか? Option Explicit Sub 一括() Dim I As Worksheet Dim SheetName As String Dim Prompt As String Dim Col As Integer Dim Cell As Range Dim Row As Long Dim hani As Long For hani = Range("P4").Value To Range("P6").Value Set I = ActiveSheet SheetName = Cells(hani + 4, "K").Value & "(" & Cells(hani + 4, "B") & ")" Prompt = SheetName & "が存在します。" Sheets("基本シート").Copy After:=Sheets("基本シート") On Error GoTo 100 ActiveSheet.Name = SheetName On Error GoTo 0 Range("X3") = I.Cells(hani + 4, "B") Range("E8") = I.Cells(hani + 4, "C") Range("A13") = I.Cells(hani + 4, "D") For Col = 0 To 8 Step 4 Set Cell = I.Cells(hani + 4, "D").Offset(, Col) If Cell > 0 Then Prompt = "該当する日付がありません。" & Cell.Address On Error GoTo 100 Row = WorksheetFunction.Match(Cell, [A:A], 0) On Error GoTo 0 Cells(Row, "E") = I.Cells(hani + 4, "E").Offset(, Col) Cells(Row, "H") = I.Cells(hani + 4, "F").Offset(, Col) If Col < 8 Then Cells(Row, "Y") = I.Cells(hani + 4, "G").Offset(, Col) End If End If Next Col Next hani End 100 If Err <> 1004 Then Error Err End End If MsgBox Prompt, vbCritical Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Sheets(1).Select End Sub

  • このVBAコードの解説をお願いします。

    特定の行の中で同じものが続いたらセルを結合する、ということがやりたくて 以下のコードをネット上から探してきました。 上記の動作は実現できたのですが、自分でこのコードをみてもイマイチわかりません。 お分かりになる方、できれば1行ずつ解説してください。 よろしくお願いします。 Sub Sample() Dim myRng As Range, myRow As Long Set myRng = Range("A1") For myRow = 1 To Cells(Rows.Count, 1).End(xlUp).Row With Cells(myRow, 1) If .Value = .Offset(1).Value Then Set myRng = Union(myRng, .Offset(1)) Else Application.DisplayAlerts = False myRng.Merge Application.DisplayAlerts = True Set myRng = .Offset(1) End If End With Next End Sub

  • エクセルVBAで範囲内での位置取得(行&列)

    Sub test() Set Rng = Range("B2:E7") Rng.Cells(2, 2).Select End Sub これで、範囲Rng内では2行/2列目となるC3セルが選択されます。 では、C3セルが、範囲Rng内で何行/何列目であるかを取得するにはどのように記述すればよいのでしょうか? Rng.Cells(2, 2).Rowは、当たり前ですが、3になってしまいます。

  • vba検索結果を保持しつつ、次の検索結果が欲しい

    a列にあるセルがe列にないか検索し、あった場合は、b列にあるセルがf列にないか検索し、あった場合は、c列にあるセルがg列にないか検索し、あった場合は、c列とg列が合致した2つ隣のセル(i列)に、d列にあるセルとh列にあるセルを結合させた結果を、表示させたいです。 以下のコードを走らせましたが、何も起こりませんてした。 お手数ですが、ご教示いただけますと幸いですm(_ _)m sub merge () dim i as long for i = 1 to cells(rows.count,1).end(xlup).row if cells(i,1) = cells(i,5) then if cells(i,2) = cells(i,6) then if cells(i,3) = cells(i,7) then cells(i,7).offset(0,2) = cells(i,4) and cecls(i,8) i = i + 1 end if end if end if next end sub

  • VBA チェンジイベント 任意のセルに自動表示の仕方

    お世話になります。 見よう見まねでチェンジイベントを使っていましたが、うまくいきません。 マクロで行いたい作業は、 G23からG37のセルに何か入力された場合は、自動的にそのセルの隣のG列に"非課税"と表示させたいのです。とりあえず下記の記述をご覧ください。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim rng As Range Set rng = Intersect(Target, Range(Cells(23, 7), Cells(37, 7))) If Not (rng Is Nothing) Then Cells(ActiveCell.Row, 8).Value = "非課税" End If End Sub G列に入力するとH列に"非課税"と入力されるのですが、G列にセルを持っていっただけで、Hに入力がされてしまいます。あくまでG列に何かを入力した時にだけ、Hには"非課税"を表示させたいのですが。。。 どうすればよろしいでしょうか?よろしくご享受くださいませ。

  • VBA 選択された離れたセルの値の取得について

    EXCELのVBAでどうしても前に進めず困っております。 目的としているコードは、離れたセル(複数)をあらかじめCtrlキーで選択状態にしておき、選択されたセルの値のみをVBAが別のセルに並べていくというものです。 以下が私の作ったコードなのですが、思ったとおりの動作をしてくれません。 VBA初心者なもので、おかしな記述がたくさんあると思うのですが、どなたかアドバイスお願いします。 Public Sub xx() Dim SelectArea As String Dim TargetCell As Range Dim a As Integer Dim Row As Integer Dim Column As Integer Dim CNT1 As Integer a = 0 Row = 0 Column = 0 For CNT1 = 1 To 10 Row = Row + 1 SelectArea = Selection.Address Set TargetCell = Range("B3").Cells(Row - 1, Column) If Intersect(Range(SelectArea), TargetCell) Is Nothing Then Else Range("A30").Cells(a, 0) = Range("B3").Cells(Row - 1, Column).Value a = a + 1 End If Next End Sub

  • VBAの記録を追加したい

    エクセル2002使用です。 VBAで次のコードを使っています。 Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range Set Target = Intersect(Range("C:C"), Target) If Target Is Nothing Then Exit Sub For Each Rng In Target If Rng.Value <> "" Then Rng.Offset(, -2).Value = Now Else ' (*) Rng.Offset(, -2).Value = "" ' (*) End If Next Rng End Sub (C列のセルに何か入力されると、A列の同じ行にその時刻が入る。) 同じシートで、F列に何か入力されるとE列の同じ行にその時刻が入るように書き直したいのですが、どうすればいいのでしょうか? すいませんが、よろしくお願いします。

  • For~Next ループ内でUnionメソッドを使うとエラーになります。

    下記の記述で2行おきのセル範囲から0以下のセルを除外したセル範囲を取得しようとすると Set Rng = Application.Union(r, Rng) の行でエラーが発生します。 'Set Rng = Range(Cells(12, 7), Cells(12, 7)) の行のコメントアウトをはずすと動きますが、 cells(12,7)の値が0以下だと本来の目的 である0以下のセル範囲を除外するという目的が果たせません。 Union(r,Rng)のRngがnothingになっているとエラーの原因になるのでしょうか? Private Sub test() Dim r As Range Dim Rng As Range 'Set Rng = Range(Cells(12, 7), Cells(12, 7)) For i = 12 To 27 Step 3 If Cells(i, 7) > 0 Then Set r = Range(Cells(i, 7), Cells(i, 7)) Set Rng = Application.Union(r, Rng) End If Next i Rng.Select End Sub 以上教えてください。 お願いします。

  • 背景を条件付きで色を付けたい

    Sub test() Dim Rng As Range For Each Rng In Range("I7:I756") If Rng.Interior.ColorIndex = xlNone Then Cells(Rng.Row, 1).Resize(, 6).Interior.ColorIndex = 35 End If Next End Sub 上記のコードだとうまくいきません>< データベースがA7:K756まであり、I 列の背景が何もない場合のみ その行のAからFまでのセルを薄い緑の背景にしたいのです。 例えばI10の背景がない場合はA10.B10.C10.D10.E10.F10のセルを薄い緑する といった感じにしたいのですがVBAはあまり詳しくないので 詳しい方ぜひアドバイスお願いします。 エクセル2010を使っています。 補足 I列の背景は条件付き書式で色付けしています。

専門家に質問してみよう