A列 B列 C列
りんご りんご
みかん みかん
もも もも
バナナ
ライチ
という表があるとします。
C列にA列とB列で重複しないデータ(バナナとライチ)を関数などで簡単に表示させる方法はありますか?
つまりA列にデータを貼り付けたら、毎回自動的にC列に重複しないデータが抽出されるようなフォーマットを作りたいです。
毎月同じ形式の売上表を各支店ごとに20個程作っているのですが、
毎回A列とB列を別シートに一列に並べて条件付き書式で重複データを色付け→重複しないセルをフィルターで抽出→抽出したデータをC列に貼付け、という作業を何回も繰り返し膨大な時間がかかっています・・。
ちなみにExcelを仕事で使い始めて4か月、マクロとかVBA?は使ったことがありません。
一から勉強するには時間がかかりそうなので、今月からすぐにでも使えそうな方法を探しています。
よろしくお願いします。
No.5ベストアンサー
- 回答日時:
#2です。
コメント拝見しました。ちょっと改造したうえで、説明用のコメントを追加しています。
前回同様、1行目は見出し行と考えています。
最後の吐き出し先はC列のままとしていますが、適宜いじってください。
B、C、K列の列番号は、それぞれ、2、3、11です。
'---------------------------------------------------------------------------
Option Explicit
Sub 非重複抽出()
'変数宣言とセット
Dim r As Long, k As Long, myStr As String
Dim Dic As Object, myKeys As Variant
Dim WSF As Object, Lstrow As Long
Set Dic = CreateObject("Scripting.Dictionary")
Set WSF = Application.WorksheetFunction
'B列K列のデータから非重複のリストを作成
r = 2 '2行目から下に、B列を見に行き、初めて出てきた品名をDicに格納
Do While Cells(r, 2).Value <> "" 'B列(列番2)
myStr = Cells(r, 2).Value 'B列(列番2)
If Not Dic.Exists(myStr) Then
Dic.Add myStr, myStr
End If
r = r + 1
Loop
r = 2 '2行目から下に、K列を見に行き、初めて出てきた品名をDicに格納
Do While Cells(r, 11).Value <> "" 'K列(列番11)
myStr = Cells(r, 11).Value
If Not Dic.Exists(myStr) Then
Dic.Add myStr, myStr
End If
r = r + 1
Loop
myKeys = Dic.Keys '出来上がったDicの結果を、配列 myKeysとする
'配列 myKeysを順に見ていき、その中から、B列またはK列にしか存在しないものを列記(BK両方にあるものは無視)
For k = 0 To UBound(myKeys) 'myKeysの値をすべてループ
'CountIf関数を用いて、B列(列番2)の個数が0 または、K列(列番11)の個数が0ならば転記(それ以外はスルー)
If WSF.CountIf(Columns(2), myKeys(k)) = 0 Or WSF.CountIf(Columns(11), myKeys(k)) = 0 Then
Lstrow = Cells(Rows.Count, 3).End(xlUp).Row + 1 '転記先はC列(列番3)
Cells(Lstrow, 3).Value = myKeys(k) 'C列(列番3)
End If
Next k
Set Dic = Nothing
Set WSF = Nothing
MsgBox "End."
End Sub
'-----------------------------------------------------
このマクロを実行するには、先の回答通り、Alt+F8 から行ってください。
あるいは、ボタンに登録したほうが楽かもしれません。念のため登録方法は以下。
1)エクセル上部のリボンから「開発」タブを選択
「開発」が出ていない場合は、ファイル>オプション>リボンのユーザー設定>右半分の「メインタブ」のところで「開発」にチェック
2)「挿入」ボタン。道具箱にトンカチとスパナがクロスした絵のやつ。
3)フォームコントロール。左上の「ボタン」をクリックし、シート上で適当な大きさにするようドラッグ
4)マクロの登録 となりますので、「非重複抽出」を登録すればOK
ボタン名が「ボタン1」などとイケていないので、ボタンの上で右クリック、「ボタン1」のあたりで左クリックすれば変更可能。
ホントは、C列の前回結果を消去するフローも入れたほうがより楽でしょうが、詳細が分からないので対応していません。
学習がてら適宜対応ください。
No.4
- 回答日時:
No.3です。
>実際のフォーマットはそれぞれ文字列がA列が2行目から、B列が3行目から、表示させたいC列も4行目から・・という風にばらばらです
というコトですので↓の画像のような感じだとします。
要するにINDEX関数の範囲(配列)の何番目のデータを表示させるか?
という行合わせだけの問題になります。
画像ではC4セル(数式を入れるセルはどこでも構いません)に
=INDEX(A$2:A$1000,SMALL(IF(COUNTIF(B$2:B$1000,A$2:A$1000)=0,ROW(A$2:A$1000)-1),ROW(A1)))&""
という配列数式にし、フィルハンドルで下へコピーしています。
※ 配列数式の操作方法は前回同様です。
※ これでもわかりにくい場合は
VBAで処理する方が簡単かもしれません。
必要であれば、補足にでも書いてください。m(_ _)m
No.3
- 回答日時:
こんばんは!
一例です。
データは1行目からあるとします。
C1セルに
=INDEX(A$1:A$1000,SMALL(IF(COUNTIF(B$1:B$1000,A$1:A$1000)=0,ROW(A$1:A$1000)),ROW(A1)))&""
配列数式ですので、Ctrl+Shift+Enterで確定!
この画面からコピー&ペーストする場合は
上記数式をドラッグ&コピー → C1セルを選択 → 数式バー内に貼り付け → そのまま(編集可能なまま)
Ctrl+Shiftキーを押しながらEnterキーで確定!
数式の前後に{ }マークが入り配列数式になります。
C1セルのフィルハンドルで下へコピー!
こんな感じではどうでしょうか?
※ 文字列限定としています。
(数値データの場合は文字列として表示されます)
※ 極端にデータ量が多い場合は配列数式はPCにかなりの負担をかけ、計算速度が落ちます。
作業用の列を設けたりする方法が良いかもしれません。m(_ _)m
ご丁寧にありがとうございます!
配列数式という存在を始めて知りました!
今早速やってみているのですが、
実際のフォーマットはそれぞれ文字列がA列が2行目から、B列が3行目から、表示させたいC列も4行目から・・という風にばらばらです。
(表が全シートこの位置に貼り付いていて、数式が入ってるのでずらすのが怖いです・・)
その状態でも可能でしょうか??
上記の数式をコピペして、A$1をA$2とかに置き換えてやってみたのですが、うまくいきません。
ABC3列とも1行目から文字列が始まるように調整するしかないでしょうか・・
No.2
- 回答日時:
ご意向にはそぐわないのかもしれませんが、質問カテゴリがここでもあるので、VBAを使う方法を
一つ。
以下を前提にしています。
・一番上の行(1行目)は見出しと考えています。
・A2から下にデータ、B2から下に比較対象のデータがある。
・C2から下に、A,Bで重複しないデータを並べる
すぐにでも使える、ということから、詳細の説明は省きますが、以下の流れでどうぞ。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
【1】そのエクセルファイル上で、Alt+F11 を押す。
別の画面が開きます。(Visual Basic Editor。以下VBE)
【2】VBE画面上で、Alt + I 、M
真っ白の画面となります。
【3】以下をコピペ
'-----------------------------------------------------
Option Explicit
Sub 非重複抽出()
'変数宣言とセット
Dim r As Long, k As Long, myStr As String
Dim Dic As Object, myKeys As Variant
Dim Rng As Range, Sel As Range
Dim WSF As Object, Lstrow As Long
Set Rng = Cells(1, 1).CurrentRegion
Set Rng = Rng.Offset(1, 0).Resize(Rng.Rows.Count, 2)
'A列B列のデータから非重複のリストを作成
Set Dic = CreateObject("Scripting.Dictionary")
For Each Sel In Rng
If Not Dic.exists(Sel.Value) And Sel.Value <> "" Then
Dic.Add Sel.Value, Sel.Value
End If
Next Sel
myKeys = Dic.Keys
'非重複リストの中から、A列またはB列にしか存在しないものを列記(AB両方にあるものは無視)
Set WSF = Application.WorksheetFunction
For k = 0 To UBound(myKeys)
If WSF.CountIf(Columns(1), myKeys(k)) =0 Or WSF.CountIf(Columns(2), myKeys(k)) = 0 Then
Lstrow = Cells(Rows.Count, 3).End(xlUp).Row + 1
Cells(Lstrow, 3).Value = myKeys(k)
End If
Next k
Set Dic = Nothing
Set Rng = Nothing
Set WSF = Nothing
MsgBox "End."
End Sub
'-----------------------------------------------------
【4】VBE画面を閉じる
【5】A列、B列に必要なデータを入れる
【6】Alt+F8 でボックスを表示させ、今仕込んだマクロ(非重複抽出)を実行。
・【1】~【4】は今回だけの作業。
実際には、【5】~【6】だけ。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
とりあえず、わたしの手元のダミーデータではうまく作動しました。
ご参考までお願いします。
すごい!!ありがとうございます。
意味を解読するには時間がかかりそうなので、これを他の色んな表でコピペして使うとして、今後参照する列を変えたい場合(今作業している表でいうとB列K列のデータから非重複のリストを作成、'非重複リストの中から、B列またはK列にしか存在しないものを列記(BK両方にあるものは無視)にしたい)にどの部分を変えたらいいのか教えていただけないでしょうか??
この方法も試してみたいです!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 重複データの抽出について 2 2023/07/21 14:52
- Visual Basic(VBA) Excel vbaについて知恵もしくは、コード教えて下さいm(__)m ① 表にあるデータをコピー、 2 2022/09/01 23:57
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) 複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。 9 2022/06/17 10:33
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 3 2023/02/28 01:13
- Excel(エクセル) エクセルで重複データを行ごとに抽出したい 4 2022/12/05 08:18
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 1 2023/02/27 22:21
- Excel(エクセル) Excel vba 重複行削除 4 2022/06/02 06:52
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 3 2022/06/12 11:17
このQ&Aを見た人はこんなQ&Aも見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
みんなの【マイ・ベスト積読2024】を教えてください。
積読、ついついしちゃいませんか?そこでみなさんの 「2024年に買ったベスト積読」を聞きたいです。
-
洋服何着持ってますか?
洋服を減らそうと思っているのですが、何着くらいが相場なのかわかりません。
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
エクセルVBAで 2種のリストを比べて重複していないデータを最下行に追加するには
Excel(エクセル)
-
excel VBA 2つのシートの特定の列を比較して同じ値のセルがあったらその行を上書きしたい
Excel(エクセル)
-
VBAでのリスト不一致抽出について
Visual Basic(VBA)
-
-
4
更新前と更新後の差分をVBAを使って抜き出したい
Excel(エクセル)
-
5
Excelで[表1]にあって、[表2]にないものを抽出する関数
その他(Microsoft Office)
-
6
A列にあってB列にはない単語をC列に残したいです。
Excel(エクセル)
-
7
複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。
Visual Basic(VBA)
-
8
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
9
ExcelVBAでデータ不一致のものの抽出
Excel(エクセル)
-
10
エクセルで複数列の検索をマクロで行いたい
Excel(エクセル)
-
11
EXCEL VBA 一致しないデータの抽出及びデータ更新
Excel(エクセル)
-
12
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
13
エクセル 重複したデータを別シートに抽出させる
Excel(エクセル)
-
14
VBA 列全体を別シートの列と比較し、同じ値がある行の、右端に値をコピーする方法について
Excel(エクセル)
-
15
VBAで重複するデータがあれば1個だけ残して他の重複セルを"(空白)にしたいのですが
Excel(エクセル)
-
16
【VBA】異なる行だけを抜き出す数式/マクロについて
Visual Basic(VBA)
-
17
VBA A列にありB列にないものまた逆
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
算術演算子「¥」の意味について
-
VBAでFOR NEXT分を Application...
-
Excelのマクロについて教えてく...
-
VBAの「To」という語句について
-
マクロVBAです。 どなたかコー...
-
VBAについてです。 どなたかご...
-
Excel VBA 選択範囲の罫線色の...
-
Vba WorkBooks.Openについて教...
-
Excelマクロで、ピボットテーブ...
-
以下のプログラムの実行結果は...
-
ExcelのVBAコードについて教え...
-
エクセルのマクロについて教え...
-
質問58753 このコードでうまく...
-
エクセルのマクロについて教え...
-
エクエルのVBAコードについて教...
-
VBAでユーザーフォームを指定回...
-
エクセルのVBAコードについて教...
-
エクセルVBAで在庫の組み換え処...
-
VB.net 文字列から日付型へ変更...
-
vbaマクロについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.net 文字列から日付型へ変更...
-
VBA 最終行の取得がうまくいか...
-
VBAでエクセルのテキストデータ...
-
【ExcelVBA】5万行以上のデー...
-
VBAについてです。 データのチ...
-
エクセルVBAで在庫の組み換え処...
-
VBAから書き込んだ条件付き初期...
-
エクセルのVBAコードについて教...
-
VBAでユーザーフォームを指定回...
-
エクセルのVBAについて教えてく...
-
vbaマクロについて
-
ExcelのVBAコードについて教え...
-
【VBA】 結合セルに複数画像と...
-
WindowsのOutlook を VBA から...
-
質問58753 このコードでうまく...
-
ExcelのVBAコードについて教え...
-
Excel VBAについて。こんな動作...
-
[Excel VBA]特定の条件で文字を...
-
[VB.net] ボタン(Flat)のEnable...
-
ExcelからVisual Basicを開くと...
おすすめ情報