• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:[エクセル]処理結果を残して次の処理をさせるには?)

[エクセル]処理結果を残して次の処理をさせるには?

このQ&Aのポイント
  • AシートのB~G列の各セルには数値が入っており、数百行あります。Bシートには、データ処理させる作業用のシートとなっており、6つの数字を入力するセルに数値を入力する事で結果が算出されます。Aシートには数百行もあるため、一気に処理できる方法はないか考えています。
  • AシートのI列の各行に、Bシートでの処理結果をまとめて算出させる方法はないでしょうか?例えば、AシートのB~G列の各行に数値が入力されているとします。Bシートでは、各行の数字を足す処理をさせるとします。一気にAシートにBシートでの処理結果を表示させたいと思っています。
  • 効率的な方法としては、AシートのB~G列の数値を一括してBシートにコピーし、Bシートでの処理を行った後、Bシートの結果をAシートのI列に一括して反映させる方法です。これにより、処理の手間を大幅に削減できます。

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

  • ベストアンサー
  • jo-zen
  • ベストアンサー率42% (848/1995)
回答No.4

値を貼り付ける方法ではなく、Worksheetsプロパティを使えばBシートを表示させることなく、Aシートのみを表示したまま同様の処理が可能です。以下のようになります。 Sub kaiseki() For i = 0 To 9 Sheets("Aシート").Select If Range("B3").Offset(i, 0).Value = Empty Then GoTo Skip Worksheets("Bシート").Range("B11:G11").Value = Worksheets("Aシート").Range("B3:G3").Offset(i, 0).Value Worksheets("Bシート").Calculate Sheets("Aシート").Range("J3:O3").Offset(i, 0).Value = Worksheets("Bシート").Range("B15:G15").Value   '※元のマクロの19行まで   '※中略(ここの部分の処理も上を参考にすれば可能です) Skip: Next i End Sub 参考にしてください。

Cuty_Cat
質問者

お礼

jo-zen 様、お世話になっております。 先ほどまで、ずっとネットで検索して試行錯誤しておりました。 アドバイスして頂いたような記述は、思い付きませんでした。 記述して頂いた内容を見れば、「なるほど!」と思うのですが、自分では到底無理でした(-_-; 早速参考にさせて頂きました。 記述内容もスマートになり、実際に実行してみると処理速度も格段に早くなりました。 当初、思っていた通りの事が100%達成できて、とても満足しています。 jo-zen様のアドバイスがあってこそ、実現できたと思います。 自力では何もしておらず、全部jo-zen様からのアドバイスに頼ってしまう事になり大変恐縮しております。 的確なアドバイスをありがとうございました。 また何かあれば質問させて頂こうと思います。

その他の回答 (3)

  • jo-zen
  • ベストアンサー率42% (848/1995)
回答No.3

#1です。思いっきり#2の投稿だとエラーが発生してしまいますね。 ちょっと修正してみました。あとiは0~1000じゃなくて、この場合は0~999ですね。多分以下のようでだいじょうぶかと? Sub kaiseki() For i = 0 To 1000 Sheets("Aシート").Select If Range("B3").Offset(i, 0).Value = Empty Then GoTo Skip Range("B3:G3").Offset(i, 0).Select Selection.Copy Sheets("Bシート").Select Range("B11").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = False ActiveWorkbook.PrecisionAsDisplayed = False ActiveSheet.Calculate Range("B15:G15").Select Selection.Copy Sheets("Aシート").Select Range("J3").Offset(i, 0).Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("Bシート").Select Range("B16:G16").Select Application.CutCopyMode = False Selection.Copy Sheets("Aシート").Select Range("P3").Offset(i, 0).Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Range("J4").Select Skip: Next i End Sub

Cuty_Cat
質問者

お礼

jo-zen 様、ご回答ありがとうございます。 教えて頂いた方法で、一気に処理させる事ができるようになりました。 まさに思っていた通りの処理内容となり、とても嬉しく思います。 まず「For i = 0 To 10」で試してみたのですが、1つ気になる点がありました。 それは、処理専用のBシートを表示させる必要がないかなと。 Aシート→Bシート→Aシート→Bシートと順番に表示されます。 Bシートを表示させないまま、Aシートに処理結果だけが書き込まれていくようにする事はできるでしょうか? 「Sheets("Bシート").Range("B11").Select」としてみましたが、案の定ダメでした(-_-; Bシートを表示させないまま、処理させる事はできるのでしょうか? アドバイスをお願い致します。 自分でも調べてみますが、もし自己解決できた場合は、「補足」の方でお知らせしたいと思います。 一応、40分ほど調べてみているのですが、まだ解決できていません(-_-;;

  • jo-zen
  • ベストアンサー率42% (848/1995)
回答No.2

VBAは勉強したことがないとのことで、説明しづらいのですが、要は1行ずつずれるようループ処理をおこなえばよいのですから、 (1)For~nextで全体をはさみ (2)カウンター値、例えば i を 0 ~ 1000 で1ずつ増やして処理 (3)それに役立つのが offsetプロパティ という流れになります。 具体的には、 Sub kaiseki() For i = 0 to 1000 Sheets("Aシート").Select If range("B3").Offset(i, 0).value = " " Then next i Endif Range("B3:G3").Offset(i, 9).Select Selection.Copy Sheets("Bシート").Select Range("B11").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = False ActiveWorkbook.PrecisionAsDisplayed = False ActiveSheet.Calculate Range("B15:G15").Select Selection.Copy Sheets("Aシート").Select Range("J3").offset(i, 0).Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("Bシート").Select Range("B16:G16").Select Application.CutCopyMode = False Selection.Copy Sheets("Aシート").Select Range("P3").offset(i, 0).Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Range("J4").Select next i End Sub という感じですか。最後から3行目の式は多分不要ですが。詳しく解説する時間がありませんが、なんとか読み取ってもらえればと思います。なお、Aシートに途中に空白行がある場合はそれをスキップする必要がありますが、それが4・5行目です。 検証してないのでエラーになる可能性ありますが、その場合はゴメンなさい。

  • jo-zen
  • ベストアンサー率42% (848/1995)
回答No.1

マクロを使ってやるしかないと思います。 AシートのA列は通しNo.になっていれば、比較的簡単にマクロが記述できると思いますが。まず起点となる行で「ツール」→「マクロ」→「新しいマクロの記録」とし、とりあえずB列~G列のデータをBシートのそれぞれ対応するセルにコピー、その結果をAシートの該当セルに貼り付けるで、一旦記録終了し、あとはそのマクロの修正で連続処理できるように改良を加えるといいと思います。その際、offsetプロパティを使えば起点から下に連続して処理ができるかと思います。 実際のシートがどんなものかわからないので、ひょっとして的外れだったらゴメンなさい。

Cuty_Cat
質問者

お礼

ご回答ありがとうございます。 行いたい事は、まさにその通りです。 早速アドバイスをして頂いたように、マクロで記録してみました。 <行った作業> 【1】AシートのB3:G3をコピーして、BシートのB11を選択して値のみをペースト(B11:G11に値が入った状態になります)。 【2】Bシートのみをシート再計算。 【3】BシートのB15:G15に表示された結果をコピーして、AシートのJ3を選択して値のみペースト(J3:O3に値が入った状態になります)。 【4】BシートのB16:G16に表示された結果をコピーして、AシートのP3を選択して値のみペースト(P3:U3に値が入った状態になります)。 以上が、1回の処理の内容となります。 記録されたVBAの内容は、文字数の関係からこちらに記載する事ができなかったので、「補足」の方へ別途記載致します。 ------------- ※「補足」のVBAをご覧になった後に以下を読んで下さい Aシートには「B3:G3」から「B1002:G1002」までに、元となるデータが入っています。(空白行もあり)「B3:G3」→「B4:G4」→「B4:G4」→…と、1回の処理が終わったら1行ずれてからまた同様の処理を連続して「B1002:G1002」まで行いたいと思っています。 同様に処理結果も「B3:G3」の処理結果は「B3:G3」と「P3:U3」に、「B4:G4」の処理結果を「B4:G4」と「P4:U4」などと言った具合に処理結果の記録もしたいです。 1行ずつずれるように、ループ処理させれば良いと思っているのですが、VBAは勉強がした事がないので、どのように記述したら良いのか分かりません。 お手数をおかけしますが、アドバイスを頂けると助かります。 よろしく御願い致します。

Cuty_Cat
質問者

補足

Sub kaiseki() Sheets("Aシート").Select Range("B3:G3").Select Selection.Copy Sheets("Bシート").Select Range("B11").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = False ActiveWorkbook.PrecisionAsDisplayed = False ActiveSheet.Calculate Range("B15:G15").Select Selection.Copy Sheets("Aシート").Select Range("J3").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("Bシート").Select Range("B16:G16").Select Application.CutCopyMode = False Selection.Copy Sheets("Aシート").Select Range("P3").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Range("J4").Select End Sub