お世話になります。
E列の重複したデータを別シートに抽出したいのです。またこの時に
A列とB列にある情報も一緒に抽出する形ができないでしょうか。
(この際 E列にあるハイフンだけのデータはカウントしないものだと助かります)
データsheet に 以下の様なデータがあります。これを
A列 B列 E列
A 202A GREEN
A 203B GREEN
A 204C ---
B 505 RED
B 505 RED
C 312 ---
C 312 -
C 313 -
重複sheet に 以下の様な結果になるよう抽出したいと考えています。
A列 B列 E列
A 202A GREEN
A 203B GREEN
B 505 RED
B 505 RED
何卒ご助力のほど、よろしくお願い致します。
No.9ベストアンサー
- 回答日時:
No.4です。
またまたこんにちは。
遅くなりました。
オートフィルターで表示されているデータのみを対象に、今までの処理をするというコードを作ってみました。
結構変更したので改めてコードを貼り付けますね。
ちなみに作業列(F列)の使用は廃止しました。
私の低いコーディング技術で1つのプロシージャ内に納めたものなので読みにくいと思いますが頑張って読んでみてください(笑)
心配なのはデータ量が多い場合フリーズしないか、ということです・・・。
Public Sub b()
Dim r1 As Double
Dim r2 As Double
Dim rLST As Double
Dim cntR As Double
Dim cntA As Double
Dim cnt As Double
Dim i As Integer
Dim pick1()
Dim pick2()
Dim colE()
'//-----シート名の指定----
Const SNM1 = "Sheet1"
Const SNM2 = "Sheet2"
'------------------------//
'//-----シート1データ開始行指定----
Const srt1 = 2
'--------------------------------//
'//-----シート2データ貼付行指定----
Const srt2 = 2
'--------------------------------//
'シート1のデータ最終行を取得
Worksheets(SNM1).Select
Worksheets(SNM1).Range("A" & srt1).Select
Selection.End(xlDown).Select
rLST = ActiveCell.Row
r1 = srt1
cntR = 1
Do Until r1 > rLST
'選択行が可視の時
If Sheets(SNM1).Rows(r1).Hidden = False Then
'E列の値が「-」かつ「---」でない時
If Worksheets(SNM1).Range("E" & r1) <> "-" And Worksheets(SNM1).Range("E" & r1) <> "---" Then
'行番号を取得
ReDim Preserve pick1(cntR)
pick1(cntR) = r1
'E列の値を取得
ReDim Preserve colE(cntR)
colE(cntR) = Range("E" & r1)
cntR = cntR + 1
End If
End If
r1 = r1 + 1
Loop
'対象行(可視&E列がハイフンでない)内でのE列重複確認
cntR = 1
For cntA = 1 To UBound(pick1)
i = 0
For cnt = 1 To UBound(colE)
If Worksheets(SNM1).Range("E" & pick1(cntA)) = colE(cnt) Then
i = i + 1
'重複が1つでもあったら比較処理を終了(時短対策)
If i > 1 Then
Exit For
End If
End If
Next
'重複の行番号を取得
If i > 1 Then
ReDim Preserve pick2(cntR)
pick2(cntR) = pick1(cntA)
cntR = cntR + 1
End If
Next
'シート2へコピペ
r2 = srt2
For cnt = 1 To UBound(pick2)
Worksheets(SNM1).Rows(pick2(cnt) & ":" & pick2(cnt)).Copy
Worksheets(SNM2).Select
Worksheets(SNM2).Rows(r2 & ":" & r2).Select
ActiveSheet.Paste
r2 = r2 + 1
Next
'アクティブセルをA1にしておく
Worksheets(SNM1).Select
Application.CutCopyMode = False
Worksheets(SNM1).Range("A1").Select
Worksheets(SNM2).Select
Worksheets(SNM2).Range("A1").Select
End Sub
picopico_7様
ありがとうございました。
どのように御礼の言葉を綴ればいいのか、分からない程です。
私自身ももう少し勉強をしていきたいと思います。
No.8
- 回答日時:
こちらへも失礼します。
ほとんど同じパターンのマクロが続いていますから、ここも参加させていただきます。一応、これでも、マクロの練習です。私の苦手だったDictionary もだいぶわかってきたような気がしますが、この先に、まだ、同様のオブジェクトがありますから、まだまだ、先は長いです。
'//
Sub PickingWData()
Dim objDic As Object
Set objDic = CreateObject("Scripting.Dictionary")
Dim i As Long, j As Long, k As Long, s As String
Dim arBuf As Variant, rngBuf As Variant
Dim LastRw As Long
Dim Ws1 As Worksheet
Dim Ws2 As Worksheet
'***********
'設定
Set Ws1 = Worksheets("データ")
Set Ws2 = Worksheets("重複")
'**********
With Ws1
LastRw = .Cells(Rows.Count, 1).End(xlUp).Row
k = 1
For i = 1 To LastRw
If .Cells(i, "E").Value Like "*[A-Z]*" Then '大文字アルファベットがあること
s = Trim(.Cells(i, "E").Value)
If Not objDic.Exists(s) Then
objDic.Add Trim(.Cells(i, "E").Value), .Cells(i, 1).Address(0, 0)
Else
objDic(Trim(.Cells(i, "E").Value)) = objDic(Trim(.Cells(i, "E").Value)) & "," & _
.Cells(i, 1).Address(0, 0)
End If
End If
Next i
arBuf = objDic.Items
For i = LBound(arBuf) To UBound(arBuf)
If InStr(1, arBuf(i), ",") > 0 Then
rngBuf = Split(arBuf(i), ",")
For j = LBound(rngBuf) To UBound(rngBuf)
.Range(rngBuf(j)).Resize(, 5).Copy Ws2.Cells(k, 1)
k = k + 1
Next j
Erase rngBuf
End If
Next i
End With
If k > 1 Then
MsgBox (k - 1) & " 個抽出 - 終了", vbInformation
End If
Set objDic = Nothing
End Sub
'//
WindFaller様
こんなところまで!ありがとうございます。
できればE列には数字やアルファベット
Then '大文字アルファベットがあること 限定せず
数字や小文字大文字アルファベット含めたい、ことを希望しています。。
No.7
- 回答日時:
No.4です。
①⇒出来ます。が、今日は時間がない為明日でしたらまたお手伝い出来るのですが。お急ぎの様でしたら①の内容でのトピを改めて立てられると回答してくれる人がいると思います。
②⇒すみません。F列の数式は最後に消しておいた方良いですよね。
先ほどのコードに以下「★」行を追加してやってください。
Worksheets(SNM1).Select
★Worksheets(SNM1).Columns("F:F").Select
★Selection.ClearContents
Worksheets(SNM1).Range("A1").Select
Worksheets(SNM2).Select
Worksheets(SNM2).Columns("F:F").Select
Selection.ClearContents
Worksheets(SNM2).Range("A1").Select
picopico_7様
お忙しい中、本当にありがとうございます。
お気持ちに感謝いたします。
急いでいませんし、picopico_7様にお付き合い
頂ければと思います。
またよろしくお願い致します。
No.6
- 回答日時:
No.4です。
失礼しました。
こちらでは1行目からデータを入れて動かしておりました。
データのスタート行を変えたい時はコード中の「r1 = 1」を1から任意の数字に変えてやってください。
ちなみに貼り付け先のスタート行は「r2 = 1」の箇所です。
いえ、本当にありがとうございます。
心苦しいのですが、もし可能でしたら以下も併せて
教えて頂けないでしょうか。
①スタート行をオートフィルタで絞り込んだ1行目から
にする設定などに変えることはできますでしょうか?
②またF列を作業列 をsheet2のF列に移す、あるいは
sheet1に表示させないことはできますでしょうか?
No.5
- 回答日時:
No.4です。
シート1から2に遷移するだけになってますか?
そうするとシート1から2へのコピペがうまくいっていないか、そもそも重複データは無しと認識されているかかなぁ?
ちなみにこちらではnotimeさんが質問の文中に書かれたデータをそのままテストデータとして使用しうまくいっています。
ステップイン実行で1行ずつ確認してみることは出来ますか?
picopico_7様
ありがとうございます。
1行目からデータが入っていないと認識しないのですね。
VBA初心者であり、申し訳ありませんでした。
うまくいきました。ありがとうございました。
No.4
- 回答日時:
こんにちは。
VBAを使用しても大丈夫でしたか?
大丈夫な様でしたらこんなのはいかがでしょう?
ちなみにデータsheetのF列を作業列として使用しておりますので都合が悪い様でしたら「 '//-----作業列の指定----」で指定しているFを違う列に変更してください。
またE列には連続して値が入っているものとし、空欄が出て来た時点でデータは終了と認識しています。
VBAは使用したくないというようでしたらスルーして頂いて結構です。
VBAは使用ても良いけれど認識が違っている、などあれば補足で書いてください。
Public Sub a()
Dim r1 As Double
Dim r2 As Double
Dim cntALL As Double
Dim cnt As Double
'//-----シート名の指定----
Const SNM1 = "Sheet1"
Const SNM2 = "Sheet2"
'------------------------//
'//-----作業列の指定----
Const workR = "F"
'------------------------//
r1 = 1
'E列の値の入力がなくなるまでの繰り返し処理
Do Until Worksheets(SNM1).Range("E" & r1) = "" Or IsNull(Worksheets(SNM1).Range("E" & r1))
'E列の値が「-」または「---」の時はF列に0を入力
If Worksheets(SNM1).Range("E" & r1) = "-" Or Worksheets(SNM1).Range("E" & r1) = "---" Then
Worksheets(SNM1).Range(workR & r1) = 0
'そうでない時はF列に数式を入力
Else
Worksheets(SNM1).Range(workR & r1) = "=COUNTIF(E:E,E" & r1 & ")"
End If
r1 = r1 + 1
Loop
cntALL = r1 - 1
r1 = 1
r2 = 1
For cnt = 1 To cntALL
'F列の値が1より大きい時は別シートに行貼り付け
If Worksheets(SNM1).Range(workR & r1) > 1 Then
Worksheets(SNM1).Rows(r1 & ":" & r1).Copy
Worksheets(SNM2).Select
Worksheets(SNM2).Rows(r2 & ":" & r2).Select
ActiveSheet.Paste
r2 = r2 + 1
End If
r1 = r1 + 1
Next
Worksheets(SNM1).Select
Worksheets(SNM1).Range("A1").Select
Worksheets(SNM2).Select
Worksheets(SNM2).Columns("F:F").Select
Selection.ClearContents
Worksheets(SNM2).Range("A1").Select
End Sub
ご回答ありがとうございます。
質問には可能性を広げたくVBA 限定とはしていませんでしたが、
VBA を使って作業をしたいと考えております。
そこで、ご回答内容のコードを試してみたのですが、
うまく作動しません(デバックするわけではなく、Sheet1 からSheet2に
画面が移動するだけ)。
ちなみにexcel2003 を使用しております。
もし宜しければ、再度ご教授お願いしてもいいでしょうか。
何卒よろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
許せない心理テスト
私は「あなたの目の前にケーキがあります。ろうそくは何本刺さっていますか」と言われ「12本」と答えたら…
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
Excel VBAを使った重複行の抜き出しについて教えてください
Excel(エクセル)
-
VBAで重複する項目を1つにまとめて金額を合計したい
Excel(エクセル)
-
複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。
Visual Basic(VBA)
-
-
4
エクセルマクロ:複数列 重複があった場合、メッセージと印入れる方法
Excel(エクセル)
-
5
vba 2つの条件が一致したらコピーして別シートに値のみ貼り付け
Visual Basic(VBA)
-
6
【VBA】2つのシートの値を比較して条件一致したら、同じ行の隣の値を別ブックへ転記したいです。 VB
Visual Basic(VBA)
-
7
EXCELで2列を参照し、重複するものを横に並べたい
Excel(エクセル)
-
8
複数ファイルから特定シートのコピー
Excel(エクセル)
-
9
エクセルでA列B列C列の重複するレコードのみを表示
Excel(エクセル)
-
10
セルに背景色がある行を別シートにコピー
その他(Microsoft Office)
-
11
エクセルVBA 重複データから1種類ずつ抽出
Visual Basic(VBA)
-
12
EXCEL VBA で重複するデータを抜き出し、カウントしたい
Excel(エクセル)
-
13
【EXCEL】【VBA】空欄は飛ばして処理する方法を教えて下さい。
Excel(エクセル)
-
14
excel VBA 2つのシートの特定の列を比較して同じ値のセルがあったらその行を上書きしたい
Excel(エクセル)
-
15
VBA エンターキーでイベントに入りたい。
PowerPoint(パワーポイント)
-
16
ExcelのVBAのマクロで他のシートの複数項目をクリアする方法
Visual Basic(VBA)
-
17
VBマクロ 色の付いたセルを含む行をコピーしたい。
Visual Basic(VBA)
-
18
別のシートから値を取得するとき
Visual Basic(VBA)
-
19
複数のシートに重複する文字列の抽出
Excel(エクセル)
-
20
VBAで、離れた複数の列に対して処理を施すには?
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで離れた列を選択して...
-
「段」と「行」の違いがよくわ...
-
VLOOKUPの列番号の最大は?
-
LEFT関数とIF関数の組み合わせ...
-
リストからデータを紐付けしたい
-
エクセル 任意の列数で分割する...
-
エクセルで複数列の検索をマク...
-
エクセル マクロ 範囲指定で...
-
Alt+Shift+↑を一括で行うには、...
-
別のブック最終行最終列の次へ...
-
Excelの行数、列数を増やしたい...
-
Excel で、二つの表の値が条件...
-
列を1つずつ非表示にしたい
-
(VBA)Excelの特定の範囲にデー...
-
エクセルマクロの組み方
-
最近急にVBAの処理速度が遅くな...
-
VBA 指定した列にある日時デー...
-
VBA
-
エクセルの行を65536以上に増や...
-
Excel vba 重複行削除
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「段」と「行」の違いがよくわ...
-
エクセルで離れた列を選択して...
-
VLOOKUPの列番号の最大は?
-
LEFT関数とIF関数の組み合わせ...
-
Excelの行数、列数を増やしたい...
-
列方向、行方向の定義
-
VBA 指定した列にある日時デー...
-
エクセルマクロPrivate Subを複...
-
Excel文字列一括変換
-
エクセル マクロ 範囲指定で...
-
Alt+Shift+↑を一括で行うには、...
-
CSVファイルの「0落ち」にVBA
-
VBAで結合セルを転記する法を教...
-
エクセルで複数列の検索をマク...
-
リストからデータを紐付けしたい
-
横軸を日付・時間とするグラフ化
-
エクセルで最初の行や列を開け...
-
エクセルのソートで、数字より...
-
エクセルマクロの組み方
-
☆Excel VBAでAVERAGE関数を使う...
おすすめ情報
EXCEL2003 を使用しております。できればVBA を使用して解決できれば、と希望しています。
よろしくお願い致します。