• ベストアンサー

このマクロ、どこがおかしいですか?

i5とj5のセルの文字が同じ場合はセル同士を結合して一つ下の行へ行き、i5とj5のセルに何も書かれていないときはそのまま一つ下の列へ行き、行った先のセルでも同じように処理(i6とj6のセルの文字が同じ場合はセル同士を結合して一つ下の行へ行き、i6とj6のセルに何も書かれていないときはそのまま一つ下の列へ行き)を繰り返し、と言うことをi33とj33のセルまで続けたいと思っています。 Sub よろしくお願いします() Dim i As Integer For i = 5 To 33 Cells(i, 9).Select If Cells(i, 9).Value = Cells(i, 10).Value Then Range(Cells(i, 9), Cells(i, 10)).Merge Selection.Offset(i + 1).Select ElseIf Cells(i, 9).Value = "" Then Selection.Offset(i + 1).Select Next i End If End Sub と書いたのですが、『Nextに対応するForがありません』と言われてしまいます。どうすれば思い通りにできるでしょうか? 極めて初心者で、伝わりにくい点があるかもしれません。よろしくお願いします。

noname#52725
noname#52725

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

No1-2の方の指摘もそうですが、あとはご要望の動きをさせるためにはもっと変えなくてはいけないと思います。 こんな感じではどうでしょう? Sub TEST() Dim i As Integer For i = 5 To 33 Cells(i, 9).Select If Cells(i, 9).Value <> "" And Cells(i, 9).Value = Cells(i, 10).Value Then Application.DisplayAlerts = False '結合の警告を止める Range(Cells(i, 9), Cells(i, 10)).Merge Application.DisplayAlerts = True '警告を元通りに End If Next i End Sub Application.DisplayAlerts = False は警告を止めるものですので警告が必要でしたら不用です。

noname#52725
質問者

お礼

まさにこれがしたかったんです!ありがとうございます。

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。 たぶん、こんなところだと思います。 >i5とj5のセルに何も書かれていないときはそのまま一つ下の列へ行き、 というロジックですと、i5 か j 5 のどちらかにある場合はどうするか書かれていませんが、たぶん、どちらかにある時も、結合するものだと考えました。 もし、そうだとすれば、ロジックとしては、これは思ったよりも簡単ではありませんね。 もし違うなら、 ElseIf WorksheetFunction.Count(c.Resize(, 2)) = 1 Then c.Resize(, 2).Merge の部分は余分です。 それから、Mergeメソッドを使う時は、最初に、片方を削除してから行います。 なお、Resize(,2) というのは、Range(c, c.offset(,1)) の意味です。 Sub MergeCellsProc() Dim c As Range   For Each c In Range("I5:I33")     If WorksheetFunction.Count(c.Resize(, 2)) = 2 And _      c.Value = c.Offset(, 1).Value Then      c.Offset(, 1).ClearContents      c.Resize(, 2).Merge     ElseIf WorksheetFunction.Count(c.Resize(, 2)) = 1 Then      c.Resize(, 2).Merge '片方に数値がある場合     End If   Next c End Sub

noname#52725
質問者

お礼

皆さんすごいですよねぇ。素直に尊敬します。回答ありがとうございました!

noname#22222
noname#22222
回答No.5

If Len(Cells(I, C).Value & Cells(I, D).Value & "") > 0 Then                   |                   バグ!!

noname#22222
noname#22222
回答No.4

Private Sub CommandButton1_Click()   Application.DisplayAlerts = False   MargeCels2 5, 11, 9           |  |  |           |  |  +---> Marge 列           |  +-----> Marge 終了行           +--------> Marge 開始行   Application.DisplayAlerts = True End Sub Public Sub MargeCels(ByVal S As Integer, ByVal E As Integer, ByVal C As Integer)   Dim I As Integer   Dim D As Integer      D = C + 1   For I = S To E     If Len(Cells(I, C).Value & Cells(I, C).Value & "") > 0 Then       If Cells(I, C).Value = Cells(I, D).Value Then         Range(Cells(I, C), Cells(I, D)).Merge       End If     End If   Next I End Sub ※単にマージするだけであれば、こんな感じでもOKかと! ※一応は、質問者のコードと実行結果を比較してみましたが、両者の差異が判りません! ※Excel は、一度しか使ったことがない門外漢ですので悪しからず!

noname#52725
質問者

お礼

う~ん、難しい…。まだまだ修行が足りませんね。この回答が理解できるように頑張ります。回答ありがとうございました!

  • cockerel
  • ベストアンサー率46% (253/548)
回答No.2

If文の中にNext iが入ってしまっています。 そのほかの詳細については検討していません。 なお、エディタ等を使用して作成している場合にはインデントを使用してレベルを整理するとわかりやすくなります。

noname#52725
質問者

お礼

そうですね。ごちゃごちゃになると何をしているのかが分かりにくいし…。回答ありがとうございます。

  • edomin
  • ベストアンサー率32% (327/1003)
回答No.1

中身については全く検証していませんが、 「EndIf」と「Next i」の位置が逆でしょう? この場合、ElseIfが実行されないとNextが実行されませんよ。

noname#52725
質問者

お礼

なるほど!確かにできました。 回答ありがとうございます。

関連するQ&A

  • 行方向の同じ値のセルを結合するマクロ

    ネットで色々調べながら、A列方向の同じ値のセルを結合させるマクロ を作ってみたのですが、もっと簡単にできるようでしたら教えていただきたいです。 どうぞよろしくお願いいたします。 Sub セル結合() Dim r As Integer '行数 Dim i As Integer 'カウンタ r = Sheets(1).Range("a1").CurrentRegion.Rows.Count - 1 Application.DisplayAlerts = False For i = 1 To r Cells(i, 1).Activate '項目の一つ下のセルをアクティブに If ActiveCell.Value = ActiveCell.Offset(1).Value Then Range(ActiveCell, ActiveCell.Offset(1)).Merge End If Next Application.DisplayAlerts = True End Sub

  • 空白セルと0値を識別させたい。(VBA)

    すみません、誰か教えていただけますか。 シートの53、54、55行目にそれぞれ値入っています。 それを3行目にビジュアル的に表現させています。 55行目はセルの色で、53行目は数値があり同じ値が 続く部分の合計を出しています。 しかし、下記の記述ですと数値が0(変数D=0)の時に うまくいきません。空白セルと認識されてしまうと思います。 何か、良い方法があれば教えて頂けませんでしょうか。 宜しくお願いします。 Sub 表示() Dim a As Long Dim c As Long Dim D As Long Dim e As String Dim f As String c = 3 For a = 3 To 64 With Worksheets("Sheet1") If .Cells(53, a) <> .Cells(53, a + 1) Then .Range(.Cells(53, c), .Cells(53, a)).Select D = WorksheetFunction.Sum(Selection) e = D f = Selection(1).Offset(1, 0).Value G = Selection(1).Offset(2, 0).Value If D <> 0 Then Selection(1).Offset(-50, 0).Value = f + "//" + e .Range(.Cells(53, c), .Cells(53, a)).Offset(-50, 0).Select Selection.Interior.ColorIndex = G End If If Selection(1).Value = "" Then .Range(.Cells(53, c), .Cells(53, a)).Offset(-50, 0).Select Selection.ClearContents Selection.Interior.ColorIndex = xlNone End If c = a + 1 End If End With Next End Sub

  • ソートの時間比較について

    ランダムな数値群をソートする際の時間比較をしています。 計測時間を見てみると バブルソート(交換法)<挿入<選択 の順番になるのですがこれってあってますか? Sub 基本選択法() t = Timer n = Cells(2, 3).Value swap = 0 compare = 0 For i = 1 To n - 1 For j = i + 1 To n If Cells(i, 1).Value > Cells(j, 1).Value Then wk = Cells(j, 1).Value Cells(j, 1).Value = Cells(i, 1).Value Cells(i, 1).Value = wk swap = swap + 1 'Sleep (300) 'Calculate End If compare = compare + 1 Next j Calculate Next i Range("C3").Select Selection.Value = compare Range("C4").Value = swap Range("C5").Value = (Timer - t) Range("C1") = "選択法" End Sub Sub 基本挿入法() t = Timer n = Cells(2, 3).Value swap = 0 compare = 0 For i = 2 To n For j = i To 2 Step -1 If Cells(j, 1).Value < Cells(j - 1, 1).Value Then wk = Cells(j, 1).Value Cells(j, 1).Value = Cells(j - 1, 1).Value Cells(j - 1, 1).Value = wk swap = swap + 1 Else Exit For 'Sleep (40300) 'Calculate End If compare = compare + 1 Next j Calculate Next i Range("C3").Select Selection.Value = compare Range("C4").Value = swap Range("C5").Value = (Timer - t) Range("C1") = "挿入法" End Sub Sub 基本交換法() ActiveSheet.Shapes("Button 1").Select Selection.Characters.Text = "並べ替え中" t = Timer n = Cells(2, 3).Value swap = 0 compare = 0 For i = n - 1 To 1 Step -1 For j = 1 To i If Cells(j, 1).Value > Cells(j + 1, 1).Value Then wk = Cells(j, 1).Value Cells(j, 1).Value = Cells(j + 1, 1).Value Cells(j + 1, 1).Value = wk swap = swap + 1 'Sleep (300) 'Calculate End If compare = compare + 1 Next j Calculate Next i ActiveSheet.Shapes("Button 1").Select Selection.Characters.Text = "基本交換法" Range("C3").Select Selection.Value = compare Range("C4").Value = swap Range("C5").Value = (Timer - t) Range("C1") = "交換法" End Sub

  • エクセルのマクロで

    お世話になります 下記のマクロで実行した所 100まで書式設定で保護、ロックしたいのですが b3:l3はロックするものの 4行目以降はロックしません どうしたらいいでしょうか もう1つ、このシートはいつもc3からはじめたいのですが If ActiveCell.Value >= "" Then の部分はどうしたらいいでしょうか よろしくおねがいいたします 初心者でバカな質問ですみません Sub マクロ1() Dim i As Integer For i = 1 To 100 If ActiveCell.Value >= "" Then Range("B3:l3").Select Selection.Locked = True Selection.FormulaHidden = False End If ActiveCell.Offset(1, 0).Select Next End Sub

  • マクロ 繰り返し offset

    マクロについての質問です。 私自身まだ勉強中でまだ初心者です。 マクロを作ってみたのですが、自分の思い通りに動いてくれません。 どなたか詳しい方ご教授いただけませんか? 下記にマクロのせておきます。 Sheets("Sペストリ").Select For i = 1 To 10 Range("D3").Select ActiveCell.Offset(0, 1).Select If ActiveCell.Value = "" Then Exit For Else Selection.Copy Sheets("印刷").Select Range("A1").Select ActiveCell.Offset(1, 0).Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False End If Next i End Sub 私がやりたいことは、SペストリというシートのD3セルを選びそこから右にコピーしながらブランクが来るまでOFFSETし、印刷シートのA1セルから下にコピーしたセルの情報んペーストOFFSETしていく感じにしたいのですがうまくいきません。 よろしくお願いいたします。

  • 判定してセルを塗りつぶすマクロについて

    判定してセルを塗りつぶすマクロについて教えて下さい。 現在下記のようなマクロがあります。 Sub オニオン判定() Dim i As Integer, j As Integer, r As Integer Dim k As Double Range(Cells(17, 9), Cells(26, 14)).Interior.ColorIndex = 0 Range(Cells(30, 9), Cells(39, 14)).Interior.ColorIndex = 0 k = Cells(5, 2) 'B5セルの値 For j = 9 To 14 For i = 17 To 26 For r = 30 To 39 If Abs(Cells(i, j).Value - Cells(r, j).Value) <= 0.05 Then Cells(r, j).Interior.Color = vbYellow Cells(i, j).Interior.Color = vbYellow End If Next  Next   Next End Sub 対象のIf Abs(Cells(i, j).Value - Cells(r, j).Value) <= 0.05 Then で、それぞれ見比べて、0.05以上のずれがあるとセルが塗りつぶされないというマクロなのですが これを、If Abs(Cells(i, j).Value - Cells(r, j).Value) = 0 Thenという条件も追加して その時はセルを青に塗りつぶし、逆に0.05以上のずれがあるセルは赤に塗りつぶす。 みたいなマクロを書きたいです。 If Abs(Cells(i, j).Value - Cells(r, j).Value) = 0 Thenは一度追加してみましたが 上手く機能しませんでした。 やりたい事 ・数値が動いているけど、0.05以内の時は黄色 ・数値変動が0の場合は青 ・数値変動が0.05以上の場合は赤 です。 宜しくお願いします。

  • エクセルのマクロについて

    Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "ア") = 0 Then If InStr(.Cells(i, "D"), "ア(半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub このエクセルマクロはC列に「ア」があって、D列に「ア(半角)」の文字がない場合はメッセージというマクロなのですが、このマクロをア~ンまで同じ作業をしたいのですが、ひとまとめにマクロを組む事はできるのでしょうか?できる場合どのようにすれば良いでしょうか? 下記のようにして見たのですができませんでした。 Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "[ア-ン]") = 0 Then If InStr(.Cells(i, "D"), "[ア-ン](半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub

  • エクセル マクロ:文字変更

    教えてください。 sheet5にデータがあります。 マクロを実行すると、一番右の列のセルに○があると●と書き換える 一番右の列のセルに△があると▲と書き換えるコードを作成しています。 下記のコードでは時間がかかってしまいます。 省略 If Sheets("sheet5").Cells(r, cmax).Value = "○" Then Sheets("sheet5").Cells(r, cmax).Value = "●" 省略 AutoFilterを使用してマクロを作成しましたが、列に○と△が両方無いと 範囲指定したセルがすべて▲となってしまいます。 下記コードをどのように手直ししたらよいのか教えて頂けないでしょうか。 よろしくお願いします。 Sub 文字変更() Dim c As Integer Dim cmax As Integer Dim rmax As Long With Sheets("sheet5") rmax = .Range("A3").End(xlDown).Row cmax = .Range("A3").End(xlToRight).Column .Rows("1:1").Select Selection.AutoFilter For c = 2 To cmax Selection.AutoFilter Field:=c, Criteria1:="○" .Cells(1, c).Offset(1, 0).Select .Range(Selection, Cells(rmax, c)).Value = "●" Selection.AutoFilter Field:=c, Criteria1:="△" .Cells(1, c).Offset(1, 0).Select .Range(Selection, Cells(rmax, c)).Value = "▲" Selection.AutoFilter Field:=c Next c End With Selection.AutoFilter End Sub

  • マクロ 結合セルへ値のみ貼り付けるにはどうしたらよいでしょうか。

    マクロは初心者で、まだまだ勉強しているところです。 シート名「入出金履歴」のデータを顧客コードごとに分かれている別シートへデータを振り分けて貼り付ける、もしくは反映させたいのですが、貼り付け先のセルがシートの都合上、結合セルになっており、下記のマクロだと当然ながらエラーになってしまいます。結合セルをまず、解除してから貼り付けようと思ったのですが、うまくいかず、困っています。 コピー先の結合状態は、7行目から、列A:C、列D:E、列F:H と、3列になるように結合されています。結合されている行の終わりは、A:C(結合されている)列に「合計」の値が入っているセルの行、H列まで、3列になるよう結合されています。 解除する以外に、良い方法があれば是非教えていただきたいです。 よろしくお願いします。 Sub samplea() r1 = ActiveCell.Row r2 = r1 + Selection.Rows.Count - 1 Dim myRange As Range Dim s_no As String For i = r1 To r2 s_no = Cells(i, 2) Range(Cells(i, 4), Cells(i, 9)).Select Selection.Copy Sheets(Format(s_no)).Select Set myRange = Columns("a:c").Find(what:="合計") If myRange Is Nothing Then Debug.Print "Not Fount" Else myRange.Select Selection.End(xlUp).Offset(1, 0).Select Selection.PasteSpecial Paste:=xlValues Application.CutCopyMode = False Sheets("入出金履歴").Select End If Next End Sub

  • マクロ 色が思うように、表示できない

     下記のようなコードで部品の管理をしています。条件が多くて少し複雑になっています。 とりあえずは、うまくできました。J列の結果だけが、うまくできません。 但し、J列の結果が(38はローズ )の表示がうまくいきません。(6の黄色)になってしまいます。 要するに、J列の結果が不がローズ色で、合が白色で、欠が薄いオレンジ色になればよいということなのです。 原因が分からず困ってしまって、お聞きする次第です。回答して頂けるものでしようか。 ご教授下されば幸いに存じます。よろしくお願いします。  Macro2 Macro マクロ記録日 : ' Sheets("sheet1").Select Columns("A:J").Select Selection.Copy Sheets("sheet2").Select Columns("A:J").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.Sort Key1:=Range("H2"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Dim i As Long, LastRow As Long LastRow = Cells(Rows.Count, "A").End(xlUp).Row Range("J2:J" & LastRow).ClearContents '← E2:Jにすると、欠に全部なります、この設定もおかしいように思いますが? Range("E2:J" & LastRow).Interior.ColorIndex = 0 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual '文言の詳細について '部品名と詳細-------------------------------------略称            'ghyu--------------------------------------←E列   'klub---------------------------------------←F列  'llpo----------------------------------------←G列  '合計個数(合計)-------------------------←H列  合計   '数量順位---------------------------------←I列   順位 '合格・不合格(合・不)欠品(欠)-----←J列  合・不・欠 If Cells(i, "E") >= 1 And Cells(i, "E") < 20 Then Cells(i, "E").Interior.ColorIndex = 6 ' 6は  黄色 End If If Cells(i, "F") >= 1 And Cells(i, "F") < 6 Then Cells(i, "F").Interior.ColorIndex = 6 ' 6は  黄色  End If If Cells(i, "F") >= 6 And Cells(i, "F") < 10 Then Cells(i, "F").Interior.ColorIndex = 34 '34は  淡い青色 End If If Cells(i, "G") >= 1 And Cells(i, "G") < 10 Then Cells(i, "G").Interior.ColorIndex = 6 ' 6は  黄色  End If If Cells(i, "H") >= 1 And Cells(i, "H") <= 49 Then Cells(i, "H").Interior.ColorIndex = 4 ' 4は  うぐいす色  End If If Cells(i, "J") >= "不" Then Cells(i, "J").Interior.ColorIndex = 38 '38は ローズ    End If If Cells(i, "J") >= "合" Then Cells(i, "J").Interior.ColorIndex = 2 ' 2は  白色  End If For j = 5 To 9 'D-F If Cells(i, j).Value = 0 Then Cells(i, j).Interior.ColorIndex = 3 '3は    赤色        ElseIf Cells(i, j).Value = "欠" Then Cells(i, j).Interior.ColorIndex = 45 '45は  薄いオレンジ色     End If Next j For k = 5 To 9 'G-I If Cells(i, j).Value = "欠" Then Cells(i, j).Interior.ColorIndex = 45 '45は  薄いオレンジ色   End If Next k Next i Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub

専門家に質問してみよう