• ベストアンサー

For Next 式の結果をセル表示

Dim i, p  For i = 1 To 9   For p = 1 To 9     Cells(i, i * p).Value = i * p    Next p   Next i  End Sub ↑の式ではA、1~I、9に  結果が出るのですが  その結果を縦にひとつづつ表示したいのです  (たとえばA1~A81へ)  その場合はもうひとつ変数を宣言して  変数に表示したいセルの情報を記入するのですか?  もしくは変数を宣言しなくても可能ですか?    できれば双方のサンプルを教えていただければ  幸いです

  • ennkai
  • お礼率54% (284/525)

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

  • ベストアンサー
  • norakuma
  • ベストアンサー率29% (293/977)
回答No.1

変数を宣言しない場合 Sub test() Dim i, p For i = 1 To 9 For p = 1 To 9 Cells(i * 10 - (9 + i - p), 1).Value = i * p Next p Next i End Sub =============== i * 10 - (9 + i - p) で、行に入る数字を作ってます。 =============== 次に変数に入れるやつですが、 適当な変数を宣言して、ループの中でカウントアップし、 それを、A列の中の行とすればいけます。 Sub test() Dim i, p, y y = 0 For i = 1 To 9 For p = 1 To 9 y = y + 1 Cells(y, 1).Value = i * p Next p Next i End Sub

ennkai
質問者

お礼

早速の御回答感謝です 両方のバージョンを試してみたいと思います。 変数もループも敷居が高くて挑戦できないでいましたが がんばりたいと思います

その他の回答 (3)

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

何をしたいのか良く伝わらないが (1)Cells(行、列)で行、列を表すには、別変数にした方が判りやすいと思う。 #1回答の後半。 (2)たまたま本題では Sub test01() Dim i, p For i = 1 To 9 For p = 1 To 9 Cells((i - 1) * 9 + p, 1).Value = i * p Next p Next i End Sub で良いのかな。 しかしいつも旨く行くとは限らないから、r(Rowのr) とでも取りあえずおいて、rはp,iでどう表されるか 考える。

ennkai
質問者

お礼

ご解答ありがとうございます ROWも 今後つかっていこうとおもいます

回答No.3

#2の補足に対する回答 1)変数宣言して指定する場合  ・セル参照で得られる以外の情報が必要で   あるとき  ・セル参照が大量で、参照式の記述全体が   エクセルのファイルサイズに影響するとき 2)直接数式で指定する場合  ・局所的なセル参照で済ませられるとき   (例えば単純に合計値を求めるとき) 何かの宿題ですか? 問題は九九の表を作らせ、並びを変更させ…と基本的なアルゴリズムを習得させたうえ、最後に「得失を述べよ」という理解度確認の課題らしいですね。

ennkai
質問者

お礼

お礼が遅くなって大変もうしわけありません 変数・数式それぞれの使い分けについて 詳細にお答えくださってありがとうございます。 非常に参考になりました。 宿題というわけではないのですが^^

回答No.2

新たに変数定義はせず、   Cells(9*(i-1)+p, 1).Value = i*p としてはどうなのでしょう? #1さんの式と同じことですが、シンプルだし、意味がよく把握できますでしょ?

ennkai
質問者

お礼

お礼が遅くなって申し訳ありません。 色々参考にさせていただいて おぼろげながらCells とRangeの使い分け があることが分かりました。 本当にありがとうございました

ennkai
質問者

補足

御回答ありがとうございます 参考になります^^ 皆様はこのようなセルの場所を指定するときに、 A 変数宣言して指定する場合 と B 直接数式で指定する場合を どのように使い分けていらっしゃいますか? A・・・マクロ自体が見やすくなる B・・・細かく位置を指定できる 等など・・・

関連するQ&A

  • Excel 「For … Next」のやり方

    Excel画面のA1~A10を10~1の表示にさせるため、VBAを Sub ***() Worksheets("Sheet1").Activate Cells.Clear Dim i As Integer, n As Integer For i = 10 To 1 Step -1 Cells(i, 1).Value = i Next i End Sub としたのですが、実際に表示するとA1から1~10と1ずつ加算されてしまいます。 マイナス値は-1の表示で可能だといろいろ調べてわかったのですが、実際にやるとうまくいきません。 どこが間違っているのでしょうか? 学習不足ではありますが、よろしくお願いします。

  • 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 お力添えをお願いいたします。

  • For Next がうまくいきません。

    VBを勉強中の初心者です。 For i = 2 To 8 For n = 3 To m Cells(4, i) = Sheets("1").Cells(3, n) Next n Next i 上記のようにつくってはみましたが、うまくいきません。 Forのうえにはmを求める式が入っています。 自分がやりたいのは、 4,2 3,3  |  | 4,8 3,9 --------- 4,3 3,3  |  | 4,8 3,8 --------- 4,4 3,3  |  | 4,8 3,7 --------- 4,5 3,3  |  | 4,8 3,6 --------- 4,6 3,3  |  | 4,8 3,5 --------- 4,7 3,3 4,8 3,4 --------- 4,8 3,3 --------- 上記のようにしたかったのですが、 どうしてもうまくいきません。 どなたか宜しくお願します。

  • VBA Next For でのコピペについて

    EXCEL VBA初心者です。 AシートEW44からGD44までをコピーしてBというシートの最終行へコピーしたいです。 今下記のように組んでいるのですが、うまく作動しません。 Private Sub CommandButton1_Click() Dim i As Integer For i = 153 To 186 row1 = Worksheets("B").Cells(Rows.Count, 27).End(xlUp).Row Worksheets("A").Cells(i, 44).Value = Worksheets("B").Cells(row1 + 1, 27).Value Next i End Sub アドバイスいただけませんでしょうか。

  • VBA For~Next

    こんにちは 上手く 説明できるか心配なのですが 下記のテスト1ですと 36行毎に Targetが A4,A40,A76,A112だと A1,A437,A73,A109.Value = "" Then ComboBox3.DropDownさせてから ComboBox4.DropDownさせてますが A1,A437,A73,A109にValue が入っていると A4,A40,A76,A112のCellをActiveしても ComboBox4.DropDown しません。 そこで、テスト2のように For~Nextを二つに分けました。 テスト2の方法しか無いのでしょうか? 宜しくお願いします。 Dim Row As Long 'テスト1 For Row = 4 To 112 Step 36 If Not Intersect(Target, Cells(Row, "A")) Is Nothing Then '今日の日付DropDown If Cells(Row - 3, "A").Value = "" Then form.ComboBox3.DropDown ElseIf Not Intersect(Target, Range(Cells(Row, "A"), Cells(Row + 13, "A"))) Is Nothing Then 'A列日付 form.ComboBox4.DropDown End If Next Dim Row As Long, iRow As Long 'テスト2 For Row = 4 To 112 Step 36 If Not Intersect(Target, Cells(Row, "A")) Is Nothing Then '今日の日付DropDown If Cells(Row - 3, "A").Value = "" Then form.ComboBox3.DropDown End If Next For iRow = 4 To 112 Step 36 If Not Intersect(Target, Range(Cells(iRow, "A"), Cells(iRow + 13, "A"))) Is Nothing Then 'A列日付 form.ComboBox4.DropDown End If Next

  • マクロ 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

  • 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にお詳しい方、アドバイス宜しくお願い致します。

  • エクセルVBA For~Nextについての質問

     初めまして、よろしくお願いします。  最近VBAを見よう見まねで入力している超初心者です。 C1からC10までにA1+B1の計算結果を入力するVBAで Sub TEST()  Dim myCnt As Long   For myCnt = 1 To 10     Cells(myCnt, 3).Value = Cells(myCnt, 1).Value + Cells(myCnt, 2).Value   Next myCnt End Sub というVBAが有りますが、このA1からA10、B1からB10の間に未入力などが有ると計算の途中でエラーになってしまうようです。エラーにならない対策方法を教えていただきたく、よろしくお願いします。

  • For~Nextの使い方

    こんにちは Range("B19").Value = Application.WorksheetFunction.Sum(Range("B4:B17")) Range("B55").Value = Application.WorksheetFunction.Sum(Range("B40:B53")) Range("B91").Value = Application.WorksheetFunction.Sum(Range("B76:B89")) Range("B127").Value = Application.WorksheetFunction.Sum(Range("B112:B125")) 上記を参考書等で見ながらやって見たのですが 動作しません。 For~Nextの使い方を教えて下さい。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim x As Long, g As Long For x = 19 To 127 Step 36 For g = 4 To 112 Step 36 Cells(x, "B").Value = Application.WorksheetFunction.Sum(Cells(g, "B")) Exit For Next Next End Sub

  • セルに対してFor Each~In~Nextを使う

    セルに対してFor Each~In~Nextを使う事は出来ない? シートやブックに対してループする時は Sub aaa() Dim w As Worksheet For Each w In Worksheets MsgBox w.Name Next End Sub 等を使いますが、 A1に「あ」 A2に「い」 A3に「う」 が入っている場合、 Sub bbb() Dim i As Long For i = 1 To Range("a65536").End(xlUp).Row MsgBox Cells(i, 1) Next End Sub で、全ての値を取得できますが、 For~to~nextではなく セルに対してFor Each~In~Nextを使う方法があれば教えてください。 上記のように Dim w As Worksheetは宣言できますが Dim c As Workcellとはできませんでした。 なぜわざわざFor~to~nextでできる事をFor Each~In~Nextでやりたいかと言うと、 シートやブックはFor~to~nextでできるのに、セルはFor~to~nextができない理由を知りたいからです。 ご回答よろしくお願いします。

専門家に質問してみよう