ExcelマクロでD列の各文言の数をカウントする方法

このQ&Aのポイント
  • Excelマクロを使って、D列に様々な文言が入っている場合でも、A列が同じ値の場合は数に含めないようにカウントする方法を教えてください。
  • 現在、以下のマクロを考えていますが、正しい値が出力されません。
  • マクロの修正や別の方法があれば、教えていただけると幸いです。
回答を見る
  • ベストアンサー

Excelマクロ

お世話になります。 Excelのマクロに関する質問です。 目的としては、D列に様々な文言が入っており、 D列に記入されている各文言の数をカウントしたいと思っています。 ただし、D列の各文言が複数あった場合でも、 A列が同じ値の場合は数に含めない、という条件があります。 ex)D列に「りんご」という文言が10個あります。   D列に「りんご」と記入されている行のA列は、 「赤」「青」の2パターンしかありません。 ⇒この場合、「2」とカウントしたいです。 現在、以下のマクロを考えています。 =========================================================== sub test() Dim i As Long, x As Long, cnt As Long, buf As Object '「i」「x」「cnt」を数値として定義。「buf」にD列の値を格納します。 x = 4 '4行目以降を対象としています。 Do While Cells(x, 1).Value <> "" 'A列が空白でない場合のみを対象とします。 cnt = 0 '各行のD列に入っている値の数を数えるため、まずはカウントを0にします。 i = 4 '4行目以降を対象としています。 Set buf = Cells(x, 4) ' D列の値を変数「buf」に格納します。 Do While Cells(i, 1).Value <> "" 'A列が空白でない場合のみを対象とします。 If Cells(i, 4).Value = buf And Cells(i, 1).Value <> Cells(x, 1).Value Then  ' D列の値が「buf」に格納した値と同じ、かつ、       ' A列の値が、bufに値を格納した時と異なる場合のみ対象 cnt = cnt + 1 '数を数える対象であれば、+1します。 End If i = i + 1 '次の行に移るために+1します。 Loop Cells(x, 5).Value = cnt ' E列にcntに格納された値を入力 x = x + 1 '次の行に移るために+1します。 Loop end sub ===================================================== 上記のマクロでは、E列にカウント後の数らしいものが入力されるのですが、 値が正しくないようです。 お力添えをいただけますでしょうか。 よろしくお願いいたします。

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

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

No.2の回答をしたものですが、完全に勘違いしていたことに気付いたので作り直しました。 Sub count() Dim Data(), Data2(), Data3() As String Dim i, j As Long Dim count() As Long Dim flag(), flag2() As Boolean i = 4 'セルAとセルDを配列に格納 While Cells(i, 4) <> "" ReDim Preserve Data(i - 4) Data(i - 4) = Cells(i, 1) ReDim Preserve Data2(i - 4) Data2(i - 4) = Cells(i, 4) i = i + 1 Wend ReDim flag(UBound(Data)) ReDim flag2(UBound(Data)) '重複を調べるフラグ用配列を初期化 For i = 0 To UBound(Data) flag(i) = True flag2(i) = True Next '重複するデータの場合flag配列にFalseを代入 For i = 0 To UBound(Data) - 1 For j = i + 1 To UBound(Data) If Data(i) & Data2(i) = Data(j) & Data2(j) Then flag(j) = False If Data2(i) = Data2(j) Then flag2(j) = False Next Next 'D列のデータを重複を除いて取得 ReDim Data3(0) For i = 0 To UBound(flag2) If flag2(i) = True Then Data3(UBound(Data3)) = Data2(i) ReDim Preserve Data3(UBound(Data3) + 1) End If Next 'カウント配列を動的に生成 ReDim count(UBound(Data3) - 1) 'Data3配列とData2配列(D列)、フラグを比較してカウント対象であればカウント For i = 0 To UBound(count) For j = 0 To UBound(flag) If flag(j) And Data3(i) = Data2(j) Then count(i) = count(i) + 1 End If Next Next 'カウントした個数を表示 i = 4 While Cells(i, 1) <> "" For j = 0 To UBound(count) If Cells(i, 4) = Data3(j) Then Cells(i, 5) = count(j) End If Next i = i + 1 Wend End Sub

ishiikun
質問者

お礼

ありがとうございます。いただいた情報を参考にして再度マクロを見直してみます。

その他の回答 (2)

回答No.2

ちょっと回りくどいやり方になってしまいましたが以下のやり方でどうでしょう。 Private Sub CommandButton1_Click() Dim Data() As String Dim i, j As Long Dim count As Long Dim flag() As Boolean i = 4 'セルAとセルDを結合して配列に格納 While Cells(i, 4) <> "" ReDim Preserve Data(i - 4) Data(i - 4) = Cells(i, 1) & Cells(i, 4) i = i + 1 Wend ReDim flag(UBound(Data)) '重複を調べるフラグ用配列を初期化 For i = 0 To UBound(Data) flag(i) = True Next '重複するデータの場合flag配列にFalseを代入 For i = 0 To UBound(Data) - 1 For j = i + 1 To UBound(Data) If Data(i) = Data(j) Then flag(j) = False Next Next 'フラグ配列のTrueの個数をカウントする cnt = 0 For i = 0 To UBound(flag) If flag(i) = True Then cnt = cnt + 1 Next MsgBox cnt End Sub

ishiikun
質問者

お礼

貴重なご意見ありがとうございました。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

時折使う作成例: sub macro1()  dim myDic, myKey  dim h as range  dim buf as string  dim i as long  set mydic = createobject("Scripting.Dictionary")  on error resume next  for each h in range("A4:A" & range("A65536").end(xlup).row)  if h <> "" then   buf = h & "_" & h.offset(0, 3)   mydic.add buf, buf  end if  next  msgbox mydic.count ’以下オマケ  mykey = mydic.keys  for i = 0 to mydic.count  cells(i + 4, "F").resize(1, 2) = split(mykey(i), "_")  next i  set mydic = nothing end sub #ネットで「Excel VBA Dictionary」といったキーワードで検索してみると,解説サイトが多数ヒットします。

ishiikun
質問者

お礼

ありがとうございます。参考にさせていただきます。

関連するQ&A

  • エクセル マクロ 抽出

    教えてください。 ○と記入されたセルを参照して、一つ上のセル・A列にある同じ行のセル・ 9行目にある同じ列のセルを抽出しようとしています。 下記の通り入力すると 行数=値.Rowでエラーが出たしまいました。 試行錯誤頑張りましたが解決できそうにありませんのでお力を貸して頂けないでしょうか。 Sub 抽出() Dim i, 行数, 列数 As Long Dim 値 As Range i = 0 行数 = 値.Row 列数 = 値.Column For Each 値 In Sheets("sheet1").Range("C12:R171") If 値.Value = "○" Then i = i + 1 With Sheets("sheet2") .Cells(i, 3).Value = Sheets("sheet1").Cells(行数, 1).Value .Cells(i, 4).Value = Sheets("sheet1").Cells(9, 列数).Value .Cells(i, 5).Value = 値.Offset(-1, 0).Value End With End If Next End Sub

  • エクセル、比較、コピー、貼り付けのマクロ

    エクセルについて 同じシート内にあるB列2行目から66行目までとI列2行目から333行目までの セルを比較し、 B列2行目とI列2行目がおわったらB列2行目とI列3行目を比較という流れになる。 I列の比較が333行目まで終わったら、B列3行目とI列2行目を比較し、終わったらB列3行目とI列3行目を比較していきます。 同じ数値のセルがあったら (1)A列~E列(行は値が一致した行)をコピー (2)H列~L列(行は値が一致した行)をコピーし、 (1)はM列に貼り付け (2)はR列に貼り付け VBAのコードは以下の様になります Sub t() x = 2 y = 2 g = 1 n = 1 Do Do If Cells(x, 2) = Cells(y, 9) Then Range(Cells(x, 1), Cells(x, 5)).Copy Destination:=Cells(g, 13) Range(Cells(y, 8), Cells(y, 12)).Copy Destination:=Cells(n, 18) y = y + 1 g = g + 1 n = n + 1 Else y = y + 1 End If Loop While y < 334 Loop While x < 67 End Sub これを実行すると実行エラー1004 アプリケーション定義又はオブジェクト定義の エラーになります。誰か回答をお願いします。

  • EXCEL VBAマクロについて質問です

    Excel VBAマクロについて質問です ※Excel Ver.は2005でやってます 例のような感じで、 同じ列(列1)に或る同じ列名の数字(列2)を足して 違うセル、または違うブックの指定行に合計値を横並び表示させたいのですがうまくいきません 例のように 同じ言葉が含まれているもの(りんご・青りんご)は足して出したいと思ってます 【理想】実行前 ****************************** 番号  名前  個数 001   りんご  1 002   ばなな  2 003   いちご  3 001   青りんご 2 ****************************** 【理想】実行後 ****************************** 番号   りんご  ばなな  いちご 001    3      -     - 002    -      2     - 003    -      -      3 ****************************** ※「-」記号はついてなくても大丈夫です 現在、組んでいるコード・実行結果をのせておきました どなたか享受ください、お願いいたします j = 1 For i = 0 To Range("A65536").End(xlUp).Row cnt = cnt + Range("列2" & i).Value If Range("C" & i + 1).value <> Range("C" & i).value Then 'もし次の行が違う名 Range("任意セル" & j).Value = Range("A" & i).Value '列1 Range("任意セル" & j).Value = Range("B" & i).Value '列2 Range("任意セル" & j).Value = cnt '数字合計 j = j + 1 '出力行カウントアップ cnt = 0 End If Next

  • Excel VBA インデックスが有効範囲にない

      よろしくお願いします。 Excel VBA 初心のものです。 プログラムを作ってみたのですが、 「インデックスが有効範囲にありません」となってその先に進めません。 ソースですが ------------------------------------------------------ Private Sub CommandButton1_Click() Dim buf As String, cnt As Long Dim TMP As Variant Const Path As String = "D:\Excel\sample\" buf = Dir(Path & "*.xls*") Set TMP = Workbooks(buf).Sheets("testdata").Range("A1").Value Do While buf <> "" cnt = cnt + 1 Cells(cnt, 1) = buf Cells(cnt, 2) = FileDateTime(Path & buf) Cells(cnt, 3) = TMP buf = Dir() Loop End Sub ------------------------------------------------------ エラーになる箇所は Set TMP = Workbooks(buf).Sheets("testdata").Range("A1").Value のところです。 このプログラムで何をしたいかと言いますと DドライブのExcel>sample というフォルダの中にある ・すべてのエクセルブック名(ファイル数は3個)と、 ・そのブックの作成日時と、 ・testdataというシート(各ブックに必ずあるシートです)のセルA1に入っている値 を実行ファイルのSheet1に書き出す、 というものです。 プログラムの実行ファイルはExcelフォルダ直下にあります。 どこが問題でエラーになっているのか分かりません。 ご指南よろしくお願いします。   

  • excelのファイルとセル値を書き出したい

    excel2003を利用しています。 とあるフォルダにある excelファイル名(自分自身のファイルを除く) を全て書き出して、 且つ A1セルの値をB列に書き出すことを、やろうとvbaを作ってみましたが。 最後のファイルのA1セルを書きだすところで、エラーになっていまい そこだけ空白になってしまいます。※写真参照 記述は以下の通りです。どのように修正すればよいか 教えていただけないでしょうか? また他にもっと優れた記述があれば、そちらも教えて欲しいです。 よろしくお願いします。 Sub test() Dim buf As String, cnt As Long Dim Path As String Path = ThisWorkbook.Path & "\" buf = Dir(Path & "*.xls") cnt = 2 Do While buf <> "" If buf <> ThisWorkbook.Name Then cnt = cnt + 1 Cells(cnt, 1) = buf buf = Dir() Workbooks.Open Filename:=Path & "\" & buf MsgBox Workbooks(buf).Worksheets(1).Range("A1").Value Cells(cnt, 2) = Workbooks(buf).Worksheets(1).Range("A1").Value Workbooks(buf).Close End If Loop End Sub

  • エクセルのマクロ中で

    飛び飛び(ctrl+クリック)で選択された値を 別シートに貼り付けるマクロを作成中です。  元はD列にある値なのでRange("D" & cnt)として (cntは変数)  cnt = Selection.Row.Countで行番号を取得しようと しましたがうまくいきません。 D1から順番に縦方向に最終データまでは行けるのですが ・・・  初心者に「産毛」が生えたくらいです。ご教授お願いします

  • Excelマクロのことで教えて下さい

    初歩的なことですみません。 E列の値をF列に値を入れるために下記のマクロを組みました。 Sub test() Worksheets("Sheet1").Select Dim i As Long For i = 2 To Cells(Rows.Count, 4).End(xlUp).Row Range("F2").Value = "=E2/1024/1024" Cells(i, 6).FillDown Range(Cells(2, 6), Cells(i, 6)).Copy Range("F2").PasteSpecial Paste:=xlValues Next i End Sub ところがF列に「値のみを貼り付け」をした時に、途中から同じ値のみがコピーされてしまい困っています。 (画像参照) うまく貼り付けることができるマクロをお教え下さい。 よろしくお願いいたします。

  • エクセルのマクロについて

    Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "ア") = 0 Then If InStr(.Cells(i, "D"), "ア(半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub このエクセルマクロはC列に「ア」があって、D列に「ア(半角)」の文字がない場合はメッセージというマクロなのですが、このマクロをア~ンまで同じ作業をしたいのですが、ひとまとめにマクロを組む事はできるのでしょうか?できる場合どのようにすれば良いでしょうか? 下記のようにして見たのですができませんでした。 Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "[ア-ン]") = 0 Then If InStr(.Cells(i, "D"), "[ア-ン](半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub

  • 度々エクセルマクロで質問です

    前回は皆様有り難うございました。 度々で申し訳ございません。 前回、エクセルマクロで、仮に columns("C:C").interior.colorindex = xlnone cnt = 1 temp = range("a1").value cells(cnt,3).resize(temp).interior.colorindex = 3 cnt = cnt + temp temp = range("a2").value cells(cnt,3).resize・・・・・ というマクロを教えて頂きました。 この状態ではA列の数字の分だけ、C列のセルを色分け できる訳ですが、この色分けと同じ範囲のセルをD・E 列にて罫線を引きたいのですが(範囲内すべてのセルの下線及びE列のセルの右側に縦線)このマクロにどのような マクロを追加すべきなのでしょうか? 変な質問ですみません。 初心者なので教えて下さい。

  • VBAで文字列のカウントがうまくいかない・・・です

    Dim cnt As Long Dim i As Long Dim lastRow As Long For i = 1 to 20 step 2 lastRow = Cells(65536, i).End(xlUP).Row cnt = WorksheetFunction.CountIf(ActiveSheet.Range(Cells(10, i),Cells(lastRow, i), "お世話になっております")cnt = cnt + cnt Next Excelのセルを1列ずつ飛ばして列に「お世話になっております」が含まれたら件数をカウントしています。 そのカウント数が何故かリセットされてしまいます。 カウント数を足していきたいのですが・・・考え方自体が違うのでしょうか?

専門家に質問してみよう