• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルVBAで値のカウントをしたい)

エクセルVBAで値のカウントをする方法とは?

このQ&Aのポイント
  • エクセルVBAを使用して、複数の列に入力された値の合計と1以上の値の数をカウントする方法を紹介します。
  • 現在のマクロは行数が多くなるため、よりスマートな方法を探しています。
  • コードの一部を紹介しますが、C列からAA列まで同じ処理を繰り返しています。

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんにちは! 一例です。 Sub Sample1() Dim j As Long, lastRow As Long, myRng As Range For j = 3 To Cells(1, Columns.Count).End(xlToLeft).Column lastRow = Cells(Rows.Count, j).End(xlUp).Row Set myRng = Range(Cells(2, j), Cells(lastRow, j)) With Cells(lastRow + 1, j) .Value = WorksheetFunction.Sum(myRng) .Offset(1) = WorksheetFunction.CountIf(myRng, ">=1") End With Next j End Sub こんな感じではどうでしょうか?m(_ _)m

その他の回答 (3)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.4

#1、3、cjです。訂正の訂正です。 #2、編集ミスで1行抜けていました。 Sub Re8745533j() ' 最下行位置がC:AA列でマチマチの場合。 Dim tnRows ' シート全体の行数 Dim nBtmRow As Long ' 各列の最下行 Dim iCol As Long ' 列位置ループカウンタ   tnRows = Rows.Count   For iCol = 3 To 27 ' C:AA列相当     nBtmRow = Cells(tnRows, iCol).End(xlUp).Row     Cells(nBtmRow + 1, iCol).FormulaR1C1Local = "=SUM(R2C:R[-1]C)"     Cells(nBtmRow + 2, iCol).FormulaR1C1Local = "=COUNTIF(R2C:R[-2]C,"">=1"")"     With Cells(nBtmRow + 1, iCol).Resize(2)       .Value = .Value     End With   Next iCol End Sub 以上、訂正の訂正でした。大変失礼しました。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

#1、cjです。自己レスです。 #1ふたつめの方(最下行位置がC:AA列でマチマチの場合) を差し替えでお願いします。 結果は全く同じですが、回答主旨の一貫性に欠ける記述があった為、 2ヶ所書き換えました。 Sub Re8745533j() ' 最下行位置がC:AA列でマチマチの場合。 Dim tnRows ' シート全体の行数 Dim nBtmRow As Long ' 各列の最下行 Dim iCol As Long ' 列位置ループカウンタ   For iCol = 3 To 27 ' C:AA列相当     nBtmRow = Cells(tnRows, iCol).End(xlUp).Row     Cells(nBtmRow + 1, iCol).FormulaR1C1Local = "=SUM(R2C:R[-1]C)"     Cells(nBtmRow + 2, iCol).FormulaR1C1Local = "=COUNTIF(R2C:R[-2]C,"">=1"")"     With Cells(nBtmRow + 1, iCol).Resize(2)       .Value = .Value     End With   Next iCol End Sub 以上、訂正です。失礼しました。 因みに、 #2さんご提示の、WorksheetFunctionのメソッドを使う方法や、 Evaluateメソッドを使う方法、 Excel関数を使わずに純粋なVBAとしてループで求める方法 等々、色々あります。 また、#1の回答ももう少し詰めて書くことも可能ではあります。 何を持って"スッキリ"と呼ぶか、については説明が難しい面もありますが、 私としては、結論が出ているスタイルを元に自分なりにお応えしたつもりです。 それでは、また。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 Excel数式を活用して、ということですと、 こんな感じにすればスッキリすると思います。 前提が確定的でないので、2種類用意しました。 Sub Re8745533a() ' 最下行位置がC列を基準にしてC:AA列で共通の場合。 Dim nBtmRow As Long ' 最下行   nBtmRow = Cells(Rows.Count, "C").End(xlUp).Row   Cells(nBtmRow + 1, "C").Resize(, 23).FormulaLocal = "=SUM(C2:C" & nBtmRow & ")"   Cells(nBtmRow + 2, "C").Resize(, 23).FormulaLocal = "=COUNTIF(C2:C" & nBtmRow & ","">=1"")"   With Cells(nBtmRow + 1, "C").Resize(2, 23)     .Value = .Value   End With End Sub Sub Re8745533j() ' 最下行位置がC:AA列でマチマチの場合。 Dim tnRows ' シート全体の行数 Dim nBtmRow As Long ' 各列の最下行 Dim iCol As Long ' 列位置ループカウンタ   tnRows = Rows.Count   For iCol = 3 To 27 ' C:AA列相当     nBtmRow = Cells(tnRows, iCol).End(xlUp).Row     Cells(nBtmRow + 1, iCol).FormulaR1C1Local = "=SUM(R2C:R" & nBtmRow & "C)"     Cells(nBtmRow + 2, iCol).FormulaR1C1Local = "=COUNTIF(R2C:R" & nBtmRow & "C,"">=1"")"     With Cells(nBtmRow + 1, iCol).Resize(2)       .Value = .Value     End With   Next iCol End Sub

関連するQ&A