エクセル実践塾 > エクセル実践塾2016

選択したセル範囲のデータから、一意のものを取り出したい

 

マクロなら可能です

複数の列にわたるセル範囲のデータから、 一意のものを取り出すには、 次のようなマクロを使います。

このマクロを実行すると、 選択されたセル範囲から重複を除いたユニークな値を取得し、 それらを改行区切りのテキストとしてクリップボードにコピーすることができます。

このマクロの実行直後に、 任意のシートのセルに、 一意のデータ一覧を貼り付けられます。


Sub CopyUniqueDataToClipboard()

 Dim selectedRange As Range

 Dim uniqueValues As Variant

 Dim uniqueIndex As Long

 Dim data As Variant

 Dim clipboardText As String

 

 ' 選択されたセル範囲を取得

 Set selectedRange = Selection

 

 ' 選択範囲のデータを配列に取得

 data = selectedRange.Value

 

 ' ユニークな値を取得

 Dim dict As Object

 Set dict = CreateObject("Scripting.Dictionary")

 

 For i = 1 To UBound(data, 1)

  For j = 1 To UBound(data, 2)

   If Not IsEmpty(data(i, j)) And Not dict.Exists(data(i, j)) Then

    dict.Add data(i, j), Nothing

   End If

  Next j

 Next i

 

 ' ユニークな値を配列に格納

 ReDim uniqueValues(1 To dict.count, 1 To 1)

 uniqueIndex = 1

 For Each Key In dict.Keys

  uniqueValues(uniqueIndex, 1) = Key

  uniqueIndex = uniqueIndex + 1

 Next Key

 

 ' 配列を文字列に変換

 For i = LBound(uniqueValues, 1) To UBound(uniqueValues, 1)

  clipboardText = clipboardText & uniqueValues(i, 1) & vbCrLf

 Next i

 

 ' クリップボードにデータを格納

 With CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") ' MSForms.DataObject

  .SetText clipboardText

  .PutInClipboard

 End With

End Sub

 

@左図のように選択したセル範囲のデータから、一意のものを取り出すマクロを作成します

 

A適当なモジュールを開いて、左図のようなマクロのコードを入力します

 

 

Sub CopyUniqueDataToClipboard()

 Dim selectedRange As Range

 Dim uniqueValues As Variant

 Dim uniqueIndex As Long

 Dim data As Variant

 Dim clipboardText As String

selectedRange

Rangeオブジェクト型の変数で、選択されたセル範囲を格納します。

uniqueValues

ユニークな値を格納する配列です。

uniqueIndex

ユニークな値の配列内のインデックスを示す変数です。

data

選択されているセル範囲のデータを格納するための配列です。

clipboardText

クリップボードにコピーするテキストを格納する変数です。

 ' 選択されたセル範囲を取得

 Set selectedRange = Selection

Selection関数を使用して、現在選択されているセル範囲を取得し、selectedRange変数に格納します。

 ' 選択範囲のデータを配列に取得

 data = selectedRange.Value

selectedRange.Valueを使用して、選択範囲のデータをdata配列に格納します。

 ' ユニークな値を取得

 Dim dict As Object

 Set dict = CreateObject("Scripting.Dictionary")


 For i = 1 To UBound(data, 1)

  For j = 1 To UBound(data, 2)

   If Not IsEmpty(data(i, j)) And Not dict.Exists(data(i, j)) Then

    dict.Add data(i, j), Nothing

   End If

  Next j

 Next i

Scripting.Dictionaryオブジェクトを使用して、ユニークな値を保持する辞書(dict)を作成します。

 

 

ネストされたループを使用して、data配列内の各要素をチェックし、重複していない場合に辞書に追加します。

 ' ユニークな値を配列に格納

 ReDim uniqueValues(1 To dict.count, 1 To 1)

 uniqueIndex = 1

 For Each Key In dict.Keys

  uniqueValues(uniqueIndex, 1) = Key

  uniqueIndex = uniqueIndex + 1

 Next Key

dict.Keysを使用して、辞書内のユニークな値を取得し、それらを配列uniqueValuesに格納します。

 ' 配列を文字列に変換

 For i = LBound(uniqueValues, 1) To UBound(uniqueValues, 1)

  clipboardText = clipboardText & uniqueValues(i, 1) & vbCrLf

 Next i

uniqueValues配列内の各要素をループして、clipboardTextに文字列として追加します。

各値の後には改行が挿入されます。

 ' クリップボードにデータを格納

 With CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") ' MSForms.DataObject

  .SetText clipboardText

  .PutInClipboard

 End With

End Sub

MSForms.DataObjectを使用して、クリップボードにテキストをコピーします。

SetTextメソッドでテキストを設定し、PutInClipboardメソッドでクリップボードにデータを格納します。

Bこのマクロは、対象となるセル範囲を選択してから実行することになります

 

Cマクロ実行後、結果はクリップボードにコピーされるので、見た目にはなんの変化もありません

適当なシートとセルを選択して貼り付けると、抽出された一意のデータ一覧が表示されます。

   
   
   
   
   
   
   
   
   
   
   
   
   
   
 

 

●選択中のセル範囲のデータを、1列にまとめるマクロを作る動画です

Dyson(ダイソン)オンラインストア

関連する他のページ

一意の値を抽出したい
「重複の削除」を利用できます

重複登録をチェックしたい
条件付き書式でチェックしてから、 重複の削除を行いましょう

受注番号の重複する行を取り除きたい
Excel 2010/2007では、[重複の削除]機能で、 重複データを含む行の削除が可能です

ウィキペディアの都道府県データをExcelで使いたい
コピー&貼付けしてから「区切り位置」を使います

ピリオド(.)で区切られている文字列を、2つの列に分けたい
[データ]タブの[区切り位置]を使うと、指定した文字でのデータの分割を行えます

出退の時刻を簡単に記録したい
簡単なマクロを作れば、 「出社」や「退社」をクリック(タップ)するだけで現在日時を入力できる タイムカードを用意できます

セル範囲を対象とするユーザー定義関数を作りたい
For Each...Next ステートメントを使って、選択範囲に含まれるセルを順番に処理します

オリジナルの関数(ユーザー定義関数)を作りたい
Functionプロシージャとして、Visual Basicで作成できます

マクロを作りたい
「開発」タブを表示しておけば、 そこから「Visual Basic」を実行してマクロを作ることができます

“セキュリティの警告”が表示されるんだけど・・・
マクロを含むブックを開くときには、注意を促すべく、「セキュリティの警告」が表示されます

マクロ有効ファイルって何?
マクロを含むブックは、 マクロ有効ファイル(マクロ有効ブック)として保存しなければ、マクロが失われてしまいます

『セル範囲を検索して、 該当セルの右隣の値を取り出す』ユーザー定義関数を利用して、 文字列全体を置換したい
同じモジュールにあるユーザー定義関数は、 別のユーザー定義関数から利用することができます

セル範囲を検索して、 該当セルの右隣の値を取り出したい
10行程度のユーザー定義関数で可能です

指定色で塗りつぶされているセルの個数を求められる、 ユーザー定義関数を作りたい
ユーザー定義関数は、その処理を拡張できます

指定色で塗りつぶされているセルの個数を求めたい
塗りつぶし色を数値で表すユーザー定義関数を作れば、数式で求めることができます

一意の項目に該当する、 同一行内のデータを取り出したい
INDEXとMATCHの関数を組み合わせると、 検索列の左側であっても、 該当するデータを取り出すことができます

一意の項目を抽出して集計したい
「データ」タブの「統合」を使うと、 一意の項目を抽出すると同時に、 該当値の集計を行えます

数式で、一意の値を抽出したい
配列数式で抽出することもできます

一意の値を抽出したい
「重複の削除」を利用できます

 

 

 

 

 

出前館

アウトドア&フィッシング ナチュラム