- ベストアンサー
ひとつ飛びの合計の数式を記述するマクロ
(エクセルのマクロにて) セルB1からB6を選択しているとします。 ひとつ飛びの合計を求める式=B2+B4+B6をマクロで作成し、A1セルに記述するマクロはどうすれば実現できるのでしょうか? もちろんC2からC10を選択している時は、=C3+C5+C7+C9 という式をA1セルに記述するものとします。 お手数ですが、お分かりの方お教えください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
例えば、 Sub sum_sel() Dim r As Range Dim i As Integer Range("A1").Formula = "=" For Each r In Selection If (i Mod 2) = 1 Then Range("A1").Formula = Range("A1").Formula & "+" & r.Address End If i = i + 1 Next End Sub とか。 式の頭に+が入るし、絶対アドレスになりますが。
その他の回答 (5)
- watabe007
- ベストアンサー率62% (476/760)
>=C3+C5+C7+C9 という式をA1セルに記述 Sub Test() Dim i As Long, strAdd As String With Selection For i = 2 To Selection.Count Step 2 strAdd = strAdd & .Item(i).Address(0, 0) & "+" Next End With Range("A1").Formula = "=" & Left(strAdd, Len(strAdd) - 1) End Sub
お礼
回答ありがとうございます。
- imogasi
- ベストアンサー率27% (4737/17069)
1つとびの行のセルを足すのは (1)ForNext ループでStep 2を使う (2)行番号が偶数行か奇数行を判別してどちらか行だけを足す (3)ループの中で、ある変数に毎回-1を掛けて、正かどうか判別して、正の時だけ足す などのロジックがある。 しかしこの質問のあいまいなことは、 (1)指定列の伝え方 (2)スタート行の伝え方 を、一般的にするのか、具体的に2セルなど使って指定するのか、どうするかが書いてない。その点を考えられていないようだ。したがって質問の疑問点の真意が伝わらない。また結果をどのセルに出すかも。 この点の方がVBAの学習的には難しいと思う。 エクセルの関数のように具体的にセル範囲を指定する方式なら、加えるべき範囲ははっきりする。 「Excel関数 偶数行を足す」で照会する。 https://okwave.jp/answer/new?qid=9371541ほか Selectionで指定した場合の回答がすでに出ているが、複雑になり、うまく行くのかな。 コードをそのつど書き換えるなら Step2利用方式で Sub Macro2() lr = Range("A10000").End(xlUp).Row ’A列と仮定 s = 0 For i = 2 To lr Step 2 '第2行からスタート s = s + Cells(i, 1) ’A列と仮定 Next i Range("a1") = s End Sub (3)のロジックで Sub Macro3() lr = Range("A10000").End(xlUp).Row s = 0 sn = -1 For i = 2 To lr sn = sn * -1 If sn > 0 Then s = s + Cells(i, 1) End If Next i Range("a1") = s End Sub
お礼
回答ありがとうございます。 No1さんの回答を期待していました。
- ubku
- ベストアンサー率37% (227/608)
Excelの仕様上、数式が8,192 文字を越えるとエラーになります。 また、Excelの行を扱う変数は Dim i As Long としておくほうが無難です。Integer型は32767行を越えるとエラーになります。 選択範囲を対象にしたマクロは、便利なようで、実際には使いづらいです。マクロは実行した途端に「元に戻す」ことができなくなってしまうので、うっかりするとそれまでの作業が無駄になってしまいます。この程度であれば数式を工夫して対応する事を考えた方が良いかもしれませんね。 直接の回答になっておらずスミマセン。
お礼
回答ありがとうございます。
- tsubu-yuki
- ベストアンサー率46% (179/386)
単純に。 For Each r In Selection If i Mod 2 = 1 Then j = j + r.Value i = i + 1 Next Cells(1, 1) = j これだけでも。 ただし、どんな手段でやるにしても 複数列に跨って(例えばB1:C6とか)選択しているときはどうするか? など、考えなきゃならないことも幾つかありそうな案件ですね。
お礼
回答ありがとうございます。 複数列は選択しない場合の話です。 No1さんの回答を期待していました。
お礼
回答ありがとうございます。 絶対アドレスは、$をマクロで外してやることで、目的を達成することができました。