[[20170801214225]] 『重複データをFGHに書き出す』(狭山) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『重複データをFGHに書き出す』(狭山)

 こんばんは。
 またお世話になります。
 よろしくお願いいたします。

	A	B	C	D	E	F	G	H
1	番号	場所	個数	場所修正	個数修正	番号	場所	個数
2	1	東 京	100	東京	100	1	東京	100
3	2	神 奈 川	200	神奈川	200	7	東京	100
4	3	千 葉	300	千葉	300	***	***	***
5	4	埼 玉	400	埼玉	400	2	神奈川	200
6	5	大 阪	500	大阪	500	8	神奈川	200
7	6	名 古  屋	10	名古屋	10	14	神奈川	200
8	7	東京	100	東京	100	***	***	***
9	8	神奈川	200	神奈川	200	3	千葉	300
10	9	千葉	0	千葉	0	15	千葉	300
11	10	埼玉	400	埼玉	400	***	***	***
12	11	大阪	500	大阪	500	4	埼玉	400
13	12	名古屋	20	名古屋	20	10	埼玉	400
14	13	東京	50	東京	50	16	埼玉	400
15	14	神奈川	200	神奈川	200	***	***	***
16	15	千葉	300	千葉	300	5	大阪	500
17	16	埼玉	400	埼玉	400	11	大阪	500
18	17	大阪	50	大阪	50			
19	18	名古屋	30	名古屋	30			

 上記のようなデータがあります。

 B列とC列にデータが入っています。
 B列のデータは漢字で書きましたが実際は『ひらがな・英数字・文字間に空白スペース』
 などが入っています。(C列も同じです)

 行いたい処理は
 1、B列C列ともに空白が入っていますがそれを削除してD列、E列に書き出す。
 2、DとEがセットとして列で重複したデータをF、G、H列に書き出す(F列はA列の番号です)
 のですが重複データを見やすくするため1行の間隔をあける(***が空白と見てください)

 どうぞよろしくご教授下さい。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


ご要望と違いますが

 Option Explicit

 Sub test()
    Dim v
    Dim dic As Object
    Dim i As Long
    Dim s As String
    Dim k
    Dim n As Long, m As Long

    Set dic = CreateObject("Scripting.Dictionary")

    ActiveSheet.UsedRange.Columns("F:H").Offset(1).ClearContents

    v = Cells(1).CurrentRegion.Resize(, 3).Value

    For i = 2 To UBound(v)
        s = v(i, 2) & vbTab & v(i, 3)
        s = Replace(s, " ", "")

        If Not dic.exists(s) Then
            Set dic(s) = CreateObject("System.Collections.ArrayList")
        End If
        dic(s).Add v(i, 1)
    Next

    n = 2

    For Each k In dic
        m = dic(k).Count
        If m > 1 Then
            With Cells(n, "F").Resize(m)
                .Value = Application.Transpose(dic(k).toarray)
                .Offset(, 1).Resize(, 2).Value = Split(k, vbTab)
                n = n + m + 1
            End With
        End If
    Next

 End Sub

(マナ) 2017/08/01(火) 22:39


 1) A:CをD:Fにコピペ
 2) Eを選択して Ctl + H [検索する文字列] にスペース、[置換後の文字列]は入力無し、で全て置換
 3) K2セルに =COUNTIFS($E$2:$E$19,E2,$F$2:$F$19,F2)>1
 4) D1:F19を選択して、[データ] - [詳細設定] - [検索条件範囲]をクリックして K1:K2を選択して[OK]
 5) 結果をコピーしてG1に貼り付け - [データ] - [クリア]
 6) G:Iを数量で並べ替え

 各場所ごとの空白は入りませんが...
(  seiya) 2017/08/01(火) 22:40

個数が文字列になってしまっていたので修正です。

 Option Explicit

 Sub test2()
    Dim v
    Dim dic As Object
    Dim i As Long
    Dim s As String
    Dim k
    Dim n As Long, m As Long

    Set dic = CreateObject("Scripting.Dictionary")

    ActiveSheet.UsedRange.Columns("F:H").Offset(1).ClearContents

    v = Cells(1).CurrentRegion.Resize(, 3).Value

    For i = 2 To UBound(v)
        s = v(i, 2) & vbTab & v(i, 3)
        s = Replace(s, " ", "")

        If Not dic.exists(s) Then
            Set dic(s) = CreateObject("System.Collections.ArrayList")
        End If
        dic(s).Add Array(v(i, 1), v(i, 2), v(i, 3))
    Next

    n = 2

    For Each k In dic
        m = dic(k).Count
        If m > 1 Then
            Cells(n, "F").Resize(m, 3).Value = _
                Application.Transpose(Application.Transpose(dic(k).toarray))
            n = n + m + 1
        End If
    Next

 End Sub

(マナ) 2017/08/01(火) 23:09


うーん。↑これも失敗でした。

(マナ) 2017/08/01(火) 23:12


ごめんなさい。飽きてしまったのでこれまでとします。

(マナ) 2017/08/01(火) 23:16


 vba
 Sub test()
     Dim a, i As Long, ii As Long, txt As String, e, n As Long, w, dic As Object
     Set dic = CreateObject("Scripting.Dictionary")
     Columns("f:h").ClearContents: n = 1
     a = Cells(1).CurrentRegion.Value
     For i = 2 To UBound(a, 1)
         txt = Join(Array(Replace(a(i, 2), " ", ""), a(i, 3)), Chr(2))
         If Not dic.exists(txt) Then
             ReDim w(1 To 3, 1 To 1)
         Else
             w = dic(txt)
             ReDim Preserve w(1 To 3, 1 To UBound(w, 2) + 1)
         End If
         For ii = 1 To 3
             w(ii, UBound(w, 2)) = IIf(ii = 2, Replace(a(i, ii), " ", ""), a(i, ii))
         Next
         dic(txt) = w
     Next
     [f1:h1].Value = a
     For Each e In dic
         If UBound(dic(e), 2) > 1 Then
             n = n + 1
             Cells(n, "f").Resize(UBound(dic(e), 2), 3).Value = Application.Transpose(dic(e))
             n = n + UBound(dic(e), 2)
         End If
     Next
 End Sub
( seiya) 2017/08/01(火) 23:43

(  seiya)さん(マナ)さんありがとうございます。
 (マナ)さんの修正の方で行いましたがC列とE列の個数が
 1度目は大丈夫ののですが2回目にC列を変更してもE列は変化無しになってしまいます。
 しかしFGHの答えは要望どおりに実行されます。
 ( seiya)さんの 2017/08/01(火) 23:43の方ですが実行しましたところ
 FGHは要望どおりです。
しかし、DEには何も表示されませんでした。
 DEに関しては、置換等で行えばできると思いますので明日にでも行ってみたいと思います。
 明日の朝が早いため、ここで失礼させていただきます。

(狭山) 2017/08/02(水) 00:03


 >しかし、DEには何も表示されませんでした。
 DEにデータが必要なら

 Sub test()
     Dim a, i As Long, ii As Long, txt As String, e, n As Long, w, dic As Object
     Set dic = CreateObject("Scripting.Dictionary")
     Columns("f:h").ClearContents: n = 1
     With Cells(1).CurrentRegion.Resize(, 3)
        .Columns("b:c").Copy .Range("d1")
        .Columns("d").Replace " ", "", 2
        a = Application.Index(.Resize(, 5).Value, _
        Evaluate("row(1:" & .Rows.Count & ")"), [{1,4,5}])
     End With
     For i = 2 To UBound(a, 1)
         txt = Join(Array(a(i, 2), a(i, 3)), Chr(2))
         If Not dic.exists(txt) Then
             ReDim w(1 To 3, 1 To 1)
         Else
             w = dic(txt)
             ReDim Preserve w(1 To 3, 1 To UBound(w, 2) + 1)
         End If
         For ii = 1 To 3
             w(ii, UBound(w, 2)) = a(i, ii)
         Next
         dic(txt) = w
     Next
     [f1:h1].Value = a
     For Each e In dic
         If UBound(dic(e), 2) > 1 Then
             n = n + 1
             Cells(n, "f").Resize(UBound(dic(e), 2), 3).Value = _
             Application.Transpose(dic(e))
             n = n + UBound(dic(e), 2)
         End If
     Next
 End Sub

(seiya) 2017/08/02(水) 11:05


(seiya)さま ありがとうございます。
 実行してみました。DE列は表示されました。
 しかし問題が出てしまいました。
 B列の文字間の空白が全角だった場合に重複とみなされないみたいです。
 ご教授お願いいたします。
(狭山) 2017/08/02(水) 16:23

 1行追加してください。

        .Columns("b:c").Copy .Range("d1")
        .Columns("d").Replace " ", "", 2
        .Columns("d").Replace " ", "", 2  '<---★ これ
(seiya) 2017/08/02(水) 16:27

 (seiya)さま ありがとうございました。
 完璧に出来ました。
 .Columns("d").Replace " ", "", 2 の" "間に消したい文字等を入れ
 使用させていただいています。
 効率が良くスムーズで最高です。
 今後もよろしくお願いいたします。

(狭山) 2017/08/02(水) 22:18


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.