Excel VBAで繰り返し計算を行い、指定したデータを出力する方法

このQ&Aのポイント
  • ExcelのVBA機能を利用して、繰り返し計算を行い指定したデータの出力を行いたい。現在は手作業でデータをコピー&ペーストしているため、時間がかかっている。
  • 繰り返し計算には初期条件値y0セルと、初期条件からhステップした値y0+hセルが使用される。hステップごとに計算値を初期条件のセルにコピー&ペーストし、計算結果が出力される。
  • 指定したデータy0+n*hを得るための計算回数nが多く、手作業でデータをシート2にコピー&ペーストする作業が時間を要している。VBAを利用して、計算中にステップデータを出力する方法を教えてほしい。
回答を見る
  • ベストアンサー

欲しいデータのみ出力する

エクセルのVBA機能を使って繰り返し計算を行っています。 シート1には、初期条件値y0セルと、初期条件からhステップした値y0+hセル(計算式入れてます)があります。 hステップした値y0+hを初期条件のセルにコピー&ペーストすることで、y0+hからhステップした値y0+2*hの結果が出力されます。 上記の繰り返し作業を行うことで、指定したデータy0+n*hを得ています。 VBAのコードです↓(処理速度を早くするため画面描写OFFのコードも書いています。) Sub ファイル名1() Dim rngCell As Range Dim lngNum As Long Dim i As Long Application.ScreenUpdating = False Debug.Print "start=" & Time ingnum = 1 For i = 1 To 指定したデータy0+n*hを得るための計算回数n Range("初期条件からhステップした値y0+hのセル").Copy Range("初期条件セル").PasteSpecial (xlPasteValues) Range("T(yi)+h").Value = Range("T(yi)").Value + Range("h").Value Next i Debug.Print "end =" & Time Application.ScreenUpdating = Time End Sub 計算後は、下図のように、シート1で出力された指定データをコピーし、シート2にペーストしてまとめています。(手作業です。) y0+n1*h , y0+n2*h , y0+n3*h , ・・・ 以上のような作業で計算を行っていますが、指定したデータy0+n*hを得るための計算回数nが多く、出力したデータでグラフを作成するためシート2のように間のデータも必要になってきます。 指定データをシート2にコピー&ペーストする作業は手作業であり、まとめデータの作成に時間が掛かっています。 そこで、計算中にそれぞれのステップデータを出力しつつ最後のステップデータまで計算し出力できるようにしたい(手作業部分をVBAで書きたい)のですがどのようにすれば良いのでしょうか。 回答お願い致します。

  • cstag
  • お礼率77% (14/18)

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

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

補足 (蛇足、無駄足かも) 250の整数倍の時にデータを取り出すのでしたら If i >= 250 And i Mod 250 = 0 Then 計算結果をシート2にコピーするコード End If というコードをループの最後に付け加えるということも考えられます。

cstag
質問者

お礼

別のコードも教えていただきありがとうございます。 コードがシンプルなので条件が変更しやすく使いやすいです。

その他の回答 (2)

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

Range("T(yi)+h").Valueに最終データがはいっているのではないのでしょうか。T(yi)+hはセル番地が入っている変数と考えていいわけですよね…。 具体的にセル番地と数値を示していただければわかりやすいのですが…たとえばループが3回だとどこのセルに何が入るとかは分かると思います。 シート1のy0+hセル(y0+hはセル番地を表す変数と考えれば)ということは、データの出力されるセルは毎回違うという感じなのですが、ただ文面からすると同一のセルに計算結果が出力されて、それをループの250回目、500回目…の時にシート2のどこかのセルに書き出したいとも思えます 頭が悪くてすみません(笑) 同一のセルなら ループの最後に Select Case i Case 250 Sheets("シート2").Range(シート1で算出したy0+250*hを貼り付けたい場所(セル)).Value = Range(計算結果の出力されているセル).Value Case 500 Sheets("シート2").Range(シート1で算出したy0+500*hを貼り付けたい場所(セル)).Value = Range(計算結果の出力されているセル).Value End Select とかしておけばいいと思われますが 複数のセルに出力されるのでしたら、範囲指定でコピー貼り付けのコードが必要ですね。 Select Case i Case 250 Range(Cells(row1, Column1), Cells(row2, Column2)).Copy Sheets("シート2").Range(貼り付けたい範囲の一番左上のセル).PasteSpecial 中略 End Select

cstag
質問者

お礼

詳細な返答ありがとうございます。 教えていただいたコードを記述することで、自動的にシート1の計算結果をシート2にコピーすることが出来ました。

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

シート2のどのセルのコピーしてるのか分からないのでxとしますが ループの最後に Sheets("シート2").Range(x).Value = Range("T(yi)+h").Value と入れておけばいいのではないでしょうか

cstag
質問者

お礼

早速の回答ありがとうございます。 私の説明が良くなかったのですが。。。 シート1のy0+hセルに、計算結果が出力されるようになっています。 For i = 1 To 指定したデータy0+n*hを得るための計算回数n で、n回コピー&ペーストを繰り返しn時間後の値y0+n*hを得ます。そして、シート1にある計算結果(y0+n*h)をコピーしてシート2に貼り付けます。 シート2はシート1のy0+n*hの結果を貼り付けただけのシートになります。 シート2に貼り付ける作業は手作業であるため、例えば、シート1で1000回計算する中で、250回計算した時の結果y0+250*h、500回計算した時の結果y0+500*hをシート2に貼り付けていき、最終的に1000回計算した結果y0+1000*hも、手作業なしでシート2に貼り付けたいと考えています。 回答頂きました Sheets("シート2").Range(x).Value = Range("T(yi)+h").Value で、1000回計算する途中で、250回計算した時の結果をシート2に貼り付けたい場合、 Sheets("シート2").Range(シート1で算出したy0+250*hを貼り付けたい場所(セル)).Value = Range("250").Value として試してみたのですがうまくできませんでした。 せっかく回答を頂いたのですが、どのように記述すれば良いのでしょうか。 よろしくお願い致します。

関連するQ&A

  • エクセルのPrivate Sub Worksheet_Change

    エクセルのPrivate Sub Worksheet_Change すいません。どうやっても動作しません。 シート1のB5のセルに英数字を入力しエンターを押して確定すると シート2のC列から同レコードを検出し、その検出された行のB~E列の値を シート1のH4、H5、H6、J7に値をかえします。 またB5の値はH8にも表示されます。 データがあった場合には、シート1のH4、H5、H6、J7に値が表示されています。 シート2にデータが無い場合はシート1のH4、H5、H6、J7には「#N/A」と表示されます。 ここまでは関数と計算式なのでマクロではありません。 ここでフォームで作成した「印刷ボタン」をクリックします。 すると「印刷ボタン」に登録したマクロが起動します。 シート1のセルG4~J11までが印刷されます。 マクロの内容は シート1のH4に「#N/A」が表示されている場合はメッセージボックスで 「データがありません」と出ます。印刷は実行されません。 H4が「#N/A」以外の場合は印刷が実行されますがその前に シート3のセルA1の数値をプラス1してシート3のB2に、セルA1の値の先頭にAを付けて 表示します。(セルA1が0002ならB1はA0002) それがシート1のH12に表示されます。(H12への表示は計算式で対応) 印刷ボタンを押すごとにシート3のセルA1は1づつ繰り上がります。 シート1のH12の値が変わってから印刷がされます。 と同時に シート1のセルB5がDELETEされセルB5がアクティブになります。 結果シート1のH4、H5、H6、J7、H8は「#N/A」が表示されます。 H12はクリアされません。 印刷終了後にもセルの値が変化する事になります。 もう一つフォームで作成した「初期化」というボタンがあります。 これをクリックするとマクロが起動して シート1のセルB5がDELETEされセルB5がアクティブになります。 よってシート1のセルH4、H5、H6、J7、H8も「#N/A」に値が変わります。 ここまでは完璧に動作しています。 でこの「印刷ボタン」を押してマクロが起動ではなく セルB5に入力しエンターを押したらマクロを起動させたいです。 Private Sub Worksheet_Change(ByVal Target As Range) を利用しましたが動作しません。 シート1のB5のセルに入力しエンターを押すと シート1の一部のセルの値が変化。 印刷ボタンを押すと、シート3の一部のセルの値が変化し その後再びシート1のセルの一部が変化し印刷が開始され その後シート1のセルB5がDELETEされアクティブに。 それに伴いシート1の一部のセルの値が変化する。 マクロが起動すると、シート1とシート3のセルの値が数回変化します。 このような場合はPrivate Sub Worksheet_Change(ByVal Target As Range)で セルB5の入力後エンターで確定しての上記のマクロ起動は無理なのでしょうか?

  • エクセルでK列の最終行のセル値を指定のセルに・・・

    いつもお世話になっております。 5月に下記のコードを教えてもらい、簡単な改良や条件を追加しながら複数のシートに展開中なのですが新しいパターンが出たのでHELPです。 K列の最終行の値を同じ表のH6のセルに転記してそれを使って出た計算結果(セルH7)の値をH列の最終行のセルに転記したいのですが。 (具体的な列とセルはシートで変わる可能性があります) 下記のコードは別のシート(計算表)の特定(結果)のセルの値を指定した列に転記するコードでこれで何とかしようとしましたが歯が立たず。 なにとぞよろしくお願いいたします。 Option Explicit Sub Sample3()   Dim MyRange As Range  With ThisWorkbook   Set MyRange = _    .Sheets("入力表").Cells(Rows.Count, 5).End(xlUp)   MyRange.Offset(1, 0).Value = .Sheets("計算表").Range("J15").Value   MyRange.Offset(1, 1).Value = .Sheets("計算表").Range("J20").Value  End With End Sub

  • エクセル グラフ データ系列入力で数式設定

    エクセルのグラフ散布図作成で、データの選択を通常は数値入力、もしくはセル指定をしますが、数値とセル指定の混合、MAX関数などの数式を入れると入力エラーになってしまいます。入力の仕方に問題があるのでしょうか?もしくはこのような入力は出来ないのでしょうか? 例えば、データの選択で(1)と(2)のようにすると入力エラーになってしまいます。 (1)ある範囲のMAX値のデータをプロットさせたい 系列Xの値 1,9 系列Yの値 1,max(Sheet1!$C$16:$C$25) (2)一つの値だけセル指定 系列Xの値 1,9 系列Yの値 1,Sheet1!$C$18 すみませんが、どなたかよろしくお願いします。

  • FORTRANでファイルへの出力

    FORTRAN77で,以下のような出力をしたいのですが,どうしたらいいかわかりません.何かいい案があれば,教えてください. 繰り返し処理の途中で計算を止めても,何ステップまで計算したかを第一行目に出力したいです. ex.)繰返し終値が1000として,456ステップで計算を止めたとき, ----------出力ファイル-------------- 456ステップまで計算されています. (↑何ステップまで計算されたかを   第一行に記入したいです.) step 1,データ step 2,データ : : step 456,データ ----(簡単ですが)考えてたプログラム------- OPEN(10,○) WRITE(10,○)  ←ここを悩んでいます. DO I=1,1000 WRITE(10,○)'step',I,データ CONTINUE

  • excel VBA で条件の設定方を教えて下さい。

    今、斜線を引きその斜線データの最初のセルに数値で(1とか3とかの数値の)条件をつけて置き、その条件で、太さ、色等を変えて斜線を引きたいのですがうまくいきません。何方か教えて頂けませんか。 --------------------- dim myrange as range workheets("補助計算").range("c8:c47").value = worksheets("時刻").range("c8:c47").value workheets("補助計算").range("g8:h47").value = worksheets("時刻").range("g8:h47").value with worksheets("時刻")     v=worksheets("時刻").range("m2").value+12'描画本数     for i = 12 to v step 1'設定可能本数50本 set myrage = worksheets("補助計算").range("t3:t47") myrange.value = .range(.cells(3,i),.cells(48,i)).value for cnt = 75 to 113 step 2 e = worksheets("ダイヤ").cells(cnt,10).value       f = worksheets("ダイヤ").cells(cnt,11).value       g = worksheets("ダイヤ").cells(cnt+1,10).value       h = worksheets("ダイヤ").cells(cnt+1,11).value with worksheets("ダイヤ").shapes.addline(e,f,g,h) .line.weight = 1.1 .line.forecolor.rgb = vbblue end with next cnt next i end with ----------------------- 上記コードで、斜線が何本か引かれます、その際、データ元のセルに数値の条件、例えば、1 とか3とかの数値を入力されているときは、それによって、斜線の色、又は線の太さをかえたいのですが、指定の仕方は、時刻シートの時刻の上欄セルに、線の指定のセル、太さ指定のセルに別々に指定おき、それを参照して、線の色、太さをかえたいのですが、いろいろ試みましたがうまくいきません。上記コードにどのように追加コードをすればよいか何方か教えていただけませんか。できれば、線の色は3色以上設定できればありがたいです。、

  • VB2008 Excelにデータ出力

    VB2008で、Timerで更新されるTextBoxの数値をExcelに順次出力する(セルA1に出力したら、次の値をA2に出力、・・・)プログラムを作りたいのですが、どんなソースにすればよいか分かりません。 Web検索もしましたが、キーワードが悪かったのか、適したサンプルも見つかりませんでした。 VB Form上のTimerでTextBoxの数値を更新する部分はできていますので、指定のフォルダ内のExcelを開いてデータをセルに出力する方法を教えてください。 参考URLなどもあれば教えてください

  • エクセルマクロ:範囲の選択

    マクロで範囲を指定したいのですが、 dataと名づけたシートA1に例えば8という値、A2に20という値があります。 この数字は他のセルから参照する計算式になっていて再計算をするたびに変わります。 この時、C8:E20の範囲を指定したいのですが、やみくもに Dim c As Integer c = 3 'C列 Range(Cells(Sheets("data").Range("A1").Value, c), Cells(Sheets("data").Range("A2").Value, c + 2)).Select Selection.Copy などと書いてみたのですが、うまくいきません。 どのように記述すればよいか、教えてください、宜しくお願いいたします。

  • シート2から1行単位でシート1の指定セルに代入し印刷データがある行まで

    シート2から1行単位でシート1の指定セルに代入し印刷データがある行まで繰返すマクロ (QNo.6233212の仕様追加質問です。) シート1に印刷用の雛形、シート2にデーターシートがあります。 (データーがある行数は都度変更) シート2のデータから指定したセルの値を シート1の指定したセルに順次代入したいです。 シート2の2行目の指定したセルの値を シート1の指定したセルに代入してシート1を1枚印刷。 その後シート2の3行目の指定したセルの値を シート1の指定したセルに代入してシート1を1枚印刷。 これをシート2のデータがある分繰返。 シート2のデータがなくなったら 「印刷終了」と出て印刷停止。 というのをシート1に作成したボタン一つで行いたく QNo.6233212で教えていただいた記述で成功しました。 この後仕様変更で、 シート1に代入し印刷前にシート2から代入された値を Left関数等で編集を行いそれをシート1の別指定セルに代入 シート2→シート1 A2→B4 J2→D21 G2→G18 C2→C2 ↓追加 シート1のB4に代入された値の左から4文字目以降をセルA1へ シート1のG18に代入された値の左から2文字から6文字目までをセルA2へ 以下の用にしましたができません。 ↓ Worksheets("Sheet1").Range("A1").Value = Left(D21,4) Worksheets("Sheet1").Range("A2).Value = Mid(G18,2,5) ここはマクロでなくシート1のA1,A2に式を入れる方がいいのでしょうか? (代入された値をSelect Caseでさらに変更も予想有) Sub 印刷02() 'シート2の1行目の指定したセルのデータをシート1の '指定したセルに転記を行いシート1が印刷される。 '印刷後はシート2の2行目の指定したセルのデータを 'シート1の指定したセルに転記してシート1が印刷される。 'シート2にデータが無くなったら停止する。 '↓【データ変更時変更場所】 'データ数に合わせてToの右の数字を変える事 Dim myRng(1 To 4) '変数宣言 Dim cpRng '貼付位置をcpRngとする Dim i As Integer With Sheets("Sheet2") '↓【データ変更時変更場所】 'データの位置の変化や増減はここを変更する Set myRng(1) = .Range("A2") 'データ位置設定 Set myRng(2) = .Range("J2") 'データ位置設定 Set myRng(3) = .Range("G2") 'データ位置設定 Set myRng(4) = .Range("C2") 'データ位置設定 End With '↓【データ変更時変更場所】データ数の増減でここを変更 '↓【転記位置変更時変更場所】 'データの転記先だけが変更時もここを変更 cpRng = Split("B4,D21,G18,B15", ",") '転記先セル番地を配列に格納 With Sheets("Sheet1") Do While myRng(1) <> "" 'A列のデータ位置が空白でなければ '↓【データ変更時変更場所】 'データ数に合わせてToの右の数字を変える事 For i = 1 To 4 'データの数だけ繰り返す .Range(cpRng(i - 1)).Value = myRng(i).Value 'セルデータ転記 '【追加した記述】代入された値をさらに編集して別セルへ Worksheets("Sheet1").Range("A1").Value = Left(D21,4) Worksheets("Sheet1").Range("A2").Value = Mid(G18,2,5) Next .PrintOut '印刷 '↓【データ変更時変更場所】 'データ数に合わせてToの右の数字を変える事 For i = 1 To 4 Set myRng(i) = myRng(i).Offset(1) 'データ位置を1行下に設定 Next i Loop '繰り返し '↓【データ変更時変更場所】データ数の増減でここを変更 '↓【転記位置変更時変更場所】 'データの転記先だけが変更時もここを変更 .Range("B4,D21,G18,B15").ClearContents 'クリア End With '↓【データ変更時変更場所】 'データ数に合わせてToの右の数字を変える事 For i = 1 To 4 Set myRng(i) = Nothing '後処理 Next MsgBox "印刷終了" End Sub

  • vbaでfor nextの計算

    vbaでfor nextを使って計算しています。 excelのシートの値を使って計算しています。 for nextが3重になっていて中のyとxのfor next が計算し終わったらjのfor nextで次のセルを参照したいのですがうまくいきません。 どうしたらいいか教えてください。 コードは以下の通りです For j = 1 To 2 Step 1 For y = 3 To 90 Step 3 γ = y / 180 * π For x = -180 To 180 Step 6 α = x / 180 * π γs = Range("A:A").Rows(j).Value / 180 * π αs = Range("B:B").Rows(j).Value / 180 * π Eeg = Range("C:C").Rows(j).Value Eed = Range("D:D").Rows(j).Value 計算式(省略) Next x Next y Next j

  • エクセル2003 条件抽出したデータを切り取り別シートへ貼り付け

    シート1にあるデータから3個のキーワードで抽出したデータを切り取り、シート2に貼り付ける方法を教えてください。  今までは抽出する条件のキーワードが2個以下だったので、オートフィルタのオプションで抽出したデータをコピーしてシート2に貼り付け、シート1で可視セルを選択して削除という方法をとっていました。  今回、条件にするキーワードが3個になったので、フィルタオプションの設定で、シート2のA1からA4にキーワードを入れて、検索条件範囲を指定してデータを抽出したので、今までの方法が使えなくなってしまいました。 参考までに、↓こんな感じです。 Sheets("Sheet2").Select Range("A1") = "条件" Range("A2") = "キーワード1" Range("A3") = "キーワード2" Range("A4") = "キーワード3" Sheets("Sheet1").Cells.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _ Range("A1:A4"), CopyToRange:=Range("A6"), Unique:=False

専門家に質問してみよう