• ベストアンサー

ひとつ飛びの合計の数式を記述するマクロ

(エクセルのマクロにて) セルB1からB6を選択しているとします。 ひとつ飛びの合計を求める式=B2+B4+B6をマクロで作成し、A1セルに記述するマクロはどうすれば実現できるのでしょうか? もちろんC2からC10を選択している時は、=C3+C5+C7+C9 という式をA1セルに記述するものとします。 お手数ですが、お分かりの方お教えください。

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

  • ベストアンサー
回答No.1

例えば、 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 とか。 式の頭に+が入るし、絶対アドレスになりますが。

gennya
質問者

お礼

回答ありがとうございます。 絶対アドレスは、$をマクロで外してやることで、目的を達成することができました。

その他の回答 (5)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.6

>=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

gennya
質問者

お礼

回答ありがとうございます。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

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

gennya
質問者

お礼

回答ありがとうございます。 No1さんの回答を期待していました。

  • ubku
  • ベストアンサー率37% (227/608)
回答No.4

Excelの仕様上、数式が8,192 文字を越えるとエラーになります。 また、Excelの行を扱う変数は Dim i As Long としておくほうが無難です。Integer型は32767行を越えるとエラーになります。 選択範囲を対象にしたマクロは、便利なようで、実際には使いづらいです。マクロは実行した途端に「元に戻す」ことができなくなってしまうので、うっかりするとそれまでの作業が無駄になってしまいます。この程度であれば数式を工夫して対応する事を考えた方が良いかもしれませんね。 直接の回答になっておらずスミマセン。

gennya
質問者

お礼

回答ありがとうございます。

回答No.3

単純に。   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とか)選択しているときはどうするか? など、考えなきゃならないことも幾つかありそうな案件ですね。

gennya
質問者

お礼

回答ありがとうございます。 複数列は選択しない場合の話です。 No1さんの回答を期待していました。

  • f272
  • ベストアンサー率46% (8467/18126)
回答No.2

こんな感じ? Sub Macro1() a = Selection n = UBound(a) s = 0 For i = 2 To n Step 2 s = s + a(i, 1) Next i Range("a1") = s End Sub

gennya
質問者

お礼

回答ありがとうございます。

Powered by GRATICA

関連するQ&A