For Next ステートメントで計算式を代入したいのですが・・・

このQ&Aのポイント
  • Excel(2003) VBAで、For Nextステートメントを使用して計算式を代入する方法について質問します。
  • 20行ごとに同じような表が20個続いており、特定のセルに計算式を入れたいのですが、現在できていません。
  • 計算式の右側のセルを変数iの値に応じて20行ずつずらしたいのですが、方法がわかりません。どうすればいいでしょうか?
回答を見る
  • ベストアンサー

For Next ステートメントで計算式を代入したいのですが・・・

For Next ステートメントで計算式を代入したいのですが・・・ excel(2003) VBAでの質問です。 20行ごとに同じような表が20個つづいてあります(さらにそれが複数のシートにある形です)。 それぞれの特定のセルに、計算式を入れていきたいのですが、 現状こんな感じです。 For i = 18 To 400 Step 20 Cells(i, 6).Formula = "=IF(P6>'sheet2'!g18,g1,'sheet2'!f18)" Next i ここで、「=」の右側の計算式の部分のセル「P6」「g18」「g1」「f18」も、変数「i」の値に応じる形で20行ずつさげたいのですが、どうしたらいいのでしょうか?  ちなみに、イメージではこんな感じなのですが   Cells(i, 6).Formula = "=IF(P6+i>'sheet2'!g18+i,g1+i,'sheet2'!f18+i)" 当然エラーが出てしまいます。「P6」の部分を「cells(i-12,16)」とかにしてみても無理でした。 初歩的な質問で申し訳ないのですが、ご教示の程、よろしくお願いいたします。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.4

R1C1形式を上手に使ってみると,ご相談の「セルによって式の文字列を変える」必要が無くなります。 For i = 18 To 400 Step 20 Cells(i, 6).FormulaR1C1 = "=IF(R[-12]C[10]>Sheet2!RC[1],R[-17]C[1],Sheet2!RC)" Next i R1C1形式の式の記述は,先にセルに一度 F18: =IF(P6>Sheet2!G18,G1,Sheet2!F18) の式を入れておき,ツールメニューのオプションの全般でR1C1にチェックを入れると =IF(R[-12]C[10]>Sheet2!RC[1],R[-17]C[1],Sheet2!RC) のように自動で変わるので,そのまま数式バーの中からコピーして使えばOKです。 #別の手 目的のセルをまとめてUnionにしておき,一斉に一つの式を投入する手もあります ワークシート上の操作では,目的のセルをコントロールキー+クリックで飛び飛びに選択しておき,一つ式を入れてコントロール+Enterで入力する操作に相当します。 でも今回は式の入力先セルが飛び飛びで沢山なので,対象セル範囲を確保するのに結局ループしないといけないため,こちらの方法はあまりメリットはありません。

AMEFURIO
質問者

お礼

やっぱりR1C1のほうがいいんですよね・・・ 色々詳細に教えていただき、ありがとうございました。

その他の回答 (3)

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.3

こんなパターンもありかも Cells(18, 6).Formula = "=IF(P6>'sheet2'!g18,g1,'sheet2'!f18)" Cells(18, 6).Copy For i = 18 To 400 Step 20 Cells(i, 6).PasteSpecial Next i Application.CutCopyMode = False

AMEFURIO
質問者

お礼

ちょっとよくわからないのですが、もう少し自力で調べてみますね。 ありがとうございました。

  • edomin7777
  • ベストアンサー率40% (711/1750)
回答No.2

Cells(i, 6).Formula = "=IF(P"+6+(i-18)+">'sheet2'!g"+i+",g"+1+(i-18)+",'sheet2'!f"+i+")" で、どうです? ※数字の意味が理解できていないので、適宜オフセットして使ってください。 ※最初と真ん中だけ数字が18からじゃないので、-18させています。

AMEFURIO
質問者

お礼

なるほど!っていう感じです。ありがとうございました。

  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.1

単純に&で文字列を組み立てればできます。 Cells(I,6).Formula = "=IF(P" & 6 + I & ">'sheet2'!g" & 18 + I & ",g" & 1 + I & ",'sheet2'!f" & 18 + I & ")"

AMEFURIO
質問者

お礼

単純すぎてなんかお恥ずかしい限りです。 ありがとうございました。

関連するQ&A

  • For~Nextステートメント  途中で止めるには

    For~Nextステートメント で、変数が5なら止めたいのですがIFを使わない方法があったと思うのですが、 忘れてしまいました。 今は、 +++++++++++++++++++++++++++++ Sub test() Dim i As Long For i = 2 To 10 If i = 5 Then Stop End If Next End Sub +++++++++++++++++++++++++++++ としていますが、 If i = 5 Then Stop End If じゃなくても、一つのメソッドで出来た気がするのですが、 わかる方いらっしゃいますか? ご回答よろしくお願いします。

  • VBA For~Next 

    「wsData」の値を「wsInv」の指定セル(=●●●=16)から4つおきに処理したい。 01:Cells(16 + i * 4, 1) とすると「i」が大きいときに   「""」があると16からスタートしない 02:「For k = 0 To 50」を作成したが、何処に入れても上手く処理出来ない。 For i = 0 To 50 '行 For j = 6 To 28 '列 If wsData.Cells(10 + i, 3).Value = "" Then wsInv.Cells(●●●, 1).Value = wsData.Cells(10 + i, 1).Value wsInv.Cells(●●●, j - 2).Value = wsData.Cells(10 + i, 23 + j).Value End If Next j Next i お力添えをお願いいたします。

  • ExcelのFor...Nextステートメントについて

    For...Nextステートメントについて質問させて頂きます。 シート1のA1に変数(0.5から2まで、0.05ずつ増加)を挿入し、 シート2のA1で「シート1のA1のそれぞれの変数×2」を計算、 シート3のA1からシート2のA1の結果をそれぞれ縦方向に表記して しよう考えております。 Sub macro1() '画面更新停止 Application.ScreenUpdating = False '自動計算停止 ActiveSheet.EnableCalculation = False Dim sheet1 As Worksheet Set sheet1 = Worksheets(1) 'シート1をアクティブにする sheet1.Activate '変数を宣言する For i = 0.5 To 2 Step 0.05 For j = 1 To 30 'シート1のパラメータの値(A1)を0.5から2まで 0.05 刻みで変化させる sheet1.Cells(1, 1).Value = i '再計算・自動再計算停止 ActiveSheet.EnableCalculation = True ActiveSheet.EnableCalculation = False 'シート2をアクティブにする Sheet2.Activate '再計算・自動再計算停止 ActiveSheet.EnableCalculation = True ActiveSheet.EnableCalculation = False 'シート3をアクティブにする Sheet3.Activate '再計算・自動再計算停止 ActiveSheet.EnableCalculation = True ActiveSheet.EnableCalculation = False 'シート2(A1)の値をシート3の j 列目にコピー&ペースト Sheet3.Range("A" & j).Value = Sheet2.Range("A1").Value Next Next End Sub 上記のコードですと、シート3にA1、A2...にそれぞれ表記される値は全て 同じになりますが、私のしようとしている事は、 シート3のA1にシート1が0.5の時の計算結果、 シート3のA1にシート1が0.55の時の計算結果....というように したいのです。 どのようにすれば良いでしょうか。 VBAにお詳しい方、アドバイス宜しくお願い致します。

  • マクロ for~next うまくいかない

    シート内の値を並び替えて、別シートに貼り付けるコード作成中。 ①偶数行の値を奇数行の特定の列に貼り付け、元の値は消す ②(2)と書かれたセルがある場合、その行をコピーして同一行に挿入し、(2)の値は消す この2つが機能しません。 ほか部分は動きます。 これが機能しない原因、分かるでしょうか。 以下、コード Private Sub CommandButton6_Click() Dim i As Long For i = 1 To 9 If Me.Controls("TextBox" & CStr(i)).Value = "" Then 'ユーザーフォーム内のテキスト1~9で空欄があると以下の操作 MsgBox Me.Controls("Label" & CStr(i)).Caption & " が未記入です" '空欄があると、ラベル名+が未記入ですのメッセージ後、処理終了 Exit Sub End If Next Dim Convert_book As String, GC_book As String, GC_address As String Convert_book = TextBox8.Value '変換シートのブック名を取得 GC_book = TextBox7.Value 'ブックAの名前を取得 GC_address = TextBox6.Value 'ブックAの保存先を取得 With Workbooks(GC_book).Worksheets(ws_name) 'ブックAシート1をWithとする。   .Range("A1:CZ200").UnMerge 'ブックAシート1の結合を解く '部品番号と客先コードをコピー .Range(Cells(Range(Parts_no).Row, Range(Parts_no).Column), _ Cells(Range(Parts_no).Row + 1, Range(Parts_no).Column)).Copy '変換シートに貼付けWorkbooks(Convert_book).Worksheets(1).Range("G4").PasteSpecial Paste:=xlPasteValues '管理№をコピー、変換シートに貼付け .Range(Control_no).Copy Workbooks(Convert_book).Worksheets(1).Range("AJ2").PasteSpecial Paste:=xlPasteValues Dim r As Long, r1 As Long, c As Long, c1 As Long, c2 As Long, c3 As Long '管理№の行と列を取得 r = .Range(Control_no).Row c = .Range(Control_no).Column '材料関連の情報のコピーと貼付け .Range(.Cells(r + 2, c - 4), .Cells(r + 3, Last_column - 1)).Copy Workbooks(Convert_book).Worksheets(1).Range("AF4").PasteSpecial Paste:=xlPasteValues '変数に、加工工程№の行と列を入れる。変更年月日の行、測定具の列、管理№の列も入れる。 r = .Range(Process_no).Row '可変 r1 = .Range(Rev_no).Row '可変 c = .Range(Process_no).Column '32または33列目 c1 = .Range(Tool_name).Column '27または28列目 c2 = Last_column '44または43列目 c3 = .Range(Control_no).Column '通常1列目 .Range(Cells(r, c2), Cells(r1 - 2, c2)).Clear '最終列をすべてクリア Dim k As Long, j As Long k = 1 '最終列に1、2、1、……繰返し数を入れる For i = r To r1 - 2 If k = 1 Then .Cells(i, c2).Value = 1 k = k + 1 Else .Cells(i, c2).Value = 2 k = k - 1 End If Next Dim i1 As Long, k1 As Long, j1 As Long k1 = 1 '管理値の欄で偶数列の値を奇数列に移す For i1 = r To r1 - 2 If .Cells(i1, c2).Value = 2 Then For j1 = c3 + 18 To c1 - 1 If .Cells(i1, j1).Value <> "" Then .Cells(i1 - 1, c3 + 25) = .Cells(i1, j1).Value .Cells(i1, j1).Value = "" End If Next j1 End If Next i1 Dim i2 As Long, k2 As Long, j2 As Long k2 = 1 '"(2)"と書いてある行を2行に増やして、"(2)"を消す For i2 = r To r1 - 2 If .Cells(i2, c2).Value = 1 Then For j2 = c3 + 18 To c1 - 1 If .Cells(i2, j2).Value Like "*(2)*" Then .Cells(i2, j2).Formula = Replace(Cells(i2, j2).Formula, "(2)", "") .Range(Cells(i2, 1), Cells(i2, c2)).Copy .Range(Cells(i2, 1), Cells(i2, c2)).Insert xlShiftToRight End If Next j2 End If Next i2 '最終列の番号順に並べる .Range(Cells(r, 1), Cells(r1 - 2, c2)).Sort _ key1:=Cells(r, c2), order1:=xlAscending End With ~~(この間はまだ未作成)~~ Application.DisplayAlerts = False Workbooks(GC_book).Close SaveChanges:=False Application.DisplayAlerts = True End Sub

  • For Next構文を使ったVBA

    こんにちは、VBAについて質問をさせてください!(>_<) 同じブックにシート「テスト」と「Sheet1」があり、「テスト」にはデータの入力欄、「Sheet1」には「テスト」に入力するためのデータが入っています。「テスト」の入力欄は「Sheet1」のデータの並び順と同じですが、入力したデータ同士に4行3列ずつデータを入力しないセルを作らなくてはなりません。 また、データを入力するセルは「テスト」の5列目8行目=「Sheet1」3列目2行目~「テスト」の20列目8行目=「Sheet1」8列目2行目のように、まず列番号を増やし、列番号が最大になったら行番号が増え、列番号はまた初期値から増えます。したがって、次は「テスト」の5列目9行目=「Sheet1」の3列目3行目~「テスト」の20列目9行目=「Sheet1」の8列目3行目になります。 上記を踏まえてVBAを作成してみたのですが、このままではi,j,k,l全ての値がNextで増えてしまいます。Ifを使ったりするのかと色々ネットで調べて考えてみましたが、行き詰まってしまいました。どなたかご教授いただけるととても嬉しいです。説明が長く申し訳ないです、わかりづらければ補足させていただくので、おっしゃってください! Dim i, j, k, l As Integer For i = 5 To 20 Step 3 'シート「テスト」の列 For j = 8 To 116 Step 4 'シート「テスト」の行 For k = 3 To 8 'シート「Sheet1」の列 For l = 2 To 39 'シート「Sheet1」の行 Cells(j, i).Value = Sheets("Sheet1").Cells(l, k).Value Next l Next k Next j Next i

  • For Each ~ Nextステートメント

    今、1つのブックに200前後のワークシートがあるとします。 For Each ~ Nextステートメントを使って以下のようなプログラムを全てのワークシートに適用したいと考えています。 Sub test() Dim mySht As Worksheet For Each mySht In Worksheets If Range("A2").Value <> "1990/01/31" Then Rows("2:2").Select Selection.Insert Shift:=xlDown Range("A2").Select ActiveCell.FormulaR1C1 = "1990/01/31" End If If Range("A3").Value <> "1990/02/28" Then Rows("3:3").Select Selection.Insert Shift:=xlDown Range("A3").Select ActiveCell.FormulaR1C1 = "1990/02/28" End If ・・・(中略)・・・ Next End Sub しかし、これを実行しても、うまくいきません。 全てのワークシートについて、必ずしもA2のセルが 1990/01/31であるとは限らないことが原因かとは思うんですが、自身ではどうしてもうまくプログラムを書くことが できません。良いお知恵を拝借できればと思います。

  • エクセルマクロの【For・・・Next】で、

    エクセルマクロの【For・・・Next】で、以下のような文を作ってます。 Sub 空欄を消す() For i =1 To 50 If Cells(i + 3,8) = "" Then Rows(i + 3).Hidden = True End If Next End Sub この繰り返す回数【50回】を、シート上の任意のセルの値の回数に変えることはできますか。 例えば「A1」のセルの値が30なら30回繰り返す。 「A1」のセルの値が20なら20回繰り返す。 といったような具合に。

  • FOR~NEXTで

    よろしくお願いします。 条件が2個あるときの、繰り返し動作を下記のようにマクロにて組みましたが、うまく作動しません。 目的 Cells(q, 1)が空白で無い時で Cells(q, 2)が空白ならば、Cells(q, 2)に”○”を記入する 上記を300回行う で、作ったつもりなんですが、Cells(q, 1)が空白の箇所で終了してしまいます。 q = 1 For I = 1 To 300 If Cells(q, 1) = "" Then Exit For If Cells(q, 2) = "" Then Cells(q, 3) = "○" q = q + 1 Next I よろしくお願いします。

  • Do~Loopステートメント

    Do~Loopステートメントで使わな方が良いステートメントとは? Do~Loopステートメントで「古いから使わない方がよい」、と言われたことがあるのですが どれの事だか忘れてしまいました。 Sub test() セルのA1~A10に1~10を入力する i = 1 Do While i < 11 Worksheets("Sheet1").Cells(i, 1).Value = i i = i + 1 Loop End Sub これは一般的だから使ってもよいと思います。 Sub test() セルのA1~A10に1~10を入力する i = 1 Do Until i = 11 Worksheets("Sheet1").Cells(i, 1).Value = i i = i + 1 Loop End Sub これもよく見かけます。 Do While,Do Until以外にもloopステートメントってありますか? あと使わない方が良いステートメント、私の勘違いでなければ教えてください。

  • Excel VBAのFor...Next ステートメントについて

    大学での研究に使うシミュレーション・プログラムのひな形を作成して おりまして、不明な点が出てしまったので質問させて頂きます。  シートを4つ使うシミュレーションで、シート1のA1に変数(0.5から2まで、0.05ずつ)を挿入し、 シート2のA1で計算、シート3のA1で集計・計算、 シート4のA1にそれぞれの変数を挿入した結果を縦方向に記入したいと 考えております。  VBAはまだ習い始めたばかりなので、かなり下手くそですが、なんとか コードを書いてみました。 Sub macro1() '画面更新停止 Application.ScreenUpdating = False '自動計算停止 ActiveSheet.EnableCalculation = False Dim sheet1 As Worksheet Set sheet1 = Worksheets(1) 'シート1をアクティブにする Sheet1.Activate '変数を宣言する For i = 0.5 To 2 Step 0.05 For j = 1 To 30 'シート1のパラメータの値(A1)を0.5から2まで 0.05 刻みで変化させる Sheet3.Cells(1, 1).Value = i '再計算・自動再計算停止 ActiveSheet.EnableCalculation = True ActiveSheet.EnableCalculation = False 'シート2をアクティブにする Sheet2.Activate '再計算・自動再計算停止 ActiveSheet.EnableCalculation = True ActiveSheet.EnableCalculation = False 'シート3をアクティブにする sheet1.Activate '再計算・自動再計算停止 ActiveSheet.EnableCalculation = True ActiveSheet.EnableCalculation = False 'シート3(A1)の値をシート4のA列のj列目にコピー&ペースト sheet1.Range("A1").Value = Sheet4.Range("A" & j).Value Next Next End Sub このコードを実行してもシート4の変数の結果が全て同じになって しまいました。 どの部分が不適切でしょうか。 是非ともアドバイスをお願い致します。

専門家に質問してみよう