質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

4回答

4338閲覧

Excel 結合セルを含む、指定文字列が入力されている行の合計数を表示させたい

maaao_z

総合スコア7

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/07/26 07:04

編集2019/07/26 07:21

指定文字列が入力されているセルの行数の合計を表示させたい

Excelで、1日の[学習]と入力されたセルの行数の合計を表示させたいです。
結合セルを含むので、関数では正しく表示されないとわかったのですが、
VBA初心者のため自分ではコードを打てません...。

D6を1、D8~D11とD13~D16を4と数え、
月~金のそれぞれの列の42行に合計数を入力する方法がありましたら
教えていただけませんでしょうか。
説明がわかりにくいようでしたら申し訳ありません。
よろしくお願いいたします。

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2019/07/26 07:41 編集

データの集計をしたいのに、セルの結合とか1セルに複数のデータ入力を行うのがそもそも(表計算ソフトの使い方として)間違っている気がします。 集計用の表と、集計結果をまとめる票を別にして、後者は前者のデータから関数を使って結果の加工し、参照すれば良い気が。
maaao_z

2019/07/26 07:42 編集

そうですよね...もともと数えるという考えはなかったので見栄え重視で作成してしまいました。 入力していくうちに、数えられたら効率が良い事がわかり、 (セルの結合を解除して入力していくのが一番簡単な事はわかっているのですが) なにか方法があるならば試したいと思ったのです。
gentaro

2019/07/26 07:56 編集

ご自身がVBAを使えない、ということであれば、EXCEL関数を使って実現が難しいなら「なにか」を試すのも難しいんじゃないでしょうか。 ちなみに作業丸投げはNGです。 https://teratail.com/help/avoid-asking
maaao_z

2019/07/26 08:14

やはりそうでしょうか。すみません。 結合セルを含むと関数では集計できないという認識は正しいでしょうか? VBAは学習中で、色々試したのですがうまくできませんでした。 >集計用の表と、集計結果をまとめる票を別にして、後者は前者のデータから関数を使って結果の加工し、参照すれば良い気が。 すみません、こちらを見逃しておりました。 参考画像のものとは別に、結合しないで入力する表を作成するということですか。
guest

回答4

0

解決済みですが、面白そうな題材ですので作成してみました。

データは、「月」から「金」までで5行目から42行目まであるとします。
C5:G42 の範囲

vba

1'指定範囲でキーワードと一致するセル数を返す、結合されているセルもカウントする。 2Public Function CountIfMerge(ByVal targetRng As Range, keyWord As String) As Long 3 Dim result As Long 4 Dim r As Range 5 For Each r In targetRng.Cells 6 If r.Value = keyWord Then 7 result = result + r.MergeArea.Count 8 End If 9 Next 10 CountIfMerge = result 11End Function 12 13'43行目に結果を代入 14Public Sub 学習カウント() 15 Dim rng As Range 16 Set rng = Range("C5:G42") 17 18 Dim col As Range 19 20 For Each col In rng.Columns 21 Cells(43, col.Column).Value = CountIfMerge(col, "学習") 22 Next 23 MsgBox ("完了") 24End Sub

CountIfMerge関数はユーザー定義のワークシート関数として使えるように設計してます。
C43セルに

=CountIfMerge(C5:C42,"学習")

と入力して、「フィルハンドル」を右方向へ4列分ドラッグすると、それぞれの列の学習のセル数か表示されます。
通常のワークシート関数と同様に使えますので、一度式を設定しておけば、データを編集するとすぐ結果が反映されます。

投稿2019/07/27 01:34

編集2019/07/27 05:15
hatena19

総合スコア34362

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

検索範囲の行は5行から42行とします。
Private Sub GakuCount(ByVal col As Long)が指定列の「学習」のセル数をカウントします。
考え方は、以下のようになります。
このセルの値が"学習"なら、1カウントアップする。そうでないなら、このセルが結合セルでかつ前の行が"学習"なら、1カウントアップする。上記の2条件以外は、カウントアップしない。(結合セルが先頭が"学習"なら、その範囲の行は全て"学習"として扱う)
これを、3列から7列まで繰り返します(月~金迄)

VBA

1Public Sub 学習カウント() 2 Dim col As Long 3 For col = 3 To 7 '3列から7列まで繰り返す(月~金迄繰り返す) 4 Call GakuCount(col) 5 Next 6 MsgBox ("完了") 7End Sub 8'指定列の"学習"のセル数をカウントする 9Private Sub GakuCount(ByVal col As Long) 10 Dim wrow As Long 11 Dim ctr As Long 12 Dim prev As Boolean 13 ctr = 0 14 prev = False 15 For wrow = 5 To 42 16 If Cells(wrow, col).Value = "学習" Then 17 ctr = ctr + 1 18 prev = True 19 GoTo END99 20 Else 21 Dim addr As String 22 Dim pos As Variant 23 Dim wlen As Long 24 Dim start_row As Long 25 addr = Cells(wrow, col).MergeArea.Item(1).Address 26 pos = InStrRev(addr, "$") 27 wlen = Len(addr) - pos 28 start_row = CLng(Right(addr, wlen)) 29 If start_row <> wrow And Cells(wrow, col).MergeCells = True And prev = True Then 30 ctr = ctr + 1 31 GoTo END99 32 End If 33 End If 34 prev = False 35END99: 36 Next 37 Cells(43, col).Value = ctr 38End Sub

結合セルを扱うとマクロの難易度が一気に上がります。見た目を重視したいのはわかりますが、結合セルにする強い理由がないなら、結合セルは(マクロが上達する迄は)使わないことをお勧めします。

投稿2019/07/26 11:22

編集2019/07/26 12:34
yokotatsu

総合スコア92

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maaao_z

2019/07/26 12:00

ご回答ありがとうございます! 素人が適当に手を出せるレベルではなかったのですね。 丁寧にご解説いただきありがとうございます。教えていただいた内容を元に、自分でも調べ、考えながら作成します。 本当に勉強になりました。
guest

0

検索すればヒントは出ます。
結合されたセルがいくつのセルを含むか

これを利用して、
1:最終行まで「学習」の文字を検索しながら、
2:見つかる度に該当のコードを実行(実行する度に数値を加算)
3:最後に加算し終わった数値を目的のセルに格納する
といったようなプログラムを書かれると良いかと思います。

条件分岐やループ処理などがわからないようでしたら、それも検索したら出てきます。
まずは、それでコードを書いてみて、それでもわからなかったら、そのコードを提示して質問されると良いのではないでしょうか。

投稿2019/07/26 09:01

Secret

総合スコア220

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maaao_z

2019/07/26 09:47

ご回答ありがとうございます! まさしくそのページも参考にさせてもらっていました。 いただいたヒントを元に、検索しつつ考えます!非常に参考になりました。 (素人の考えを載せて、全く見当違いだと恥ずかしいと思い載せませんでした。次回気をつけます)
guest

0

SUMPRODUCTが使えます。

Excel

1=SUMPRODUCT((D5:D41="学習")*1)

追記

回答になっていませんでしたね。
以下参考に。
Excel:セル結合時のCOUNTIFSの動きについて

投稿2019/07/26 07:53

編集2019/07/26 08:54
sazi

総合スコア25430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maaao_z

2019/07/26 08:08

ご回答ありがとうございます! 試してみましたが、0と表示されてしまいました。
sazi

2019/07/26 08:23

手元では問題ありませんでしたので、D列の範囲か比較する文字(学習)が一致していないかではないでしょうか
maaao_z

2019/07/26 08:31

文字が一致していませんでした。大変失礼いたしました。 4行結合されたセルは4と数えたいのですが、1と数えてしまうようです
sazi

2019/07/26 08:52

>4行結合されたセルは4と数えたい 失礼しました見落としていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問