- ベストアンサー
エクセルを使った計算方法と効率化
- エクセルを使った計算方法についてご質問です。B2の値をG2に代入し、B2から9行目にあたるE11の値をJ2に代入する方法、C2からC11の範囲内の最大値をH2に、D2からD11の範囲内の最小値をI2に代入する方法を教えてください。手計算では処理が遅く、10,000行以上あるため不可能です。
- エクセルを用いた計算方法についてのご質問です。具体的には、B2の値をG2に代入する方法、B2から9行目にあたるE11の値をJ2に代入する方法、C2からC11の範囲内の最大値をH2に、D2からD11の範囲内の最小値をI2に代入する方法を教えてください。手計算では時間がかかるため、効率的な方法を知りたいです。
- エクセルの計算方法に関する質問です。B2の値をG2に代入する方法と、B2から9行目にあたるE11の値をJ2に代入する方法、C2からC11の範囲内の最大値をH2に、D2からD11の範囲内の最小値をI2に代入する方法を教えてください。処理速度を考慮しているため、手計算ではなく効率的な方法を知りたいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは! 関数での方法はすでに出ていますので、 VBAでの一例です。 画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub Sample() 'この行から Dim i As Long, cnt As Long, myArea As Range Application.ScreenUpdating = False i = Cells(Rows.Count, "G").End(xlUp).Row If i > 2 Then Range(Cells(2, "G"), Cells(i, "J")).ClearContents End If cnt = 1 For i = 2 To Cells(Rows.Count, "B").End(xlUp).Row Step 10 cnt = cnt + 1 With Cells(cnt, "G") .Value = Cells(i, "B") .Offset(, 3) = Cells(i + 9, "E") End With Set myArea = Range(Cells(i, "C"), Cells(i + 9, "C")) With Cells(cnt, "H") .Value = WorksheetFunction.Max(myArea) .Offset(, 1) = WorksheetFunction.Min(myArea.Offset(, 1)) End With Next i Application.ScreenUpdating = True End Sub 'この行まで ※ 関数でないので、データ変更があってもすぐに反映されません。 その都度マクロを実行してみてください。m(_ _)m
その他の回答 (4)
[No.4]の一部訂正、 J2 の式を次のように訂正します。 誤 =OFFSET(E$2,10+(ROW(A1)-1)*10,0) ↓ 正 =OFFSET(E$2,9+(ROW(A1)-1)*10,0) または =OFFSET(E$2,9+(ROW(A1)-1)*10,)
お礼
ご丁寧な回答をお寄せいただきましたこと、厚くお礼申し上げます。 どうもありがとうございました。
G2: =OFFSET(B$2,(ROW(A1)-1)*10,) H2: =MAX(OFFSET(C$2,(ROW(A1)-1)*10,,10)) I2: =MIN(OFFSET(D$2,(ROW(A1)-1)*10,,10)) J2: =OFFSET(E$2,10+(ROW(A1)-1)*10,0)
お礼
ご回答いただきまして、どうもありがとうございました。 計算式の勉強に、とても役立つことができました。 この場をお借りし、厚くお礼申し上げます。
- KURUMITO
- ベストアンサー率42% (1835/4283)
G2セルには次の式を入力します。 =IF(INDEX(B:B,ROW(A1)*10-8)=0,"",INDEX(B:B,ROW(A1)*10-8)) H2セルには次の式を入力します。 =IF(G2="","",MAX(INDEX(C:C,ROW(A1)*10-8):INDEX(C:C,ROW(A1)*10+1))) I2セルには次の式を入力します。 =IF(G2="","",MIN(INDEX(D:D,ROW(A1)*10-8):INDEX(D:D,ROW(A1)*10+1))) J2セルには次の式を入力します。 =IF(G2="","",INDEX(E:E,ROW(A1)*10+1)) 10000行にも及ぶセルにコピーするためにはG2セルからJ2セルを選択してから右クリックして「コピー」を選択します。その後に数式バーに左側にある名前ボックスはG2が表示されていますがG2:G10000と入力しEnterキーをします。G列が選択状態になりますので右クリックして「貼り付け」を選択します。 最後にEscキーを押して終了です。
お礼
ご回答いただきまして、どうもありがとうございました。 特に、コピーの仕方はとてお勉強になりました。 この場をお借りし、厚くお礼申し上げます。
- kagakusuki
- ベストアンサー率51% (2610/5101)
まず、G2セルには次の関数を入力して下さい。 =IF(ISNUMBER(INDEX($B:$B,(ROW()-ROW(G$2))*10+1+ROW($B$1))),INDEX($B:$B,(ROW()-ROW(G$2))*10+1+ROW($B$1)),"") 次に、H2セルには次の関数を入力して下さい。 =IF(ISNUMBER(INDEX($G:$G,ROW())),MIN(INDEX($C:$C,(ROW()-ROW(H$2))*10+1+ROW($C$1)):INDEX($C:$C,ROWS(H$2:H2)*10+ROW($C$1))),"") 次に、I2セルには次の関数を入力して下さい。 =IF(ISNUMBER(INDEX($G:$G,ROW())),MAX(INDEX($D:$D,(ROW()-ROW(I$2))*10+1+ROW($D$1)):INDEX($D:$D,ROWS(I$2:I2)*10+ROW($D$1))),"") 次に、J2セルには次の関数を入力して下さい。 =IF(ISNUMBER(INDEX($G:$G,ROW())),LOOKUP(9E+307,$E$1:INDEX($E:$E,ROWS(J$2:J2)*10+ROW(E$1))),"") そして、G2~J2の範囲をコピーして、同じ列の3行目以下に貼り付けて下さい。 以上です。
お礼
ご回答いただきまして、どうもありがとうございました。 また、画像をも載せていただきまして、感謝の極みでございます。 厚くお礼申し上げます。
お礼
ご回答いただきまして、どうもありがとうございました。 マクロでの記載方法はとても参考になりました。 また、他の時間足にも容易に応用可能なことも、非常に助かりました。 この場をお借りし、厚くお礼申し上げます。
補足
誠に申し訳ございません。勝手ながらこの欄をお借りする非礼をお許しください。 皆様のご回答、とても勉強になりました。 全員にベストアンサーと致したく、そう思っている次第でございます。ただ、規約で1名のみということで、非常に悩みました。 ただ、他の時間足にも容易に応用が可能という点におきまして、tom04様にベストアンサーと致しました。 皆様、本当に、ありがとうございました。