
お世話になります。
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。 9 2022/06/17 10:33
- Excel(エクセル) Excelの関数でこんな処理ができますか 1 2023/02/08 13:46
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
- Visual Basic(VBA) ListView重複データ削除 2 2022/08/05 18:12
- Excel(エクセル) マクロか関数で処理したいのですが、教えて頂けませんか。 8 2022/10/31 15:18
- Visual Basic(VBA) AdvancedFilterについての質問 2 2022/07/02 22:58
- Excel(エクセル) エクセルで沢山のレコードの最後に追記するには? 7 2023/04/10 13:27
- Access(アクセス) Accessのクエリの結果を、既存のエクセルに追加したい 2 2022/07/31 22:44
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 3 2022/06/12 11:17
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
このQ&Aを見た人はこんなQ&Aも見ています
-
excel VBA 2つのシートの特定の列を比較して同じ値のセルがあったらその行を上書きしたい
Excel(エクセル)
-
離れた2列を比べて重複しないデータを隣の列に表示させる方法 Excel
Visual Basic(VBA)
-
vba 2つの条件が一致したらコピーして別シートに値のみ貼り付け
Visual Basic(VBA)
-
-
4
VBAで重複するデータがあれば1個だけ残して他の重複セルを"(空白)にしたいのですが
Excel(エクセル)
-
5
Excel VBAを使った重複行の抜き出しについて教えてください
Excel(エクセル)
-
6
エクセルマクロ:複数列 重複があった場合、メッセージと印入れる方法
Excel(エクセル)
-
7
VBAで重複データを合算したい
Excel(エクセル)
-
8
エクセルVBAにて、重複データ処理の高速化を実施したいのですが、いい方法はありますでしょうか? G列
Excel(エクセル)
-
9
VBAで重複する項目を1つにまとめて金額を合計したい
Excel(エクセル)
-
10
複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。
Visual Basic(VBA)
-
11
VBAで重複データを確認したい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「段」と「行」の違いがよくわ...
-
エクセルで離れた列を選択して...
-
VBAで別ブックの列を検索し、該...
-
LEFT関数とIF関数の組み合わせ...
-
ListViewで列を指定して表示さ...
-
エクセルで最初の行や列を開け...
-
CSVファイルの「0落ち」にVBA
-
エクセルで複数列の検索をマク...
-
列方向、行方向の定義
-
エクセル マクロ 範囲指定で...
-
csvデータの列の入れ替えができ...
-
VBA 指定した列にある日時デー...
-
エクセル 1つのシートを日付で...
-
VLOOKUPの列番号の最大は?
-
Excel/VBA ステップインと通常...
-
エクセル マクロ 範囲の値を上...
-
VBAで結合セルを転記する法を教...
-
エクセルのシートの大きさを変える
-
土日の列幅の自動変更を教えて...
-
Excelの行数、列数を増やしたい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「段」と「行」の違いがよくわ...
-
エクセルで離れた列を選択して...
-
LEFT関数とIF関数の組み合わせ...
-
VLOOKUPの列番号の最大は?
-
VBA 指定した列にある日時デー...
-
Excelの行数、列数を増やしたい...
-
エクセルのソートで、数字より...
-
列方向、行方向の定義
-
VBAで別ブックの列を検索し、該...
-
エクセル マクロ 範囲指定で...
-
CSVファイルの「0落ち」にVBA
-
エクセルマクロPrivate Subを複...
-
エクセルで最初の行や列を開け...
-
最近急にVBAの処理速度が遅くな...
-
VBA
-
Excel文字列一括変換
-
エクセルで複数列の検索をマク...
-
エクセル マクロ 範囲の値を上...
-
横軸を日付・時間とするグラフ化
-
Alt+Shift+↑を一括で行うには、...
おすすめ情報
EXCEL2003 を使用しております。できればVBA を使用して解決できれば、と希望しています。
よろしくお願い致します。