• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excelマクロ)

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

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

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

  • ベストアンサー
回答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/7941)
回答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
質問者

お礼

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

すると、全ての回答が全文表示されます。