• ベストアンサー

エクセル2010 繰り返しマクロ

(1)g列の空白の最上行に =SUMPRODUCT(min((a:a>=f2)*(a:a<f2+730)*e:e)) と入力。 そのセルをコピーし、同じセルに値を上書き貼り付け ↓ (2)a列に(1)のセルの左隣のセル以下の数値がある行の、b列を削除 (画像の場合、(1)のセルがg1の場合、b2,b3を削除する) というのを、f列に数値がある行だけ繰り返すマクロの構文を教えてください。 大変お手数おかけいたしますが、どうぞよろしくお願いします。

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

  • ベストアンサー
  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.2

根本的な疑問ですが・・ マクロを作ったことはありますか? 補足下さいませ。 おそらく「ほとんど(あるいは全く)無い」のでしょうけど。 繰り返しはともかく、(1)(2)はマクロ入門編だと思いますので。 さて、あなたが「マクロを作ったことがある」と言う前提で本題。 質問文の内容をそのまま拾い、順に紹介していきます。 > g列の空白の最上行に G列に値が入力されている「最終行」を探す と置き換えて、     Cells(Cells(Rows.Count, 7).End(xlUp).Row, 7).Select これで最終行を選択できます。 G列に何らかの値が入力されているセルが存在し、その一行下を、なのであれば     Cells(Cells(Rows.Count, 7).End(xlUp).Row, 7).Offset(1, 0).Select これで対応可能です。 G列に何も入力されておらず、G1セルを対象にしたいのであれば、 Ifを使って条件を分岐してやると上手くいくでしょう。 > =SUMPRODUCT(min((a:a>=f2)*(a:a<f2+730)*e:e)) と入力     Selection.FormulaR1C1 = "=SUMPRODUCT(MIN((C[-6]>=RC[-1])*(C[-6]<RC[-1]+730)*C[-2]))" これで式は入力できますね。 ただしこれは「G1」セルにご提示の式を入力する場合に限ります。 > そのセルをコピーし、同じセルに値を上書き貼り付け これも細かい解説は不要と思われます。     Selection.Copy     Selection.PasteSpecial Paste:=xlValues これで出来ます。 が、わざわざコピー貼り付けせずに、式の値を直接入力してやったほうが速いですね。 > (2)a列に(1)のセルの左隣のセル以下の数値がある行の、b列を削除 これは「A列・F列がそれぞれ昇順で並んでいる」条件を満たしているなら Do~Loopを使って解決するのがベストかと。     A = 1     Do While Cells(A, 1) <= Selection.Offset(0, -1)         Cells(A, 1).ClearContents         A = A + 1     Loop こんな調子で。 「削除」とありますが、「消去」の間違いでしょうと判断しています。 G列の処理を終えてから一気に消去してやるほうが速いとは思います。 1000行単位の対象をDo~Loopで行うと若干イライラできますし。 > f列に数値がある行だけ繰り返す これもDo~Loopで解決できますので割愛します。 For~Nextを使って、G列の最終行からF列の最終行までを繰り返す方が スッキリと書けるかもしれません(最終行の取り方は上述参照)。 が、そもそも繰り返す必要があるのかどうかも疑問が残ります。 G列の最終行+1からF列の最終行まで一気に式を入力してやるほうが速いです。 1000行単位の(以下同文につき省略)。 以上を参考に、作成なさって下さい。 補記) 補足・追加質問に答えるつもりはありませんが、 「なお出来ない」と言う場合は「ご自身が書いたコード」を提示し、 「どこでどのように」思った処理にならないかを明確になさると良いですよ。

39ioed1qiau8z90
質問者

お礼

どうもありがとうございます。参考になりました。

その他の回答 (1)

回答No.1

考える動機が欲しいので、ナニをジツゲンしたいのか?、コトバで書いてみてくれ!

39ioed1qiau8z90
質問者

補足

1日ごとの最大ドローダウンを算出したいんです。 (1)または(2)または繰り返しの部分の構文だけを教えて下さっても大変ありがたいです。 どうぞよろしくお願いします。

関連するQ&A