• ベストアンサー

loop終了後のセルの一個右から同様のloopを行う方法

・loop終了後のセルの一個右から同様のloopのプログラムを組むのが目的です。 ・データはA列にランダムに数字が入っているものとします。 ・条件式としては基準値より小さな数字が一個下のセルにあったら↓を表示して、さらに下に行くという風にして、基準よりも多くなったところでloopがストップする設定です。 ・困っているところをうまく表現できてないかも知れませんが、よろしくお願いします。 --------------------------- Sub 比較() Dim i As Integer Dim j As Integer Cells(1, 2).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R1C1,""→"",""↓"")" i = 1 Do While Cells(i, 2).Value <> "" If Cells(i, 2).Value = "↓" Then Cells(1 + i, 2).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R1C1,""→"",""↓"")" End If i = i + 1 Loop Cells(i - 1, 3).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R" & i - 1 & "C1,""→"",""↓"")" j = 1 Do While Cells(i - 2 + j, 3).Value <> "" If Cells(i - 2 + j, 3).Value = "↓" Then Cells(i - 1 + j, 3).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R" & i - 1 & "C1,""→"",""↓"")" End If j = j + 1 Loop End Sub

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

'こんな感じでどうでやんすか Sub 比較改() Dim i As Integer Dim j As Integer Dim k As Integer i = 2 j = 2 k = 1 Cells(k, j).FormulaR1C1 = "=IF(RC1>R" & k & "C1,""→"",""↓"")" Do While Cells(i, 1).Value <> "" If Cells(i, 1).Value > Cells(k, 1) Then Cells(i, j).FormulaR1C1 = "=IF(RC1>R" & k & "C1,""→"",""↓"")" k = i j = j + 1 End If Cells(i, j).FormulaR1C1 = "=IF(RC1>R" & k & "C1,""→"",""↓"")" i = i + 1 Loop End Sub

seiji600
質問者

お礼

期待通りのプログラムです。どうもありがとうございました。内容まで理解できるように、じっくり見させてもらいます。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

マクロの記録から、VBAの勉強に入ったのでしょうが select active は無駄です。Cells(i,j)で済むはず。マクロの改良点として、本にも良く書いてある点です。 文字(値、↓)をセットするのに関数式をセットするのはなぜ。 B列セルに関数式を作って複写でよいのでは。 このVBAは即反応型ではないですが、関数の方が即反応型のように思うが。

seiji600
質問者

補足

おっしゃるとおりマクロの記録からVBAに入りました。 select、activeが不要なのは参考にさせていただきます。 本プログラムでやりたいことは (1)前提:A列に数字がランダムに入っているとして (2)cell(1,1)よりも大きい数字がある行でB列の条件式のコピーがストップして"→"マークを表示して (3)ストップした行を基準に列をひとつ右にずれて同様に基準の行の値より大きな値が出るまで条件式をコピーする (4)同様の作業を複数続ける 以上のような流れのプログラムにしたいと考えています。また条件式については質問する上で簡略化して書いています。 説明べたですいませんが、ご協力ください。 よろしくお願いします。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

一応動いているような感じですけど、 困っているところは、大きい値が無いときに止まらないということですか? それとも、2回でなく、A列のデータのある限り右側へ処理を続けたいということですか? 後、矢印を入れるのが目的なら、式を入力する必要は無いように思いますが・

seiji600
質問者

補足

>2回でなく、A列のデータのある限り右側へ処理を続けたいということですか? その通りです。 >後、矢印を入れるのが目的なら、式を入力する必要は無いように思いますが・ 質問のために矢印に簡略化していますが 実際はそこに計算式を含んだ条件式を 入れます。 どうぞよろしくお願いします。

関連するQ&A

  • VBAでIF文を作成したが、もう少しまとめたい。

    以下のようなVBAを作成しました。 動作に問題はないのですが、 もっと簡単にまとめることができる気がしますが、うまくできません。 何かやりかたはあるのでしょうか。 宜しくお願い致します。 If Cells(5, 1).Value = Cells(1, 1).Value Then Cells(100, 100).Select ActiveCell.FormulaR1C1 = Cells(5, 1) End If If Cells(6, 1).Value = Cells(1, 1).Value Then Cells(100, 100).Select ActiveCell.FormulaR1C1 = Cells(6, 1) End If If Cells(7, 1).Value = Cells(1, 1).Value Then Cells(100, 100).Select ActiveCell.FormulaR1C1 = Cells(7, 1) End If If Cells(8, 1).Value = Cells(1, 1).Value Then Cells(100, 100).Select ActiveCell.FormulaR1C1 = Cells(8, 1) End If If Cells(9, 1).Value = Cells(1, 1).Value Then Cells(100, 100).Select ActiveCell.FormulaR1C1 = Cells(9, 1) End If If Cells(10, 1).Value = Cells(1, 1).Value Then Cells(100, 100).Select ActiveCell.FormulaR1C1 = Cells(10, 1) End If

  • エクセルVBAでの関数

    下記、コードでセルに関数を入れるようにしてるのですが 関数で得られた値をセルに反映されるようにしたいのですが Dimを使用してもどう指定してよいのかわからず苦戦しております。 宜しくお願い致します。 Range("F1").Select Do Until ActiveCell.Offset(0, -1).Value = ""       With ActiveCell .FormulaR1C1 = "=MID(RC[-1],2,3)" .Offset(1, 0).Select End With Loop Range("A1").Select Do Until ActiveCell.Offset(0, 2).Value = "" With ActiveCell .FormulaR1C1 = "=RC[11]&RC[5]&Rc[8]&rc[9]&rc[3]" .Offset(1, 0).Select End With Loop

  • エクセルでプロシージャが終了しません。

    ユーザーフォームのボタンをクリックしたら、特定のセルに現在の時刻を入力するマクロを作っています。 入力するところまではうまくいったのですが、プロシージャが終了しないので保存することができません。 どこが違うのかわからないので、わかる方よろしくお願いいたします。 Private Sub cmd1_Click() Dim hiduke As Date Dim hiduke2 As Integer hiduke = Now() hiduke2 = CInt(Day(hiduke)) If chk1.Value = True Then Cells(4, 1).Select Do Until ActiveCell.Value = hiduke2 ActiveCell.Offset(1, 0).Select Loop ActiveCell.Offset(0, 2).Value = hiduke Else Cells(4, 1).Select Do Until ActiveCell.Value = hiduke2 ActiveCell.Offset(1, 0).Select Loop ActiveCell.Offset(0, 8).Value = hiduke End If End Sub

  • EXCEL 条件付きマクロ 

     |L       |  M    | N    |  O 1 |2007/7/31  起算日 2 3 4 |最終入庫日 |日数 |月数  |区分 5 |2005/4/5   |847   |27   |2年超 6 |2005/8/1   |729  |23   |1年超  7 |2006/7/31   |365  |12   |180日超 最終入庫日と起算日の期間計算をマクロで作成しました。 データ行は、都度変化します。 期間日数が365以下の場合(例では7行目)、月数、区分の計算をせず、7行目を表示しないようにする方法を教えてください。 また、下から4行目の長いIF分をIFの前で半角スペース、アンダーバーを使って5行に改行する方法も教えて下さい。 Sub 期間計算() 'メッセージ Dim kisanbi As Date kisanbi = Application.InputBox(Prompt:="起算日を入力して下さい", _ Title:="起算日を入力", Type:=1) Worksheets("在庫").Range("L1").Value = kisanbi '計算 最終入庫日欄が空白になるまで繰り返す Dim i As Integer i = 5 Do While Worksheets("在庫").Cells(i, "L") <> "" '日数計算(M列) Worksheets("在庫").Cells(i, "M").Select ActiveCell.FormulaR1C1 = "=DATEDIF(RC[-1],R1C12,""D"")" ActiveCell.Select '月数計算(N列) Worksheets("在庫").Cells(i, "N").Select ActiveCell.FormulaR1C1 = "=DATEDIF(RC[-2],R1C12,""M"")" ActiveCell.Select '日数から計算して区分を分類、表示 Worksheets("在庫").Cells(i, "O").Select ActiveCell.FormulaR1C1 _ = "=IF(RC[-2]>1095,""3年超"",IF(RC[-2]>730,""2年超"",IF(RC[-2]>365,""1年超"",IF(RC[-2]>180,""180日超"",""180以下""))))" i = i + 1 Loop End Sub

  • フィルタでくくった状態でコピー貼り付け (2)

    以前に、http://okwave.jp/qa/q6456460.html で質問して解決したのですが 別のパターンで質問です。 以前は、L2から絶対だったのですが、今回は、セルが決まってません。 Lの1404にセルを持ってくるのに 一応 Sub 仕入先ブランク解除() Range("L1").Select Selection.End(xlDown).Select Selection.AutoFilter Field:=12, Criteria1:="=", Operator:=xlAnd Call 下に移動 ActiveCell.FormulaR1C1 = "=RC[-9]" Call 右に1マス移動 ActiveCell.FormulaR1C1 = "=RC[-9]" End Sub Sub 下に移動() ro = ActiveCell.Row co = ActiveCell.Column Range(Cells(ro + 1, co), Cells(ro + 1, co)).Select End Sub Sub 右に移動() ro = ActiveCell.Row co = ActiveCell.Column Range(Cells(ro + 1, co), Cells(ro + 1, co)).Select End Sub Sub 右に1マス移動() i = ActiveCell.Row j = ActiveCell.Column Cells(i + 0, j + 1).Select End Sub Sub メーカー名コピーあんど貼付() Dim r As Range With ActiveSheet Set r = .Range("L2", .Cells(.Rows.Count, "K").End(xlUp).Offset(, 1)) r.Item(1).Copy r If .FilterMode Then .ShowAllData End If r.Value = r.Value End With Set r = Nothing End Sub ってしました。 その後、関数のコピー貼り付けができません。(メーカー名コピーあんど貼付)の部分です わかる方がいましたらお願いします。

  • マクロの編集方法を教えて下さい。

    自分で記録したマクロを親切な方に編集してもらいました。実行スピードが格段に速くなったのですが、さらに処理したい項目が出来たので、別に記録してコピー、適切な箇所に挿入したのですが、実行時エラーが出ます。どう直していいのか分かりません。分かる方教えて下さい。 Sub Incert12() Dim wRow As Long Dim i As Integer Dim tbl(1 To 12, 1 To 1) As Integer wRow = Range("A65536").End(xlUp).Row Rows(CStr(wRow) & ":" & CStr(wRow + 11)).Insert Range(Cells(wRow + 1, "B"), Cells(wRow + 11, "B")).FormulaR1C1 = "=R[-1]C" '↑(1)これの代わりにB列を12行全て結合したい For i = 1 To 12 tbl(i, 1) = i Next i Range(Cells(wRow, "C"), Cells(wRow + 11, "C")).Value = tbl '↑(2)これに加えてA列に以下の処理も加えたい 'ActiveCell.Offset(-2, -8).Range("A1").Select 'ActiveCell.FormulaR1C1 = "=R[-1]C+1" 'ActiveCell.Select 'Selection.AutoFill Destination:=ActiveCell.Range("A1:A12"), Type:= _ ' xlFillDefault 'ActiveCell.Range("A1:A12").Select '↓(3)F列ではなく、FからK列までにしたい。 Cells(wRow + 12, "F").AutoFill Range(Cells(wRow, "F"), Cells(wRow + 12, "F")) 'これが私が作ったマクロ。(2行目に問題ありとの事) 'ActiveCell.Offset(-1, 5).Range("A1:F1").Select 'Selection.AutoFill Destination:=ActiveCell.Range("A1:F13"), Type:= _ ’ xlFillDefault 'ActiveCell.Range("A1:F13").Select Cells(wRow, 1).Select End Sub 以上(1)~(3)を直したいのです。どなたかよろしくお願い致します。

  • 行列入れ替えの並び替えを簡単に出来る方法

    エクセルで写真の左側のシートを右側のシートの様に並び替えをしたいのですが、簡単に計算式を入れてやる方法はありますか? 変換前のシートは他にもありまして、行列の長さはどれも長さがバラバラになっております。 行は~◯kgが複数あり、列は商品コードが100個以上あるのもあります。 なので、行列の長さがバラバラでも一つのマクロで動作出来るものを作成したいと考えています。 計算式を一個づつ入れて作ってましたがとんでもなく不格好になり。。。。 すみません、どなたかご指導お願いできませんか? Sub henkan() '貼付けシートの作成 'シート名は変換で作成 Sheets.Add after:=ActiveSheet ActiveSheet.Name = "変換" 'タイトル名作成 Range("A1").Select ActiveCell.FormulaR1C1 = "商品コード" Range("B1").Select ActiveCell.FormulaR1C1 = "容量" Range("C1").Select ActiveCell.FormulaR1C1 = "量" '容量作成 Dim g As Integer Dim h As Integer r = 0 Z = 0 y = 0 Worksheets("量").Activate Range(Cells(3, 3), Cells(3, Columns.Count).End(xlToLeft)).Select Z = Selection.Count Worksheets("量").Activate Range("B4", Range("B4").End(xlDown)).Select y = Selection.Rows.Count For g = 4 To y + 3 Worksheets("量").Activate Range(Cells(3, 3), Cells(3, Columns.Count).End(xlToLeft)).Select Selection.Copy h = g - 2 + r 'ここでhの値を計算しています Sheets("変換").Cells(h, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=True r = r + Z - 1 Next g '量作成 Dim j As Integer Dim k As Integer r = 0 For j = 4 To y + 3 Sheets("量").Select Sheets("量").Range(Cells(j, 3), Cells(j, Columns.Count).End(xlToLeft)).Copy k = j - 2 + r 'ここでkの値を計算しています Sheets("変換").Cells(k, 3).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=True r = r + Z - 1 Next j '商品コード作成 Dim l As Integer Dim m As Integer r = 0 For l = 4 To y + 3 Worksheets("量").Activate Cells(l, 2).Select Selection.Copy m = l - 2 + r 'ここでmの値を計算しています Sheets("変換").Cells(m, 1).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=True r = r + Z - 1 Next l '罫線作成 Sheets("変換").Select With ActiveSheet.UsedRange.Borders .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With '容量コードの空白埋め Sheets("変換").Select Range("A1").Select Dim o As String Dim p As Range o = "A2:B" & Range("C" & Format(Rows.Count)).End(xlUp).Row For Each p In Range(o) If p.Value = "" Then p.Value = p.Offset(-1, 0).Value Next Dim rng As Range Worksheets("変換").Activate Worksheets("変換").UsedRange.Select For Each rng In Selection If rng.Value = "" Then rng.Value = "0" End If Next rng End Sub

  • Excel VBA セルの指定の方法

    VBAの初心者です。処理1 のサブルーチンを使わずに直接記述すれば、エラーはでませんが、以下のように記述すればエラーが出てしまいます。宜しくお願いします。 Sub Macro10() i = 1 Do Until Cells(i, 1) = "" 処理1 i = i + 1 Loop End Sub Sub 処理1() Cells(i, 2).Select  ← ここでエラーになります。        ActiveCell.FormulaR1C1 = "◎" End Sub

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

    ネットで色々調べながら、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

  • VBAtest

    VBAおn以下の Sheets("OP").Select Dim atai As String atai = Cells(2, 2).Value Dim datedata(40) As String For j = 0 To 40 If Cells(j + 3, 2).Value = "" Then Else datedata(j) = Cells(j + 3, 2).Value End If Next Dim shihyou As String For i = 1 To 2 shihyou = Cells(2, i + 2).Cells.Value Sheets(shihyou).Select Dim tmp_c As Integer For r = 1 To 10 tmp_c = 0 For c = 1 To 10 If tmp_c = 0 Then If Sheets(shihyou).Cells(r, c).Value = atai Then tmp_c = c End If Else Dim vals(40) As String For k = 0 To 40 For l = 1 To r + 41 For m = 1 To tmp_c - 1 If Sheets(shihyou).Cells(l, m).Value = datedata(k) Then vals(k) = Sheets(shihyou).Cells(l, tmp_c).Value End If Next Next Next End If Next Next Sheets("OP").Select For k = 3 To 43 Cells(k, i + 2).Value = vals(k - 3) Next Next End Sub