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

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

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

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

1回答

1148閲覧

【VBA】列要素のカウント

zeze

総合スコア27

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2020/03/31 04:06

編集2020/04/01 01:43

前提

VBAマクロを作成しています。
初心者のためお力添えいただきたいです。

エクセルで下記のようなデータがあり、他のプログラムでダンプされたもので
行数はその都度変わりますが、列数は変わりません。
Name列はA列、Summary列はB列にあり、Summary列は空のデータを含みます。

テストデータ

NameSummary
test1
test2A
test2A
test3
test4B
test4B
test5C
test6D
test7E
test3
test5

実現したいこと

Summary列の要素の個数をカウントしたい
要素が空の場合、Name列の要素数でカウントする
(上記のtest5は別物としてカウントする)
各要素のカウント結果をC列にセットする

期待値
Result
1
2
2
2
1
1
1
1
### 該当のソースコード

vb

1sub Sample() 2 Dim MyArray As Variant 3 Dim maxRow As Long 4 Const maxCol As Long = 2 5 6 maxRow = Cells(Rows.Count, 1).End(xlUp).Row '最終行' 7 MyArray = Range(Cells(1, 1), Cells(maxRow, maxCol)) '配列に格納' 8 9  '処理' 10 11End Sub

補足情報(FW/ツールのバージョンなど)

Windows10
Excel 2010

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

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

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

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

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

Y.H.

2020/03/31 06:05

タグにExcelを追加したほうがいいよ。
zeze

2020/04/01 01:44

追加致しました。
guest

回答1

0

ベストアンサー

なんか「期待値」に書いてあるのが「実現したいこと」と異なるような気がする。
「実現したいこと」をそのまま解釈するとこう↓なると思う

NameSummaryResult
test11
test2A2
test2A2
test32
test4B2
test4B2
test5C1
test6D1
test7E1
test32
test51

という前提で、手っ取り早い方法を考えてみた。
D列をワークに使用していいのであれば以下で可能

vba

1 With Sheets("Sheet1") 2 maxRow = .Cells(.Rows.Count, 1).End(xlUp).Row '最終行' 3 .Range("D2:D" & maxRow).Formula = "=$A2&CHAR(9)&$B2" 4 .Range("C2:C" & maxRow).Formula = "=IF($B2="""",COUNTIF($D$2:$D$" & maxRow & ",$D2),COUNTIF($B$2:$B$" & maxRow & ",$B2))" 5 6 ' C列を数式から値に変換 7 .Range("C2:C" & maxRow).Value = .Range("C2:C" & maxRow).Value 8 ' ワークにしたD列をクリア 9 .Range("D2:D" & maxRow).Clear 10 End With

ちなみに、「実現したいこと」に記載されていることを忠実にコード書いたので
「test8 A」とかを追加した場合の結果は以下になります。

NameSummaryResult
test11
test2A3
test2A3
test32
test4B2
test4B2
test5C1
test6D1
test7E1
test32
test51
test8A3

投稿2020/03/31 06:04

Y.H.

総合スコア7918

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

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

zeze

2020/04/01 01:42

回答ありがとうございました!期待通りの結果が得られました! 分かりにくい文章で申し訳ございません。 参考にさせていただきます!
Y.H.

2020/04/01 14:18 編集

解決したのであれば解決済みにしていただければと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問