【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?

VBA初心者です。

1行目は22時を始めとし23時、0時、1時、~~と21時まで続く時間を
2行目は各時間の0分台、 10分台、 20分台、30分台、40分台、50分台を表しています。
5行名以降に記されている"+"と"o"の合計数を数え、それぞれ"+"の合計数を3行目に、”o"の合計数を4行目に記すVBAを作成したいです。

VBAを学習したばかりの自分にはハードルが高く、こちらで質問させていただきます。
よろしくお願いいたします。

「VBAで各列の"+"と"o"の合計数を数」の質問画像

質問者からの補足コメント

  • ご回答いただきましてありがとうございます。
    先ほどの投稿では不足がありましたので、補足いたします。
    拡張子はxlsxです。

    画像では省略したのですが、A列~E列のセルにも何らかの値(文字列)が入力されています。
    ですので、最終行はEnd(xlUp)プロパティを用いればいけるものと考えておりました。。
    見当違いの補足でしたら申し訳ありません。

    よろしくお願いいたします。

      補足日時:2024/04/17 17:15
  • tatsumaru77様
    ご回答いただきまして、ありがとうございます。
    はい、A列の最後の行で問題ありません。
    よろしくお願いいたします。

    No.3の回答に寄せられた補足コメントです。 補足日時:2024/04/17 18:18

A 回答 (7件)

No.5 スマン、xlsxだった・・・ゴメン



行END = Range("A1048576").End(xlUp).Row

列END = Cells(2, 16384).End(xlToLeft).Column

For 列 = 6 To 列END

Cells(3, 列) = WorksheetFunction.CountIf(Range(Cells(6, 列), Cells(行END, 列)), "+")

Cells(4, 列) = WorksheetFunction.CountIf(Range(Cells(6, 列), Cells(行END, 列)), "0")

Next 列
    • good
    • 0
この回答へのお礼

ありがとう

ssawatake様

ご回答いただきまして、ありがとうございます!
無事思っていた通りの実行結果をえられました。
ベストアンサーに選ばせていただきます。
ありがとうございました!

お礼日時:2024/04/19 17:38

以下のマクロを標準モジュールに登録してください。


A列の最後が最終行になります。
アクティブシート(表示されているシート)に対して作動します。

Option Explicit
Public Sub 合計算出()
Dim ws As Worksheet
Dim lastrow As Long
Dim wcol As Long
Dim rg As Range
Set ws = ActiveSheet
lastrow = ws.Cells(Rows.Count, 1).End(xlUp).Row
If lastrow < 5 Then Exit Sub
For wcol = 6 To 149
Set rg = ws.Cells(5, wcol).Resize(lastrow - 4, 1)
ws.Cells(3, wcol).Value = Application.CountIf(rg, "+")
ws.Cells(4, wcol).Value = Application.CountIf(rg, "o")
Next
End Sub
    • good
    • 0

No.4  一部、列と行を間違えた。


こちらが正です。

行END = Range("A65536").End(xlUp).Row

列END = Cells(2, 255).End(xlToLeft).Column

For 列 = 6 To 列END

Cells(3, 列) = WorksheetFunction.CountIf(Range(Cells(6, 列), Cells(行END, 列)), "+")

Cells(4, 列) = WorksheetFunction.CountIf(Range(Cells(6, 列), Cells(行END, 列)), "0")

Next 列
    • good
    • 0

xlxsなら、以下で行けると思います



行END = Range("A1048576").End(xlUp).Row

列END = Cells(2, 16384).End(xlToLeft).Column

For 列 = 6 To 列END

Cells(3, 列) = WorksheetFunction.CountIf(Range(Cells(6, 列), Cells(列END, 列)), "+")

Cells(4, 列) = WorksheetFunction.CountIf(Range(Cells(6, 列), Cells(列END, 列)), "0")

Next 列
    • good
    • 0

>画像では省略したのですが、A列~E列のセルにも何らかの値(文字列)が入力されています。


>ですので、最終行はEnd(xlUp)プロパティを用いればいけるものと考えておりました。

では、A列の最後の行を最終行として扱ってよろしいでしょうか。
この回答への補足あり
    • good
    • 0

5行目以降下を見ると、+0が何行目まであるか、規則が解りませんね。



最終行は判定可能なんですか?

判定出来ないなら、 xlsなら65,536行まで、xlsxなら1,048,576行まで見ないとイケナクなり、無駄ですねぇ。

それでも「やれ」と言うなら、xlsなのかxlsxなのかを記載すれば、私を含めて誰かが回答すると思います。
    • good
    • 0

こんにちは



以下はエクセルに計算してもらう方法ですので、エクセル的と言えばエクセル的ではありますが、普通のプログラミングの方法ではありません。
ご参考程度に。
普通の方法は、どなたかが回答してくれるものと思いますので、そちらをお待ちください。

Sub Sample()
Dim mr As Long, mc As Long
Dim f As String

mr = ActiveSheet.UsedRange.SpecialCells(11).Row - 4
mc = Cells(2, Columns.Count).End(xlToLeft).Column - 5
If mr < 1 Or mc < 1 Then Exit Sub

f = Replace("=IF($=0,"""",$)", "$", "COUNTIF(#,MID(""+o"",ROW(A1),1))")
With Range("F3").Resize(2, mc)
.Formula = Replace(f, "#", Range("F5").Resize(mr).Address(1, 0))
.Value = .Value
End With
End Sub
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A