[[20190219193146]] 『以前回答で再度の質問について』(エイワン) ページの最後に飛ぶ

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

 

『以前回答で再度の質問について』(エイワン)

 すみません、ご回答頂けるのか不安です。

[[20190215111543]]15:07『マクロコピー貼り付けと重複データの一括処理に』

 これで、質問の回答を頂き、出来上がったと思いました。また、コピーペーストできて、重複削除されたと思いました。
でもこれだと、元データと同じだと気づきました。
 ペーストされたデータが入れ替わっている状態になることを目指していました。

 元のデータを旧だとしたら、新のペーストされたデータと同じものの旧データを削除すること。
重複ているデータの旧データが削除されて、新データが残るようにしたいということをやりたいと思っての質問のつもりでした。
大変恐縮ですが、サンプルを下記に示しましたので、ご回答をお願いできませんでしょうか。よろしくお願い致します。

(もこな2) 2019/02/15(金) 19:06の回答を使わせて頂きました。

     Sub さんぷる()

        Dim 出力先 As Range
        Dim コピー対象 As Range
        Dim i As Long        

        '出力先のセット
        With Worksheets("Sheet2")
            Set 出力先 = .Cells(.Rows.Count, "A").End(xlUp).Offset(1)
        End With        

        '「Sheet1」の操作
        With Worksheets("Sheet1")

            '▼オートフィルタを強制解除して抽出状態をクリア
            .AutoFilterMode = False

            '▼オートフィルタを設定
            .Range("A1").AutoFilter

            '▼B〜O列のいずれも(空白)でない行を抽出
            For i = 2 To 15
                .AutoFilter.Range.AutoFilter Field:=i, Criteria1:="<>"
            Next i

            '抽出された行があれば(見出し行を除いて)コピペ
            If .Cells(.Rows.Count, "A").End(xlUp).Row > 1 Then
                Intersect(.AutoFilter.Range, .AutoFilter.Range.Offset(1), .Range("A:O")).Copy 出力先
            End If
        End With

        '「Sheet2」の操作
        With Worksheets("Sheet2")

            'O列が重複している行を削除
            With .Range("A1", .Cells(.Rows.Count, "A").End(xlUp)).Resize(, 15)
                .RemoveDuplicates Columns:=15, Header:=xlNo
            End With
        End With

    End Sub

(もこな2) 2019/02/15(金) 19:06

列はA3〜O256
番号 新 旧 商品番号 商品名 種別  仕入れ先   評価1 評価2 評価3 合計 順位 備考  内部  外部

 1 A A  01654   hwnN   A	 badbna     88   64	  68	 220	14  a2dfa  148  1
・↓
 27 B B  00052   hwnk	 B	 badbny     63   55	  53	 171	42  as5fa  122  27
・↓
 65 C C  02013  hwnh	 A	 badbta     52  73	  63	 188	35  asdf4  188  65
・↓
103 D D  00483   hwnu	 A	 badlna     27  36	  98	 161	78  9sdfa  151  103
・↓
141 E E  00257  hwne	 B	 brdbna     69  29	  29	 127	88  a2dfa  199  141
・↓
179 F F  00035  hwnp	 B	 bajbna    57  42	  38	 137	97  a6dfa  285  179
・↓
217 G G  00394  hwnq	 A	 bwdbna   43  51	  57	 151	81  asdf7  178  217
・↓
1    G	B  00661   dmvml  A	  mnbcj	      61    56      52 	169	197          220   8←新データ
3    B	G  00328   lkkkf  B       wirfh       83    32      55	170	186          80    33←新データ
5    C	E  00666   oppil  A       Mcvas       64    47      57	168	203          81    13←新データ
7    E	C  07008   knknn  B       tyrt6       66    46      40	152	310          196   25←新データ
9    A	G  00657   aSVJK  B       ghafl       86    52      75  213     23   asdfa   201   4←新データ
11   G	A  00095   ghl    B       sklbc       71    22      70	163	237          27    34←新データ

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


最終歴に残ったデータの並び順に決まりはあるのでしょうか。
例えば、O列昇順であるとか。

(マナ) 2019/02/19(火) 20:40


順番はどうでもよいなら、
sheet2の最下行にコピペでなく
2行目に挿入するとよいと思います。

O列昇順なら
上記に加えて、最後に、並べ替えをするとよいです。

どちらも「マクロの記録」で参考コードが得られます。

(マナ) 2019/02/19(火) 21:24


ちなみにフィルタオプションだとこんな感じになります。
 Sub test2()
    Dim rngS As Range
    Dim rngD As Range
    Dim rngC As Range

    Set rngS = Worksheets("Sheet1").Cells(1).CurrentRegion
    Set rngD = Worksheets("Sheet2").Cells(1).CurrentRegion
    rngD.Offset(1).Copy rngS(1).End(xlDown).Offset(1)
    Set rngC = rngS.Resize(2, 2).Offset(, rngS.Columns.Count + 1)

    rngC(2, 1).Formula = "=counta(a2:o2)=15"
    rngC(2, 2).Formula = "=countif($o$2:o2,o2)=1"

    rngS.CurrentRegion.AdvancedFilter xlFilterCopy, rngC, rngD.Rows(1)

    rngC.ClearContents
    rngS.CurrentRegion.Offset(rngS.Rows.Count).ClearContents

    rngD.CurrentRegion.Sort rngD.Columns("O"), Header:=xlYes

 End Sub

(マナ) 2019/02/19(火) 21:31


 なぜ元のスレで続けないんですか?
 無駄に新規スレを立てないで下さい。

 シート1のA〜O列全てにデータが存在するレコードを、
 シート2の最下行以下にコピペして、
 シート2のすでに存在している旧データの方を削除したい。
 と言う事ですか?

 重複の判断はO列で行うんですか?
 D列の商品番号じゃないの?

 後ご提示のレイアウトですけど、B〜O列全て埋まってるレコードのみ転記してるなら、
 M列の備考欄が空白のレコードは、そもそも転記されないんじゃないですか?

 ご提示のコードは何か凄く無駄が多いです。
 フィルターモードは予め解除させる必要はないし、
 A〜O列まで全て値が埋まってるレコードだけを転記してるなら、
 以下のコードでもご提示のコードと同じ結果になりますよ。

 Sub さんぷる()
    Dim i As Long

    '▼B〜O列のいずれも(空白)でない行を抽出
    With Sheets("Sheet1")
        For i = 1 To 15
            .Range("A:O").AutoFilter Field:=i, Criteria1:="<>"
        Next i

        '抽出された行があれば(見出し行を除いて)コピペ
        .AutoFilter.Range.Offset(1).Copy Sheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Offset(1)
    End With

    'O列が重複している行を削除
    Sheets("Sheet2").Range("A1").CurrentRegion.RemoveDuplicates Columns:=15, Header:=xlNo

 End Sub

(sy) 2019/02/19(火) 21:53


 マナさんからもありますように、
 >sheet2の最下行にコピペでなく 
 >2行目に挿入するとよいと思います。
 元データを行挿入などで新規データより下に持ってきても良いなら、最後普通に重複の削除で削除できますよ。

(sy) 2019/02/19(火) 22:14


 >なぜ元のスレで続けないんですか?
 >無駄に新規スレを立てないで下さい。

すみません、ご回答を頂きすぐに処理を行った時に出来たと、錯覚してしまいました。
質問の仕方も悪かったと思いました。しっかり検証してみるべきでしたが、気づくのが
遅くなってしまいました。ご回答下さってすぐにお礼をと思いました。かえって、ご迷惑を
かけてしまったようで、申し訳ありません。新規スレを立てたこともお詫び致します。
(エイワン) 2019/02/19(火) 23:13


>ご提示のコードは何か凄く無駄が多いです。
>フィルターモードは予め解除させる必要はないし

 あ〜そっか、A列でなにかフィルタ掛けられていたら嫌だなとおもったんですけど、
 2列目からでなく、1列目から抽出しなおせばいいだけですね・・・orz

 AutoFilter.Range.Offset(1).Copy は思いつかなかったです。
 Intersectメソッドに固執しすぎですね・・・

 Sheets("Sheet2").Range("A1").CurrentRegion はまぁそうですよね
 既にSheet2にあるデータがよくわからなかったので、A列最終行を拾いましたけど
 CurrentRegionで取得可能であるなら、そちらの方が断然よいですね。

ご指摘&添削どもです。

(もこな2) 2019/02/20(水) 01:04


 >ご回答を頂きすぐに処理を行った時に出来たと、錯覚してしまいました。
 >しっかり検証してみるべきでしたが、気づくのが遅くなってしまいました。
 これはマクロに慣れてないなら仕方ないので、次からは良く検証するようにしましょう。
 くらいの事なので、あまり気にしなくて良いと思います。

 私が言いたいのは、同じ内容なので元スレで続けましょう。
 と言う事です。

 まぁそんな事よりも、
 一番肝心の、新規データを、旧データより上に持ってきても良いんですか?
 他の私からの質問や、マナさんの並び順に関する事や、ソートしても良いのかとの質問にも返答して下さい。

(sy) 2019/02/20(水) 04:20


以下のことで質問の答えになっていますか。初心者で勉強しながら質問している状態でご迷惑をお掛けして
申し訳ありません。
なお、下記のコードはグループ分けに使っているコードです。

 >最終歴に残ったデータの並び順に決まりはあるのでしょうか。
 >例えば、O列昇順であるとか。
 >順番はどうでもよいなら、
 >sheet2の最下行にコピペでなく
 >2行目に挿入するとよいと思います。
  O列で重複の判断については、これでもいいですが、より正確なのは、商品番号(D列)のほうがより確実かもしれません。
  上でも、後ろでも構わないのですが、後ろの方が普通なのかと言う程度です。
  O列の通し番号は、処理が終わった時点で昇順になっていてほしいとは思っています。

 >シート1のA〜O列全てにデータが存在するレコードを、
   シート1は重複削除後ソートをする前の元データです。
 >シート2の最下行以下にコピペして、
   その通りです
 >シート2のすでに存在している旧データの方を削除したい。
 >と言う事ですか?
   その通りです
     

 >重複の判断はO列で行うんですか?
 >D列の商品番号じゃないの?
   O列で重複の判断については、これでもいいですが、より正確なのは、商品番号(D列)のほうがより確実かもしれません。

 >後ご提示のレイアウトですけど、B〜O列全て埋まってるレコードのみ転記してるなら、
 >M列の備考欄が空白のレコードは、そもそも転記されないんじゃないですか?
   備考(M列)は、そのままのデータ入れ替えができればと思っています。(ないもの同士であれば空欄になります)

 >ご提示のコードは何か凄く無駄が多いです。
      無駄が多いのかもしれませんが、整理して動かなくなるのも心配です。

O列昇順なら
上記に加えて、最後に、並べ替えをするとよいです。

 >一番肝心の、新規データを、旧データより上に持ってきても良いんですか?  
  新データは、元データにも全て存在するもので、要するにグループを入れ替えることが目的ですので、
  このことに支障はないように思いますので、よいと思います。但し、重複を削除する時にどうなのでしょうか。

やりたいこと完成形について

1.新データは、元データにも全て存在するもので、要するにグループを入れ替えることが目的です。
2.並び、順番については、完成形として望んでいることは、A〜Gのグループ(数量・行数は年度で変わることがある)
  でグループごとの合計(K列)の部分で降順であること。
3.種別(F列)のAが先でBがその後になるようにソートできるようにしたいのです。
4.備考(M列)は、そのままのデータ入れ替えができればと思っています。
5.重複の削除は、入れ替えを目的としているため、旧データを削除することで入れ替えになると考えてのことです。
6.O列で重複の判断については、これでもいいですが、より正確なのは、商品番号(D列)のほうがより確実かもしれません。

Sub グループごとにまとめる()

'sheet2でA〜Gグループで分けられるようする

'==宣言など

    Dim i As Long
    Dim buf As String

'==処理

    With ActiveSheet.Rows("3:450")

        '並び替えの実行
        .Sort _
            Key1:=Range("B3"), Order1:=xlAscending, _
            Key2:=Range("D3"), Order2:=xlAscending, _
            Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
            Orientation:=xlTopToBottom, SortMethod:=xlPinYin, _
            DataOption1:=xlSortNormal

        'ActiveSheet.UsedRange と ActiveSheet.Rows("3:316") が交わる範囲だけ値化
        With Intersect(.Parent.UsedRange, .Cells)
            .Value = .Value
        End With

    End With

    With ActiveSheet
        '連続データの生成
        With .Range("A3")
            .Value = 1
            .AutoFill Destination:=.Resize(26), Type:=xlFillSeries
        End With

        For i = 29 To 254 Step 38
            With .Cells(i, "A")
                .Value = 1
                .AutoFill Destination:=.Resize(38), Type:=xlFillSeries
            End With
        Next i

        buf = .Range(.Cells(2, "O"), .Cells(.Rows.Count, "O").End(xlUp)).Address(0, 0)
        .Range("M1").Formula = "=COUNT(" & buf & ")"
    End With
End Sub

(エイワン) 2019/02/20(水) 14:32


 混乱されてるのか、返答の内容が支離滅裂な部分が多いです。

 >O列の通し番号は、処理が終わった時点で昇順になっていてほしいとは思っています。
 >2.並び、順番については、完成形として望んでいることは、A〜Gのグループ(数量・行数は年度で変わることがある)
 >でグループごとの合計(K列)の部分で降順であること。 
 >3.種別(F列)のAが先でBがその後になるようにソートできるようにしたいのです。
 >Key1:=Range("B3"), Order1:=xlAscending, _
 >Key2:=Range("D3"), Order2:=xlAscending, _ 
 これはデータによっては、全部は満足できないと言う事は分かりますか?
 しかも文面とご提示のコードの内容が全く合ってないですよ。
 B、D、F、K、O列の内、本当はどの列でソートしたいんですか?
 流石にいい加減すぎるので、もう一度しっかり考えて、ソートのキーにする列とキーの優先順位を提示して下さい。

 >備考(M列)は、そのままのデータ入れ替えができればと思っています。(ないもの同士であれば空欄になります)
 これは完全に後出しの仕様ですよね。
 現時点で、元スレも含めた全ての回答で、この要件を満たしてるものが1つも無い事は理解されてますか?
 そもそも一番初めのあなたのコードの
 >N = Application.WorksheetFunction.CountA(Range("A" & i & ":O" & i))
 >If N < 15 Then '(貼り付けない。15の時のみこの行を貼り付ける。)
 これ自体が備考欄の空白を許可してないですよ。
 回答者は全員これに基いて回答してるので、全ての回答で備考欄が空白のレコードは転記するようにはなってませんよ。
 まぁ対応は全然可能ですけど、後からコロコロ何度も仕様変更されるのは絶対に避けたいので、お聞きします。
 他にも空白を許可する列は本当に無いですか?
 もう一度入力が必須の列を、しっかり洗い出してから返答して下さい。

 提示されたコードは今回の質問とどう言う関係があるんですか?
 質問である、転記と重複の削除と追加のソートの処理だけを提示したら、後はご自身でご提示のコードと組み合わせるんですか?
 それとも、それも合わせて何とかして欲しいと言う事でしょうか?

 説明頂く時は、手作業で行う手順を、箇条書きで順番に漏れなく記載して頂くのが一番分かりやすいです。 

(sy) 2019/02/20(水) 22:16


D列で重複判定
M列が空欄でも転記
F列昇順、K列降順で並び替え

これで期待する結果とどこが違うか教えていただけませんか?

 Sub test3()
    Dim rngS As Range
    Dim rngD As Range
    Dim rngC As Range

    Set rngS = Worksheets("Sheet1").Cells(1).CurrentRegion
    Set rngD = Worksheets("Sheet2").Cells(1).CurrentRegion
    rngD.Offset(1).Copy rngS(1).End(xlDown).Offset(1)
    Set rngC = rngS.Resize(2, 2).Offset(, rngS.Columns.Count + 1)

    rngC(2, 1).Formula = "=and(counta(a2:l2)=12,counta(n2:o2)=2)"
    rngC(2, 2).Formula = "=countif($d$2:d2,d2)=1"

    rngS.CurrentRegion.AdvancedFilter xlFilterCopy, rngC, rngD.Rows(1)

    rngC.ClearContents
    rngS.CurrentRegion.Offset(rngS.Rows.Count).ClearContents

    rngD.CurrentRegion.Sort key1:=rngD.Columns("f"), order1:=xlAscending, _
                key2:=rngD.Columns("k"), order2:=xlDescending, Header:=xlYes

 End Sub

(マナ) 2019/02/20(水) 22:19


 マナさんのコードですけど、
 シート1、シート2の両方に同じ番号のデータが存在していて、
 且つシート1の方で備考欄以外の列に空白があり、
 今回は転記しない対象になっていた場合は、
 シート2の方のデータも消えてしまいませんか?

 それともそう言うケースは絶対に無いのかな?
 何かそう言うケースは十分あり得るんじゃないかと思いました。

(sy) 2019/02/20(水) 22:35


ご指摘ありがとうございます。確かにそうですね。
商品番号が入力されている行は転記という条件でないとだめですね。

ただ空白が理由で転記しないとうのは、
どんな場合を想定しているのか不明ですね。
あとからデータを埋めて転記するつもりですかね。

(マナ) 2019/02/20(水) 22:54


対応を考えてみましたが、わたしの関数の知識では
条件式をCOUNTIFSにして、空白でないを列挙するくらいです。

(マナ) 2019/02/20(水) 23:11


 数式で対処するのは私も難しいと思います。
 後で重複の削除を実行する方が簡単なので、手順は増えますが以下で良いんじゃないでしょうか。
 データは3行目からみたいですね。

 Sub test3_2()
    Dim rngS As Range
    Dim rngD As Range
    Dim rngC As Range

    Set rngS = Worksheets("Sheet1").Cells(2, 1).CurrentRegion
    Set rngD = Worksheets("Sheet2").Cells(2, 1).CurrentRegion
    rngD.Offset(1).Copy rngS(1).End(xlDown).Offset(1)
    Set rngC = rngS.Resize(2, 1).Offset(, rngS.Columns.Count + 1)

    rngC(2, 1).Formula = "=and(counta(a3:l3)=12,counta(n3:o3)=2)"

    rngS.CurrentRegion.AdvancedFilter xlFilterCopy, rngC, rngD.Rows(1)

    rngC.ClearContents
    rngS.CurrentRegion.Offset(rngS.Rows.Count).ClearContents

    rngD.CurrentRegion.Sort key1:=rngD.Columns("f"), order1:=xlAscending, _
                key2:=rngD.Columns("k"), order2:=xlDescending, Header:=xlYes

    rngD.CurrentRegion.RemoveDuplicates Columns:=4, Header:=xlNo

 End Sub

(sy) 2019/02/21(木) 06:59


毎回、ありがとうございます。
(sy) 2019/02/21(木) 06:59 syさんのコードでやってみました。

実行エラー 1004
抽出した範囲にはフィルド名がないか、または、無効なフィルド名です
このような表示がでました。

rngS.CurrentRegion.AdvancedFilter xlFilterCopy, rngC, rngD.Rows(1)
このコードが黄色になります。

さらに、実行エラーの時の実行結果がsheet1のコピーしようとするデータの
下にコピーが表示がされている状態です。

sheet1・2を逆にしてみましたが、sheet1の既存のデータの上にコピーした
データが挿入されました。既存の元データがAグループは消えてしまっていました。
sheet1が元データ
sheet2が入れ替えるデータ

syさんの 2019/02/20(水) 22:16のことについては、今後

 >説明頂く時は、手作業で行う手順を、箇条書きで順番に漏れなく記載して頂くのが一番分かりやすいです。
ということを含めて、説明したいと思います。但し、正直、初心者でして、時間がかかると思いますが、
ご了解下さい。すみません、申し訳ありません。 

(エイワン) 2019/02/21(木) 13:25


 私のコードでは無いです。
 アイデアもコードを書いてくれたのも、マナさんの功績です。

 私はある特定条件下では不具合が起きそうな部分の修正案を提示させて頂いただけです。

 本題に戻して、
 その行でそのエラーが出ると言う事は以下のような原因が想定されます。

 ・項目欄に結合セルがある
 ・項目欄に空白がある
 ・複数列で同じ項目名を使用している。
 ・シート1とシート2の項目名が違う。

 何れかに該当していませんか?

 >実行エラーの時の実行結果がsheet1のコピーしようとするデータの 
 >下にコピーが表示がされている状態です。
 それは問題ありません。

 >sheet1・2を逆にしてみましたが、sheet1の既存のデータの上にコピーした 
 >データが挿入されました。既存の元データがAグループは消えてしまっていました。 
 ちょっと何言ってるか分かりません?
 シートを逆にしたらエラーにはならなかったんですか?

 (sy) 2019/02/21(木) 06:59 でお借りした、マナさんのコードが何をしてるか説明すると、
 1、シート2のデータを、シート1のデータの下にコピペ(これで新データが上、旧データが下に並ぶ)
 2、1のデータを、フィルタオプションで備考以外が全て入力されている行だけをシート2にコピペ
 3、シート1から、1でシート2からコピペしたデータだけを消去
 4、シート2の抽出結果を、F列昇順、K列降順の優先順位でソート
 5、最後に重複データを削除
 と言う流れなので、2の時点でエラーになってるので、シート1のデータの下にシート2のデータが
 残ったままになってるだけです。
 エラーにならずに最後まで実行されれば、それらのデータは3の手順で消去されます。

(sy) 2019/02/21(木) 21:31


 もう一つエラーになりそうな原因がありました。
 ・項目欄に複数行使用している(1と2行目両方項目として使用している)

(sy) 2019/02/21(木) 21:34


 返信無いけど
 >1.新データは、元データにも全て存在する
 これはシート1とシート2のデータは商品番号などは全て同じで、
 評価欄など一部の数値データだけを更新したいと言う事でしょうか?

 もしそうならデータをコピペする必要も無いですよね。

 二度手間は嫌いなので本当は憶測でコード書きたくないけど、会話だけでは解決しそうにも無いので、
 以下のコードで不具合があれば言って下さい。

 Sub test4()
    Dim r1 As Range, r2 As Range

    Set r1 = Sheets("Sheet2").Range("O3", Sheets("Sheet2").Range("A" & Rows.Count).End(xlUp))

    With r1.Offset(, 15).Resize(, 2)
        .Columns(2).Formula = "=IFERROR(MATCH(D3,Sheet1!D:D,0),"""")"
        .Columns(1).Formula = "=IF(COUNTA(INDEX(Sheet1!A:L,Q3,0))+COUNTA(INDEX(Sheet1!N:O,Q3,0))=14,Q3,"""")"
        .Value = .Value

        Set r2 = .Columns(1).SpecialCells(xlCellTypeConstants).EntireRow
        Intersect(r2, r1).Formula = "=INDEX(Sheet1!A:A,$P3)"
        Intersect(r2, r1.Columns(13)).Formula = "=INDEX(Sheet1!M:M,$P3)&"""""
        r1.Value = r1.Value

        .ClearContents
    End With

    r1.Sort key1:=r1.Columns(6), order1:=xlAscending, _
            key2:=r1.Columns(11), order2:=xlDescending, Header:=xlNo

 End Sub

(sy) 2019/02/23(土) 13:30


 >二度手間は嫌いなので本当は憶測でコード書きたくないけど、会話だけでは解決しそうにも無いので、
    すいません。
    いつもいつも謝ることからで申し訳ありません。今日も色々と試していました。
  会話をしているつもりですが、初心者でそれぞれのコードをよく考えないとわからず
  ご迷惑をお掛けします。 

 >・項目欄に結合セルがある
 >・項目欄に空白がある
 >・複数列で同じ項目名を使用している。
 >・シート1とシート2の項目名が違う。
 全てやってみました。
 どれも該当していないようなので、困っていたところでした。
 気分を変えて、再度復習しようとして見たところでした。

 >1.新データは、元データにも全て存在する
 >これはシート1とシート2のデータは商品番号などは全て同じで、
 >評価欄など一部の数値データだけを更新したいと言う事でしょうか?
   新データ(sheet1)は、元データ(sheet2)にも全て存在します。
  (それぞれの商品の同じものを、A〜Gグループで入れ替えるだけです)
  新データと言っても全て同じものが存在していて、
  それを入れ替えるだけです。
  (旧グループから削除して、新しいグループにする)
  更新ではなく、グループをかえる、入れ替えるだけのことです。

 本日の回答で実施しましたが、sheet2に入れ替えの結果が表示されましたが、
 3行目〜52行目までが「0」で表示され、行が下に押されている状態。
 その後はまとまっていたグループがバラバラの表示という結果でした。
 (表題などを2行入れていることも考慮して頂いていると思いました)
 sheet1にも項目の一行を入れております。
 また、空欄をなくしても見ました。結合もありません。

(エイワン) 2019/02/23(土) 23:50


 >3行目〜52行目までが「0」で表示され、行が下に押されている状態。
 うーん???
 データのレイアウトや内容が?こちらの想定と微妙に違うみたいですね?

 >(表題などを2行入れていることも考慮して頂いていると思いました)
 それは考慮してますよ。
 1行目と2行目に項目名を2段に分けて記載してると言う事ですよね。

 >sheet1にも項目の一行を入れております。
 これの意味がよく分かりません?
 シート1は1行だけ項目があって、シート2は2行に分かれてると言う事ですか?
 なら以下に該当しますよね。
 >>・シート1とシート2の項目名が違う。
 そう言う事では無いんですか?

 >(それぞれの商品の同じものを、A〜Gグループで入れ替えるだけです)
 このA〜Gグループと言うのはBとC列の事ですよね?
 >(旧グループから削除して、新しいグループにする)
 >更新ではなく、グループをかえる
 これって商品番号とかの基礎情報はそのままに、グループ名や評価などの数値情報だけを、
 旧のシート2の情報から、新のシート1の情報にするって事じゃ無いんですか?
 それを更新と言います。
 あなたの言う入れ替えると言うのは、更新と何が違うんですか?

 どうもあなたの中での単語や表現が、私と食い違いが大きいみたいですね。
 同じ文面を見ても、全く違う解釈になってるのが、ここまで解決しない原因ですね。

(sy) 2019/02/24(日) 07:50


 一旦もう一度、初めから要件を整理させて下さい。

 シート1、新データ。
 シート2 旧データ。

 シート1とシート2のデータ数は同じ。
 シート1が100件なら、シート2も100件

 シート1とシート2の商品番号は全て同じ。
 どちらかに存在して、もう片方に存在しない商品番号は無い。

 同じシート内で重藤する商品番号は無い。
 要は同じ商品番号は、シート1とシート2、それぞれに1つづつしか存在しない。

 項目(表題の方が分かりやすいのかな)は、1行目と2行目の2段に分かれて入力されている。
 項目行(1行目と2行目)の中に結合セルは1つも存在しない。

 3行目からデータ範囲

 商品番号、商品名、外部 のデータは新旧で変更される事はない。
 重複判定に使用可能。
 これは他にも新旧で絶対に変更されない項目が他にもあるなら全部提示して下さい。

 データを更新する(入れ替える)シート1側の新データは、A〜O列まで全て埋まってるデータのみ、
 シート2の同じ商品番号のデータを変更する。

 備考欄(M列)のみ空白になる事がある。
 M列以外に空白があった場合は、その行のデータは変更されない。

 データが更新された後に、F列の種別を昇順、K列の合計を降順、でソートする。

 A列が空白になる事は絶対に無い。
 最終行判定はA列で行えば間違いは無い?

 このような仕様で間違いないですか?

(sy) 2019/02/24(日) 08:24


 おはようございます。

 もう少し解決しそうですし、、どうしようかなと思ったのですが、

 一番最初にお答えしているのは私だったんですね(^^;

 で、もしも、、トピ主さんがよければなんですが、、

 ↓ここにちょっとふざけた名前のコードがありますから、

 そのSheet1とSheet2のシートモジュールに貼り付けてUpしてみませんか?

[[20190108133640]]

 無理にとは言いませんし、、嫌なら全然、、無視して頂いて構いません。

 もしも、Upするときは、、量が多いと駄目みたいなので50行ぐらいで、、お願いします。

 Before After が分かればいいだけですから、、、個人情報などは、、

 〇◇▼☆に置き換えていただければよろしいかと、、、

 あくまでも、、もしも、、よければ、、、、、の話です。

 お邪魔しました。。。では、では、m(__)m
(SoulMan) 2019/02/24(日) 09:16

ありがとうございます、回答致します。これでわかりますか、よろしくお願い致します。

 >シート1、新データ。
 >シート2 旧データ。
   その通りです。
   シート1、入れ替えるための新しいデータ
   シート2 入れ替える前の既存のデータ

 >シート1とシート2のデータ数は同じ。
 >シート1が100件なら、シート2も100件
  シート1は20〜150件と変動します、シート2は250〜300件でほどです。 

 >シート1とシート2の商品番号は全て同じ。
 > どちらかに存在して、もう片方に存在しない商品番号は無い。
  その通りです

 > 同じシート内で重複する商品番号は無い。
 > 要は同じ商品番号は、シート1とシート2、それぞれに1つづつしか存在しな
い。
  その通りです 

 > 項目(表題の方が分かりやすいのかな)は、1行目と2行目の2段に分かれて入力されている。
 > 項目行(1行目と2行目)の中に結合セルは1つも存在しない。
  項目行はシート1は1行です、シート2は2行です。

 > 3行目からデータ範囲
  シート1は2行目からです、シート2は3行目からです。

 >商品番号、商品名、外部 のデータは新旧で変更される事はない。
 >重複判定に使用可能。
  その通りです 
 >これは他にも新旧で絶対に変更されない項目が他にもあるなら全部提示して下さい。
 >商品番号 商品名 種別  仕入れ先   評価1 評価2 評価3 合計 順位 備考  内部  
  以上が絶対に変更されない項目です 
 番号 新 旧 外部
  これは、シート1からコピペして重複削除後のシート2になった時に変更されて完成形になると変更することになります。
  A〜Gグループのまとまりの行数が毎月・毎年変わります。
  この事があるため、Sub グループごとにまとめる()のコードを提示しました。 
  また、A〜GグループがH・Iまで加わることがあります。

 >データを更新する(入れ替える)シート1側の新データは、A〜O列まで全て埋まってるデータのみ、
 >シート2の同じ商品番号のデータを変更する。
  その通りです

 >備考欄(M列)のみ空白になる事がある。
 >M列以外に空白があった場合は、その行のデータは変更されない。
  ここには、「特になし」の文言を全て入れることで解消しました

 >データが更新された後に、F列の種別を昇順、K列の合計を降順、でソートする。
  その通りです
  但し、A〜G(H・I)グループ内でソートです

 >A列が空白になる事は絶対に無い。
 >最終行判定はA列で行えば間違いは無い?
  その通りです

 >このような仕様で間違いないですか?
  質問の回答を全てしたつもりです

シート2の使用例です(備考の空欄には、特になしが入ります)

 列はA3〜O256(データにより、行数が増える可能性はあります)

番号 新 旧 商品番号 商品名 種別------仕入れ先-----評価1 評価2 評価3 合計 順位 備考  内部  外部

 1 A A  01654   hwnN   A	 badbna      88   64     68      220   14  a2dfa  148  1
 6  A  A   00657   aSVJK  B       ghafl        86     52     75       213   23   asdfa   201   4←既存の削除せれるべきデータ
 9  A  G   00657   aSVJK  B       ghafl        86     52     75       213   23   asdfa   201   4←新データ
・↓
 27 B B  00052   hwnk	 B	 badbny      63   55     53	     171   42  as5fa  122   27
 35  B  B  00328   lkkkf  B       wirfh        83     32     55	      170   186          80    33←既存の削除せれるべきデータ
 3   B	G  00328   lkkkf  B       wirfh        83     32     55	      170   186          80    33←新データ
・↓
 65 C C  02013  hwnh	 A	 badbta       52     73   63	     188   35  asdf4  188   65
 73  C  C  00666   oppil  A       Mcvas        64     47     57	      168   203          81    13←既存の削除せれるべきデータ
 5   C  E  00666   oppil  A       Mcvas        64     47     57	      168   203          81    13←新データ
・↓
103 D D  00483   hwnu	 A	 badlna       27     36     98	     161   78  9sdfa  151  103
・↓
141 E E  00257  hwne	 B	 brdbna     69  29	  29	     127   88  a2dfa  199  141
148  E  E  07008   knknn  B       tyrt6       66    46      40	      152   310          196   25←既存の削除せれるべきデータ
 7   E  C  07008   knknn  B       tyrt6       66    46      40	      152   310          196   25←新データ
・↓
179 F F  00035  hwnp	 B	 bajbna    57  42	  38	     137   97  a6dfa  285   179
・↓
217 G G  00394  hwnq	 A	 bwdbna   43  51	  57	     151   81  asdf7  178   217
233  G  G  00661   dmvml  A	  mnbcj	      61    56      52 	      169   197          220   8←既存の削除せれるべきデータ
218  G	G  00095   ghl    B       sklbc       71    22      70	      163   237          27    34←既存の削除せれるべきデータ
1    G	B  00661   dmvml  A	  mnbcj	      61    56      52 	      169   197          220   8←新データ
11   G	A  00095   ghl    B       sklbc       71    22      70	      163   237          27    34←新データ
・↓
番号 新 旧 商品番号 商品名 種別  仕入れ先   評価1 評価2 評価3 合計 順位 備考  内部  外部
1    G	B  00661   dmvml  A	  mnbcj	      61    56      52 	      169   197          220   8←新データ
3    B	G  00328   lkkkf  B       wirfh       83    32      55	      170   186          80    33←新データ
5    C	E  00666   oppil  A       Mcvas       64    47      57	      168   203          81    13←新データ
7    E	C  07008   knknn  B       tyrt6       66    46      40	      152   310          196   25←新データ
9    A	G  00657   aSVJK  B       ghafl       86    52      75        213   23   asdfa   201   4←新データ
11   G	A  00095   ghl    B       sklbc       71    22      70	      163   237          27    34←新データ
↑
シート1の使用例です

(エイワン) 2019/02/24(日) 12:04


SoulManさん[[20190108133640]]の質問の回答を見せて頂きました。すぐに分かるものでもなさそうですので、考えてみます。ありがとうございます。
(エイワン) 2019/02/24(日) 12:19

データを更新しないのはどんな場合でしょうか?

 >>データを更新する(入れ替える)シート1側の新データは、A〜O列まで全て埋まってるデータのみ、
 >>シート2の同じ商品番号のデータを変更する。
 >  その通りです

提示いただいたのは、全て更新する例のみです。
Sheet1で、A〜O列にデータの欠落がある例も含めると理解しやすいです。

更新するのは

 > 番号 新 旧 外部

と、備考の 5項目だけですよね?
それらは、手入力で修正ですか。

で、そのデータの欠落した行があるのは、作業者のミスによるもので、
本来は、全てデータが埋まっているべきものなのでしょうか。
だとすると、マクロ実行前に、何らかの注意喚起が必要ないのでしょうか。

(マナ) 2019/02/24(日) 13:23


 何か会話に疲れてきた。

 >シート1は20〜150件と変動します、シート2は250〜300件でほどです。
 これってシート2にはあるけどシート1に無い場合か、シート2に重複が無いと件数が違う事は無いですよね。

 この回答と以下は矛盾してる事は分かりますか?

 >>シート1とシート2の商品番号は全て同じ。
 >> どちらかに存在して、もう片方に存在しない商品番号は無い。
 >その通りです
 >> 同じシート内で重複する商品番号は無い。
 >> 要は同じ商品番号は、シート1とシート2、それぞれに1つづつしか存在しない。
 >その通りです 

 シート1の方がシート2より件数が少ないと言う事は、以下のどちらかに該当してると言う事ですよね。
 言ってる意味は分かりますか?

 ・シート2に存在してシート1に存在しない商品番号がある。
 >> どちらかに存在して、もう片方に存在しない商品番号は無い。
 このパターンなら上記に反しています。

 もしくは、
 ・シート2の商品番号には重複がある。
 >> 同じシート内で重複する商品番号は無い。
 >> 要は同じ商品番号は、シート1とシート2、それぞれに1つづつしか存在しない。
 此方のパターンなら上記に反してますよね。

 >項目行はシート1は1行です、シート2は2行です。
 これで何で(エイワン) 2019/02/23(土) 23:50 の返答で
 >>・シート1とシート2の項目名が違う。
 >どれも該当していないようなので、困っていたところでした。
 になるんですか?
 1行と2行なら、項目名は違うじゃないですか。
 なんで同じなんて返答になるんですか?

 いい加減な返答ばかりしないで下さい。
 マクロやEXCEL初心者とか以前の問題です。
 日本語での会話が成立してないですよ。

 それと提示のレイアウトを見る限りでは、結局の所シート1とシート2で同じ商品番号のデータは、
 転記前は、A〜C列の内容が違うだけですか?
 O列は転記前は同じなんですよね?
 シート2の同じ商品番号のA〜C列を書き換えたら、旧データを上にして重複削除を行った結果と同じになるんじゃないの?

 ただ何れにしても、test4のコードはシート1の項目内容やデータ開始行は実行に影響しないので、
 ソートは後出し仕様のせいで望む並びとは違いますが、
 A〜C列の値は問題無く新の値に更新はされる筈ですけど。

 >3行目〜52行目までが「0」で表示され
 これはコードを実行する前の元々のシート2データに存在してませんか?
 test4は検索値が見つからない場合は、#REF!エラーになるので、0が表示される事は有り得ないんですけど。

 >>データが更新された後に、F列の種別を昇順、K列の合計を降順、でソートする。
 >その通りです
 >但し、A〜G(H・I)グループ内でソートです
 このグループと言うのはB列の事?
 あなただけしか分からない言葉は使わないで下さい。

(sy) 2019/02/24(日) 16:16


ちょっと待って頂けませんか。整理して、分かりやすくすることを考えてみます。
やりたいことを含めて、伝えやすくしますので、少し時間を下さい。
よろしくお願いします。
(エイワン) 2019/02/25(月) 23:07

大変、誠にご迷惑をお掛けしています。自分だけがわかっていて質問していることも、さることながら質問の
回答までこんな状態ですみません。

そこで、必要だと思えるところのA列B列C列D列O列を使ったサンプルのデータを示すようにしましたので、
この後のところで、参照して頂けますか。なお、D・E・F・G・H・I・J・K・L・M・Nのそれぞれの列は、
データの内容が変わることがありません。

次ぎに、どのようなデータで、どのようなことをマクロでさせたいのかをまとめてみました。

前提のデータ等の説明とやりたいことについて

シート1とシート2にデータがあります。

シート2について

1.現在のところ、A26件(行)・B・C・D・E・F・Gそれぞれ38件(行)あって、A列〜O列で全てで254件(行)
のデータがシート2にあります。
(これが、B列・C列のA〜GがA〜Gグループの意味です)
2.B列の新とC列の旧は入れ替え前は同じアルファベットです。

シート1について

入れ替えるための準備として、別のシートで前段階を作成して、シート1のシートが出来上がっています。

例で言うと
マクロでなく手作業でするとして、入れ替えを、コピペで処理するとしたら、シート2の中のGグループの
入れ替えたいものをコピーして、シート2の中のBグループの入れ替えたい行に貼り付けをする。
これを、マクロでやろうとして、シート1の準備のデータを事前に作って、入れ替えをしようとしました。

サンプルのデータで言うと、
1.シート1の1の行「1のGとB」で言うと、G列のこのデータをB列にもって行く、
シート1の3の行「3のBとG」で言うと、B列のこのデータをG列にもって行く
つまり入れ替えるということです。

2.このようにすると、シート2にシート1からのものと同じもの(但し、B列が異なる以外同じデータ)が、
1つずつ増えることになるので、どちらかを削除しなくてはならないので、当然シート1のものを生かして、
シート2は削除することにするようなマクロを作成したいということです。

3.シート1のデータをシート2の最後の行から、コピペの手作業で追加処理しています。これも、マクロ処理が
できたらと思っています。

前回の質問についての回答は以下の通りです。

 >シート1は20〜150件と変動します、シート2は250〜300件でほどです。

 >これってシート2にはあるけどシート1に無い場合か、シート2に重複が無いと件数が違う事は無いですよね。

  全てを入れ替えるのでなく、一定の入れ替えしたい同じデータを入れ替え  るので、その時、その時でシート1は
  20〜150件と変動するとしました。
  シート2については、「前提のデータについて」で示した通りのことで   す。シート2で完成したら、
  「前提のデータについて」の通り、同じデータを入れ替えるだけなので、  件数はシート2は増えません。
  254件だったら、そのままです。

 >>シート1とシート2の商品番号は全て同じ。
 >> どちらかに存在して、もう片方に存在しない商品番号は無い。
 >その通りです
 >> 同じシート内で重複する商品番号は無い。
 >> 要は同じ商品番号は、シート1とシート2、それぞれに1つづつしか存在しない。
 >その通りです 

 > シート1の方がシート2より件数が少ないと言う事は、以下のどちらかに   該当してると言う事ですよね。

  > 言ってる意味は分かりますか?
 >・シート2に存在してシート1に存在しない商品番号がある。
 >> どちらかに存在して、もう片方に存在しない商品番号は無い。
 このパターンなら上記に反しています。
 もしくは、
 ・シート2の商品番号には重複がある。
 >> 同じシート内で重複する商品番号は無い。
 >> 要は同じ商品番号は、シート1とシート2、それぞれに1つづつしか存在しない。
 此方のパターンなら上記に反してますよね。

 シート2は既存のデータを元にして、シート1はあくまでも、シート2から同じデータを使って入れ替えだけする
のですから同じデータでなければ、新しい商品番号のデータを入れれば、254件よりも増えてしまいますので
それはありません。

 >前提について」で書きました通り、質問の最初の段階で全体のことを話していなかったこと、
大変申し訳ありません。言われることは、もっともですが、前提のデータで考えて頂けるとわかって貰えると思いますが、如何ですか。

 >いい加減な返答ばかりしないで下さい。
 >マクロやEXCEL初心者とか以前の問題です。
 >日本語での会話が成立してないですよ。

       すみません。日本語の使い方や説明がへたくそですね。反省します。

 >それと提示のレイアウトを見る限りでは、結局の所シート1とシート2で同じ  商品番号のデータは、
 >転記前は、A〜C列の内容が違うだけですか?
 >そういうことになります

 >O列は転記前は同じなんですよね?
 >そういうことになります

 >シート2の同じ商品番号のA〜C列を書き換えたら、旧データを上にして重複削除を行った結果と同じになるんじゃないの?
 >ただ何れにしても、test4のコードはシート1の項目内容やデータ開始行は実行に影響しないので、
 >ソートは後出し仕様のせいで望む並びとは違いますが、
 >A〜C列の値は問題無く新の値に更新はされる筈ですけど。

 >3行目〜52行目までが「0」で表示され
 これはコードを実行する前の元々のシート2データに存在してませんか?
 test4は検索値が見つからない場合は、#REF!エラーになるので、0が表示される事は有り得ないんですけど。

 >>データが更新された後に、F列の種別を昇順、K列の合計を降順でソートする。
 >その通りです
 >但し、A〜G(H・I)グループ内でソートです
 >このグループと言うのはB列の事?
 >あなただけしか分からない言葉は使わないで下さい。
       前提のデータ等の説明とやりたいことについてのところの説明とサンプルのデータでご理解頂けませんでしょうか。 

(エイワン) 2019/02/28(木) 17:02


このデータは、マクロで入れ替え処理するために、
必要なところを使ってサンプルを作成してみました。

  

    Bの00275の商品をGに移動して、
    Gの02047の商品をBに移動する。
         (この2つの商品を入れ替える)

1 原本

 1 シート2のデータの後に、シート1のデータを
  貼り付けた状態です。
 2 但し、シート2の後に、シート1のデータを
  貼り付ける状態をマクロで処理して、原本
  としたい

2 旧の列(C列)を基準にして昇順のソートをする

   2〜3の完成形を下記に表示した

3 新の列(B列)・旧の列(C列)と商品番号の同じものを一括削除する

 1 (入れ替えが完了する)
 2 (旧列(C列)を基準にA〜Gがまとまった状態にする)
 3 3の完成形を下記に表示した

4 旧列(C列)を基準にA〜Gのそれぞれのまとまりの合計を降順でソートする
5 旧列(C列)を基準にA〜Gのそれぞれのまとまりで番号の列に昇順の番号をつける
6 外部Noの列の全てのデータに1〜昇順の番号をつける

      (INT(ROW()-1)の関数処理でもよいでしょうか)
  1 (正しく、入れ替えになっているかを新旧の列で確認する)
  2 4〜6の完成形を下記に表示した

(エイワン) 2019/02/28(木) 17:04


シート1は、どのような手順で作成しているのですか。
箇条書きで説明お願いします。

(マナ) 2019/02/28(木) 18:16


シート1を使わないで、
シート2のB列を手作業で直接編集して

マクロは
1)並べ替え
2)B列、C列を更新

ではだめなのでしょうか。

(マナ) 2019/02/28(木) 18:24


こんな感じで、入れ替え対象を
一時的に、下に移動させ編集すると
そもそも重複は発生しないので、
並べ替えるだけでよいのでは?
  
A列----B列--C列--D列--------O列
番号---新---旧---商品番号---外部No
1------A----A----00891------1
2------A----A----00511------2
  ここのデータは下に移動
2------B----B----00398------4
1------C----C----00520------5
2------C----C----00522------6
1------D----D----00612------7
2------D----D----00655------8
1------E----E----00659------9
2------E----E----00677------10
1------F----F----00125------11
2------F----F----00573------12
  ここのデータは下に移動
2------G----G----02001------14
1------G----B----02047------13←入れ替え対象(上から移動)
3------B----G----00275------3←入れ替え対象(上から移動)

(マナ) 2019/02/28(木) 18:36


  >シート1は、どのような手順で作成しているのですか。
  >箇条書きで説明お願いします。

   次のようにやっています、後から検証するためです

sheet2のO列の通し番号を利用して、入れ替えの番号と商品番号を確認する

サンプルのGとBについて

sheet3を設定してのO列の通し番号を利用して、該当番号を入力する。

sheet2のO列の通し番号を対象の番号を2行に分けて入力(G・B)

sheet2のO列の通し番号を対象の番号の逆を2行に分けて入力(B・G)

sheet2のVLOOKUPで該当行ごとのD列〜O列の全てのデータを取得

sheet3に1行目でB列にGだけのD列〜O列の全てのデータを取得

sheet3に2行目でB列にBだけのD列〜O列の全てのデータを取得

sheet3に3行目でB列にBだけのD列〜O列の全てのデータを取得

sheet3に4行目でB列にGだけのD列〜O列の全てのデータを取得

sheet1に1行目でB列にG、C列にB。GだけのD列〜O列の全てのVLOOKUPでデータを取得

sheet1に3行目でB列にB、C列にG。BだけのD列〜O列の全てのVLOOKUPでデータを取得

 >シート1を使わないで、
 >シート2のB列を手作業で直接編集して 
 >こんな感じで、入れ替え対象を
 >一時的に、下に移動させ編集すると
 >そもそも重複は発生しないので、
 >並べ替えるだけでよいのでは?
  勝手なことを言いましてすみません。 
   これも、なるほどと思いますが、後からの検証がどうでしようか。
 件数が多くなると、どうしても手作業だと間違いが起こりそうな
 気がするので、このようなマクロができないものかと思いました。
 会議の途中等でやることがあったりで、間違いを少なくする狙いも
 あります。私の操作ミスもおこりがちなものですから。 

(エイワン) 2019/02/28(木) 22:37


では、
 1)Sheet1に移動させ編集し、
 2)編集後、Sheet2の最下行の下にコピーペースト
 3)並べ替え

これなら、検証もできませんか

(マナ) 2019/02/28(木) 22:52


 >前提のデータ等の説明とやりたいことについてのところの説明とサンプルのデータでご理解頂けませんでしょうか。 
 申し訳ありませんが、のんびり他人の業務内容の部分まで把握するのに費やせるほど時間的に余裕はありません。
 それにあなたの業務内容に興味も無ければ、知ったところで私には何のメリットも無いです。

 はっきり言うと、あなたの今までの説明は今回の質問の回答をする為に全く必要ない情報が9割以上占めてます。
 本当に必要な情報は、一例を挙げると、
 ソートに関しては、(エイワン) 2019/02/28(木) 17:04 の
 >旧の列(C列)を基準にして昇順のソートをする 
 この一言と、(エイワン) 2019/02/20(水) 14:32 の
 >合計(K列)の部分で降順
 >種別(F列)のAが先でBがその後になるようにソート
 この一言だけで、分かりますよね。
 後必要なのは優先順位くらいですよね。
 それ以外の長い説明は一切ない方が良いです。

 何の操作をしたいのか(ソート)と、どの列と言う位置情報(C,F、K列)が一番重要で、それだけが欲しいんです。
 たった2文字(C列)を明記するだけで相手に100%正確に伝わるのに、それをわざわざ前後の文章で推測させないで下さい。
 前後の文章で推測は、寧ろ余計な情報が多すぎて誤解を生む原因にしかなりません。

 でもやはり最後にご提示いただいたサンプルデータでも、此方で検証する限りでは、ソートの並び順以外はtest4で問題無く出来てますよ。

 あっ!そうか!
 >sheet1に1行目でB列にG、C列にB。GだけのD列〜O列の全てのVLOOKUPでデータを取得 
 シート1のデータは数式でシート2から参照してるんですか?
 シート1のD列が数式なので循環参照になってたみたいですね。

 シート1の数式を全て値に変更しても良いですか?

(sy) 2019/03/01(金) 07:13


質問の仕方に大きな問題があり、私の回答にも不適切なことばかりだったと感じています。

ご指摘ありがとうごさいます。よろしくお願い致します。
(エイワン) 2019/03/01(金) 08:13


回答をし忘れました。すみません。 
 >シート1の数式を全て値に変更しても良いですか?
   VLOOKUPのデータは、シート2の最後の行からコピー貼り付けするので、
  値に変更する必要があると思います。 

(エイワン) 2019/03/01(金) 10:36


 0が表示される件は、私のコードに問題がありました。
 申し訳ありません。
 ソートの部分がまだ意図する並びになるか分かりませんが、以下で試してみて下さい。

 Sub test4_2()
    Dim r As Range, sh As Worksheet

    Set sh = Sheets("Sheet2")
    Set r = sh.Range("O3", sh.Range("A" & Rows.Count).End(xlUp))

    r.Columns(17).Formula = "=IFERROR(MATCH(D3,Sheet1!D:D,0),"""")"
    r.Columns(16).Formula = "=IF(COUNTA(INDEX(Sheet1!A:L,Q3,0))+COUNTA(INDEX(Sheet1!N:O,Q3,0))=14,Q3,"""")"
    r.Offset(, 15).Value = r.Offset(, 15).Value

    r.Columns(16).SpecialCells(xlCellTypeConstants).Offset(, -13).FormulaR1C1 = "=INDEX(Sheet1!C,RC16)"
    r.Columns(3).Value = r.Columns(3).Value

    r.Offset(, 15).ClearContents

    With sh.Sort
        .SortFields.Clear
        .SortFields.Add2 Key:=sh.Range("C3"), Order:=xlAscending
        .SortFields.Add2 Key:=sh.Range("F3"), Order:=xlAscending
        .SortFields.Add2 Key:=sh.Range("K3"), Order:=xlDescending
        .SetRange r
        .Header = xlNo
        .Apply
    End With

    r.Columns(1).Formula = "=COUNTIF(C$3:C3,C3)"
    r.Columns(15).Formula = "=ROW(A1)"
    r.Value = r.Value

 End Sub

 ソートのキーになる列は、コード中の以下の行で設定してます。
        .SortFields.Add2 Key:=sh.Range("C3"), Order:=xlAscending
        .SortFields.Add2 Key:=sh.Range("F3"), Order:=xlAscending
        .SortFields.Add2 Key:=sh.Range("K3"), Order:=xlDescending
 Range("C3")とかのC3はC列を表しています。
 ですので、中の列を表すアルファベットを変更すれば、キーの列を変更できます。
 上記は1行で、1列分のキーをセットしてるので、例えばF列が必要無ければ、
        .SortFields.Add2 Key:=sh.Range("F3"), Order:=xlAscending
 この行を1行削除して下さい。
 逆にキーを増やしたければ、同じように行を増やすだけです。
 xlAscending は昇順、xlDescending は降順です。

 ソート部分は上記の手順で変更可能なので、意図する結果になるように変更して下さい。

(sy) 2019/03/02(土) 08:38


ありがとうございます。このコードで実行してみました。

すると、つぎのコードがエラーになります。
.SortFields.Add2 Key:=sh.Range("C3"), Order:=xlAscending
  実行時エラー438
  オブジエクトはこのプロパティまたはメソッドをサポートしていません
 このようなエラーがでますが、どのような修正が必要でしょうか。 

それと、次のことは難しいのでしようか、お伺いします。

 >2 但し、シート2の後に、シート1のデータを
 > 貼り付ける状態をマクロで処理して、原本としたい
 シート1のデータを、シート2に貼り付けるのは
 どのようにしたらよいでしょうか。

(エイワン) 2019/03/02(土) 17:20


自分で修正をして見ました。これでよいでしょうか
重複の削除はできていませんが、どのようにしたらよいでしょうか。
どのように追加が必要でしょうか。

.SortFields.Add2 Key:=sh.Range("C3"), Order:=xlAscending

   上記を以下のように修正でいいでしょうか 
        (バージョンがExcel2013だからでしょうか)
.SortFields.Add Key:=sh.Range("C3"), Order:=xlAscending 

 >3 新の列(B列)・旧の列(C列)と商品番号の同じものを一括削除する 
   重複のものの削除はどのようにすればでしょうか

(エイワン) 2019/03/02(土) 18:41


 しまった。
 すいません、互換性を意識してませんでした。

 3行とも add2 を add に変更お願いします。

 >2 但し、シート2の後に、シート1のデータを
 > 貼り付ける状態をマクロで処理して、原本としたい
 >重複の削除はできていませんが、どのようにしたらよいでしょうか。 
 >どのように追加が必要でしょうか。 

 なぜ重複の削除の話が出てくるんだろう?
 また何か余計な事をしてませんか?

 あなたの希望手順で言う、シート1のデータをコピーして、同じ商品番号のシート2データを削除の部分は、
 私のコードでは、直接シート2のデータを、シート1のデータに書き換えします。

 コピー、重複の削除と言う2ステップを、同じデータの書き換えと言う1ステップで行っています。

 なので重複の削除は必要ありませんし、シート1からコピーするコードなどを勝手に追加しては駄目ですよ。

(sy) 2019/03/02(土) 19:27


(sy) 2019/03/02(土) 19:27の言われることわかりました。そのまま使ってやってみました。
結果としては、シート1のデータが最後残るのであれば、入れ替わっている状態になるはずですが、syさんのものを
使ってやりました。しかし、どうもシート2が残ってシート1が削除されているようです。つまり、入れ替えができて
いない結果のようです。
再度、検証してみますが、時間を少し下さいませんか。やり方を間違っているかもしれません。再度、ご報告致します。
(エイワン) 2019/03/03(日) 00:01

 >どうもシート2が残ってシート1が削除されているようです。

 (エイワン) 2019/02/28(木) 17:04 のサンプルを拝見する限り、C列のみが違ってるだけですよね。

 なのでtest4_2のコードは、C列の旧のグループ名のみ、シート1のデータに書き換えています。
 その後、C・F・K列でソートして、A列の番号をC列のグループ単位で連番にして、O列に連番を振り直しています。

 サンプルでは提示されなかったですけど、B列も変更されてるケースがあるんですか?

 >なお、D・E・F・G・H・I・J・K・L・M・Nのそれぞれの列は、データの内容が変わることがありません。
 これに関しては間違いないですよね?

 もう寝るので明日は忙しいので、レスは月曜の夜になるかも知れません。

(sy) 2019/03/03(日) 00:34


 それと、私のコードや他の方のコードでも同じ事ですけど、

 提供してくれたコードは、必ず一度は修正などせずにそのまま実行して下さい。

 その後もしも修正した場合は、再質問の時にあなたが修正した後のコードを、
 このように修正しましたと明記して、此処に提示して下さい。

 後コード実行の前後に、あなたの別のコードなどを実行してる場合は、
 前後どちらで実行してるかと、そのコードを此処に提示して下さい。

 勝手に修正されて、そのコードの提示も無ければ、提供したコードに問題があるのか、
 あなたが余計な事をした為に問題が発生してるのか分かりません。
 此方ではあなたのPC画面は見えないので、あなたが違う事をしてても分かりません。

 この質問では見えない所で変な事ばかりされて、質問の会話が噛み合わない事が多いと感じます。

 今後は絶対に二度とそのような事はしないと約束して下さい。

 今後他に質問する時も、必ず心掛けて下さい。

 回答者は貴重な時間を使って無償であなたの為にもしかしたら陰であなた以上に努力してます。
 回答者に意味なく無駄な時間を使わせる事だけはさせないで下さい。

(sy) 2019/03/03(日) 12:19


2019/03/03(日) 12:19のコメントの全てがその通りです。
 >回答者は貴重な時間を使って無償であなたの為にもしかしたら陰であなた以上に努力してます。
 >回答者に意味なく無駄な時間を使わせる事だけはさせないで下さい。
特にこのことは、心に深く残りました。色々とご教授下さって誠にありがとうございました。
また、大変、失礼なことを致しました。別に新しくデータを作成して実行したらできていました。
原因は、syさんの作成して頂いたマクロに問題があった訳ではありませんでした。
私の作成したシート1のデータに問題がありました。申し訳ありませんでした。
しっかり検証してから言うべきでした。
重ねて、お礼申し上げることと、心より失礼をお詫び致します。ありがとうございました。
(エイワン) 2019/03/04(月) 08:23

コメント返信:

[ 一覧(最新更新順) ]


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