• ベストアンサー

Excel VBA 2013; 並び替え、セル比較

コーディングの方法を知りたいのですが、突き合わせ作業をおこないたいです。 同一列項目からなるデータを左右に並べて、左側を正として、例えば商品番号、売上日を連結するなりキーとしてマッチしたら右側の同一行に並へ 変えていきます。 そして、各行単位で比較して、差異があるセルに色付けしたいと考えています。 行数は不定です。 やり方がまったくわかりません。 サンプルを添付させていただきます。 アイデアをいただけませんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.6

>いただきましたサンプルでエラーを起こしています。 >対策を教えていただけませんでしょうか? >↓右の表を並び変える箇所でエラーをエラー1004「アプリケーション定義またはオブジェクト定義のエラーです。」起こしています。 >With outSheet.Range(FirstColumn2 & i) >>With .Resize(1, ListColumns).Value = .Offset(TargetRow - i).Value >End With >>With Range(FirstColumn2 & TargetRow).Resize(LastRow2 + SearchRows - TargetRow + 1, ListColumns)..Value = .Offset(1).Value >End With との事ですが、私がこの御質問に対して回答した回答内容でお伝えしたVBAの構文中には >With outSheet.Range(FirstColumn2 & i) と記述されている箇所も >>With .Resize(1, ListColumns).Value = .Offset(TargetRow - i).Value と記述されている箇所も >>With Range(FirstColumn2 & TargetRow).Resize(LastRow2 + SearchRows - TargetRow + 1, ListColumns)..Value = .Offset(1).Value と記述されている箇所も存在していません。  何か別の方が作られたVBAとお間違えなのではないでしょうか?

genesis50
質問者

お礼

所望のコードができました。 頂いたのは叩き台だと言うことを忘れていました。 また、要件もださずに大変申し訳ございませんでした。 ありがとうございました。

genesis50
質問者

補足

サンプルをベースに改良しましたが機能しません。 大変申し訳ございませんが、↓の3つのキー項目、11つの列項目で機能するサンプルまたはアドバイスをいただけませんか? また、いたいだいたサンプルでは、右表ではキー項目の商品番号が右寄せになり、下段に移動せずにセルだけが薄緑色で塗りつぶされているケースがあります。 *↓の商品番号、枝番、売上日の3つのキー項目、列項目を使用します。 ・商品番号(A列) ・枝番(B列) ・売上日(C列) ・商品名(D列) ・金額(E列) ・仕入原価(F列) ・仕入先番号(G列) ・仕入先社名(H列) ・仕入先担当者(I列) ・仕入先住所(J列) ・備考(K列)

その他の回答 (6)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.7

 少なくとも私は、 >With .Resize(1, ListColumns).Value = .Offset(TargetRow - i).Value や >With Range(FirstColumn2 & TargetRow).Resize(LastRow2 + SearchRows - TargetRow + 1, ListColumns)..Value = .Offset(1).Value などの様に、左辺と右辺を「=」で結んでいる構文の前にWithをつけた事はこれまで一度も御座いませんし、その様な記述の仕方が成り立つとも思えません。  ですから、そのVBAを作った方に、該当箇所でWithを付けている意図(即ち、「何のためにWithを付けているのかという事」)を御確認された方が良いと思います。 ※そのVBAを作ったのは私ではないため、私に訊かれても答えようが御座いません。

genesis50
質問者

補足

本来のファイルには、他にもシートがありますので、対象シートを明確にする為に任意のシート名をセットしました。 また、Withステートメントのエラー個所ですが、タイポです。 申し訳ございませんでした。 あくまでいただいたサンプルをベースにしています 再度、質問させてください。 商品番号、売上日をキーとして、6列の項目からなるもの処理ですが実際には↓11列の項目で、商品番号、枝番、売上日の3つのキー項目を 使用します。 ・商品番号(A列) ・枝番(B列) ・売上日(C列) ・商品名(D列) ・金額(E列) ・仕入原価(F列) ・仕入先番号(G列) ・仕入先社名(H列) ・仕入先担当者(I列) ・仕入先住所(J列) ・備考(K列) *エラー個所 With .Resize(1, ListColumns) .Value = .Offset(TargetRow - i).Value 'ここでエラーになります。 End With *新たに追加したキー項目(↓のmyNo2)のオフセット値を取得できていないようですが、原因がわかりません。  教えていただけませんでしょうか? For i = FirstRow To LastRow1 With Range(FirstColumn1 & i) myNo1 = .Offset(, No1Column).Value myNo2 = .Offset(, No2Column).Value '新規追加 myDate = .Offset(, DateColumn).Value End With ↓はいただいたサンプルを改良したルーチンです。 Sub 改良版() Const FirstRow = 3 '基準となる表において実際のデータが入力されている最初の行 Const FirstColumn1 = "A" '基準となる表において最も左端の列 Const FirstColumn2 = "M" '並べ替えを行う表において最も左端の列 Const ListColumns = 11 '表の列数 Const No1Column = 0 '表中で「商品番号が入力されている列」と「表の左端の列」との列番号の差 Const No2Column = 1 '表中で「枝番が入力されている列」と「表の左端の列」との列番号の差 Const DateColumn = 2 '表中で「売上日が入力されている列」と「表の左端の列」との列番号の差 Dim buf As Variant, m As Integer, n As Integer, i As Long, j As Long, k As Long _ , myColor As Long, LastRow1 As Long, LastRow2 As Long _ , SearchRows As Long, TargetRow As Long, myNo1 As Variant, myNo2 As Variant, myDate As Variant myColor = RGB(146, 208, 80) 'マッチしていないデータが入っているセルを塗りつぶす色 LastRow1 = Range(FirstColumn1 & Rows.Count).End(xlUp).Row LastRow2 = Range(FirstColumn2 & Rows.Count).End(xlUp).Row If LastRow1 < FirstRow Or LastRow2 < FirstRow Then MsgBox "処理すべきデータが見当たりませんません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If SearchRows = LastRow2 - FirstRow + 1 With Application .ScreenUpdating = False .Calculation = xlManual End With With Range(FirstColumn2 & FirstRow).Resize(SearchRows, ListColumns) With .Interior .Pattern = xlNone .TintAndShade = 0 .PatternTintAndShade = 0 End With .Resize(1, .Columns.Count).Copy .PasteSpecial Paste:=xlPasteFormats Intersect(.SpecialCells(xlCellTypeConstants, 23).EntireRow, .EntireColumn).Copy Range(FirstColumn2 & LastRow2 + 1).PasteSpecial Paste:=xlPasteValues .ClearContents End With SearchRows = Selection.Rows.Count Selection.Cut Range(FirstColumn2 & LastRow1 + 1) Application.CutCopyMode = False For i = FirstRow To LastRow1 With Range(FirstColumn1 & i) myNo1 = .Offset(, No1Column).Value myNo2 = .Offset(, No2Column).Value myDate = .Offset(, DateColumn).Value End With If myNo1 <> "" And myNo2 <> "" And myDate <> "" Then If WorksheetFunction.CountIfs( _ Range(FirstColumn2 & LastRow1 + 1).Offset(, No1Column).Resize(SearchRows, 1), myNo1 _ , Range(FirstColumn2 & LastRow1 + 1).Offset(, No2Column).Resize(SearchRows, 1), myNo2 _ , Range(FirstColumn2 & LastRow1 + 1).Offset(, DateColumn).Resize(SearchRows, 1), myDate _ ) > 0 Then m = 0 For j = LastRow1 + 1 To LastRow1 + SearchRows With Range(FirstColumn2 & j) If .Offset(, No1Column).Value = myNo1 And .Offset(, No2Column).Value = myNo2 And .Offset(, DateColumn).Value = myDate Then n = 0 For k = 0 To ListColumns - 1 If .Offset(, k).Value = Range(FirstColumn1 & i).Offset(, k).Value Then n = n + 1 Next k If n > m Then m = n TargetRow = j End If End If End With Next j With Range(FirstColumn2 & i) With .Resize(1, ListColumns) .Value = .Offset(TargetRow - i).Value End With With Range(FirstColumn2 & TargetRow).Resize(LastRow2 + SearchRows - TargetRow + 1, ListColumns) .Value = .Offset(1).Value End With SearchRows = SearchRows - 1 For k = 0 To ListColumns - 1 If .Offset(, k).Value <> Range(FirstColumn1 & i).Offset(, k).Value Then _ .Offset(, k).Interior.Color = myColor Next k End With End If End If If SearchRows < 1 Then Exit For Next i If SearchRows > 0 Then Range(FirstColumn2 & FirstRow).Resize(1, ListColumns).Copy With Range(FirstColumn2 & LastRow1 + 1).Resize(SearchRows, ListColumns) .PasteSpecial Paste:=xlPasteFormats .Interior.Color = myColor End With Application.CutCopyMode = False End If With Application .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With End Sub

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.5

 回答No.4に対して頂いた補足内容を拝見しました事により、質問者様がやりたい事が更に解らなくなりました。 >左の表だけが存在する場合(右の表は空欄)、右の表だけが存在(左の表は空欄)する場合もあります。 という事は、左の表を基準にするのではなく、両方の表を並べ変えるという事なのでしょうか?  そうしますと、何を並べ替えの基準にすれば宜しいのでしょうか?  右の表を並べ替えると、左の表の空欄となる行の位置が変わってしまいますので、左の表の空欄となる行の位置が定まりません。 >リストの所々で左の表だけが存在する場合(右の表は空欄)、右の表だけが存在(左の表は空欄)する場合もあります。 >商品番号、売上日を連結したキー順に左右にリストしていきます。 >最終行に移動はしないです。 との事ですが、それでは右の表だけが存在するデータはどこに移動させれば宜しいのでしょうか?  左の表に「左右の表の両方に存在している商品番号と日付の組み合わせ」が入力されている行に、並べ替え前の右の表には「左の表には存在しない商品番号と日付の組み合わせ」が入力されている場合もあり得るのでは? >>左右の各表において「商品番号と売上日の両方が同じデータ」がどちらも複数存在する場合には、 >(返答) >あくまでキーなる商品番号、売上日がマッチしたキー順に左右にリストしていきます。 >「商品名」~「仕入先」は考慮しません  それでは複数存在する「商品番号、売上日がマッチしたキー」をどの様な基準の順番で右の表に並べていけば宜しいのでしょうか? >「商品名」~「仕入先」は考慮しません と仰るだけで代わりとなる基準を示さないのでは困ります。  例えば、回答No.3で述べている様に、右の表の中に複数存在している「商品番号と売上日の両方がマッチするデータ」の内、一番上にある1行のデータのみをコピーして貼り付ける様にすれば宜しいのですか? >>もしも「商品番号と売上日の両方が同じデータ」となっている行の数が右の表の方が多い場合には、 >(返答) >リストの所々で左の表だけが存在する場合(右の表は空欄)、右の表だけが存在(左の表は空欄)する場合もあります。 >商品番号、売上日を連結したキー順に左右にリストしていきます。 >最終行に移動はしないです。  それでは右の表の「商品番号と売上日の両方が同じデータ」の中で余ったデータをどこに移動させれば宜しいのでしょうか? >最終行に移動はしないです。 と仰るだけで代わりとなる移動先を示さないのでは困ります。  左の表に「左右の表の両方に存在している商品番号と日付の組み合わせ」が入力されている行に、並べ替え前の右の表には「左の表においてまた別の行に入力されている商品番号と日付の組み合わせ」で尚且つ「余っているデータ」が入力されている場合もあり得るのでは? >>もしも「商品番号と売上日の両方が同じデータ」となっている行の数が右の表の方が少ない場合には、左の表に「商品番号と売上日の両方が同じデータ」が入力されている行の右表のセル範囲に対して上から順番に、右の表の「商品番号と売上日の両方がマッチするデータ」を割り振って行き、割り当てるべきデータが不足している行に関しては空欄とする。 >(返答) >リストの所々で左の表だけが存在する場合(右の表は空欄)、右の表だけが存在(左の表は空欄)する場合もあります。 >商品番号、売上日を連結したキー順に左右にリストしていきます。 >最終行に移動はしないです。  返答になっておりません。 >割り当てるべきデータが不足している行に関しては空欄とする。 のは、「商品番号と売上日の両方が同じデータ」が左右どちらの表にも存在していて、尚且つ、「同じ商品番号と売上日の組み合わせのデータ」が入力されている行の数が、左の表の方が多く、右の表の方が少ない場合に関する提案であって、 >左の表だけが存在する場合 では御座いません。  その上、 >割り当てるべきデータが不足している行に関しては空欄とする。 という提案に対して、 >最終行に移動はしないです。 と返答して来られても何の話なのか意味不明です。  こちらは、 >商品番号、売上日を連結したキー順に左右にリスト して行った結果、右の表に存在する「商品番号、売上日を連結したキー」が不足した場合に関する話をしているというのに >商品番号、売上日を連結したキー順に左右にリストしていきます。 とは、どういう事なのでしょうか?  リストすべきキーを表の上部で使い切って、リストする事が出来るデータがもう残っていないというのに、何をリストすると仰るのでしょうか?

genesis50
質問者

補足

混乱をまねき申し訳ございませんでした。 ご指摘のとうり、 左の表を正としてしてキー項目がヒットした項目を最も列項目がマッチしたものから右の表に並べていき、ビットしなかったり、左右で行数が異なっていれば 下のほうに配置するのが自然とおもいます。 混乱をまねき申し訳ございませんでした。 別途、質問させてください。 いただきましたサンプルでエラーを起こしています。 対策を教えていただけませんでしょうか? ↓右の表を並び変える箇所でエラーをエラー1004「アプリケーション定義またはオブジェクト定義のエラーです。」起こしています。 With outSheet.Range(FirstColumn2 & i) >With .Resize(1, ListColumns).Value = .Offset(TargetRow - i).Value End With >With Range(FirstColumn2 & TargetRow).Resize(LastRow2 + SearchRows - TargetRow + 1, ListColumns)..Value = .Offset(1).Value End With . . ・TargetRowは"0"がセットされていました。 ・Resizeプロパティの前に、Worksheets("Sheet1")などのシート定義、Rangeプロパティなどのセルの定義は必要ないでしょうか?

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.4

 回答No.3で述べました様に不明な点が幾つかありますので、取り敢えず叩き台として以下の様な条件で処理を行うVBAを御伝えしておきます。 ・もし右の表に「商品番号と売上日の両方がマッチするデータ」が存在しなかった場合には、その行は空欄にする。 ・もし右の表の中に「商品番号か売上日がマッチしていないデータ」が存在していた場合には、そのデータは右の表中の「左の表の最終行」の1つ下の行から下方に向かって順番に並べる。(但し、空欄の行は削除する) ・左右の各表において「商品番号と売上日の両方が同じデータ」がどちらも複数存在する場合には、まず、左の表において「商品番号と売上日の両方が同じデータ」が存在している複数の行の内、最も上の行の所にあるデータに「商品名」~「仕入先」の各データが最もマッチしているデータを右の表中から探し出して右表の同行に配置し、 左の表において「商品番号と売上日の両方が同じデータ」が存在している複数の行の内、上から2番目以降の所にあるデータの行と同じ行の右表のセル範囲には、右表の上の行に既に配置済みとなっているデータを除外した残りのデータの中から、「商品番号と売上日の両方が同じデータ」で、尚且つ、「商品名」~「仕入先」の各データが最もマッチしているデータを探し出して右表の同行に配置する。 ・もしも「商品番号と売上日の両方が同じデータ」となっている行の数が右の表の方が多い場合には、右の表の「商品番号と売上日の両方が同じデータ」の中で余ったデータは、「商品番号か売上日がマッチしていないデータ」と同様に、右の表中の「左の表の最終行」の1つ下の行から下方に向かって順番に並べる。 ・もしも「商品番号と売上日の両方が同じデータ」となっている行の数が右の表の方が少ない場合には、左の表に「商品番号と売上日の両方が同じデータ」が入力されている行の右表のセル範囲に対して上から順番に、右の表の「商品番号と売上日の両方がマッチするデータ」を割り振って行き、割り当てるべきデータが不足している行に関しては空欄とする。 ・右表中で、同じ行の左表のデータと差異があるデータが入っているセルを薄緑色で塗りつぶす。 Sub QNo9242735_Excel_VBA_2013_並び替え_セル比較() Const FirstRow = 3 '基準となる表において実際のデータが入力されている最初の行 Const FirstColumn1 = "A" '基準となる表において最も左端の列 Const FirstColumn2 = "H" '並べ替えを行う表において最も左端の列 Const ListColumns = 6 '表の列数 Const NoColumn = 0 '表中で「商品番号が入力されている列」と「表の左端の列」との列番号の差 Const DateColumn = 1 '表中で「売上日が入力されている列」と「表の左端の列」との列番号の差 Dim buf As Variant, m As Integer, n As Integer, i As Long, j As Long, k As Long _ , myColor As Long, LastRow1 As Long, LastRow2 As Long _ , SearchRows As Long, TargetRow As Long, myNo As Variant, myDate As Variant myColor = RGB(146, 208, 80) 'マッチしていないデータが入っているセルを塗りつぶす色 LastRow1 = Range(FirstColumn1 & Rows.Count).End(xlUp).row LastRow2 = Range(FirstColumn2 & Rows.Count).End(xlUp).row If LastRow1 < FirstRow Or LastRow2 < FirstRow Then MsgBox "処理すべきデータが見当たりませんません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If SearchRows = LastRow2 - FirstRow + 1 With Application .ScreenUpdating = False .Calculation = xlManual End With With Range(FirstColumn2 & FirstRow).Resize(SearchRows, ListColumns) With .Interior .Pattern = xlNone .TintAndShade = 0 .PatternTintAndShade = 0 End With .Resize(1, .Columns.Count).Copy .PasteSpecial Paste:=xlPasteFormats Intersect(.SpecialCells(xlCellTypeConstants, 23).EntireRow, .EntireColumn).Copy Range(FirstColumn2 & LastRow2 + 1).PasteSpecial Paste:=xlPasteValues .ClearContents End With SearchRows = Selection.Rows.Count Selection.Cut Range(FirstColumn2 & LastRow1 + 1) Application.CutCopyMode = False For i = FirstRow To LastRow1 With Range(FirstColumn1 & i) myNo = .Offset(, NoColumn).Value myDate = .Offset(, DateColumn).Value End With If myNo <> "" And myDate <> "" Then If WorksheetFunction.CountIfs( _ Range(FirstColumn2 & LastRow1 + 1).Offset(, NoColumn).Resize(SearchRows, 1), myNo _ , Range(FirstColumn2 & LastRow1 + 1).Offset(, DateColumn).Resize(SearchRows, 1), myDate _ ) > 0 Then m = 0 For j = LastRow1 + 1 To LastRow1 + SearchRows With Range(FirstColumn2 & j) If .Offset(, NoColumn).Value = myNo And .Offset(, DateColumn).Value = myDate Then n = 0 For k = 0 To ListColumns - 1 If .Offset(, k).Value = Range(FirstColumn1 & i).Offset(, k).Value Then n = n + 1 Next k If n > m Then m = n TargetRow = j End If End If End With Next j With Range(FirstColumn2 & i) With .Resize(1, ListColumns) .Value = .Offset(TargetRow - i).Value End With With Range(FirstColumn2 & TargetRow).Resize(LastRow2 + SearchRows - TargetRow + 1, ListColumns) .Value = .Offset(1).Value End With SearchRows = SearchRows - 1 For k = 0 To ListColumns - 1 If .Offset(, k).Value <> Range(FirstColumn1 & i).Offset(, k).Value Then _ .Offset(, k).Interior.Color = myColor Next k End With End If End If If SearchRows < 1 Then Exit For Next i If SearchRows > 0 Then Range(FirstColumn2 & FirstRow).Resize(1, ListColumns).Copy With Range(FirstColumn2 & LastRow1 + 1).Resize(SearchRows, ListColumns) .PasteSpecial Paste:=xlPasteFormats .Interior.Color = myColor End With Application.CutCopyMode = False End If With Application .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With End Sub

genesis50
質問者

補足

ありがとうございます。 理解に時間がかかりそうです。 説明不足で申し訳ございません。 整理させていただきます。 ・左の表を正とします。 ・キーを商品番号と売上日として、すべてリストします。 ・差異確認の色付けは右の表だけ。 >もし右の表に「商品番号と売上日の両方がマッチするデータ」が存在しなかった場合には、その行は空欄にする。 (返答) 左の表を正として商品番号、売上日を連結したキーが右の表をマッチしない場合もございます。 左の表だけが存在する場合(右の表は空欄)、右の表だけが存在(左の表は空欄)する場合もあります。 差異確認の色付けは右の表だけにしたいので、商品番号~仕入先のすべての列に色付された行が存在します。 >もし右の表の中に「商品番号か売上日がマッチしていないデータ」が存在していた場合には、そのデータは右の表中の「左の表の最終行」の1つ下の行から 下方に向かって順番に並べる。(但し、空欄の行は削除する) (返答) リストの所々で左の表だけが存在する場合(右の表は空欄)、右の表だけが存在(左の表は空欄)する場合もあります。 商品番号、売上日を連結したキー順に左右にリストしていきます。 最終行に移動はしないです。 >左右の各表において「商品番号と売上日の両方が同じデータ」がどちらも複数存在する場合には、まず、左の表において「商品番号と売上日の両方が同じデータ」が存在している複数の行の内、最も上の行の所にあるデータに「商品名」~「仕入先」の各データが最もマッチしているデータを右の表中から探し出して右表の同行に配置し (返答) あくまでキーなる商品番号、売上日がマッチしたキー順に左右にリストしていきます。 「商品名」~「仕入先」は考慮しません >左の表において「商品番号と売上日の両方が同じデータ」が存在している複数の行の内、上から2番目以降の所にあるデータの行と同じ行の右表のセル範囲には、右表の上の行に既に配置済みとなっているデータを除外した残りのデータの中から、「商品番号と売上日の両方が同じデータ」で、尚且つ、「商品名」~「仕入先」の各データが最もマッチしているデータを探し出して右表の同行に配置する。 (返答) あくまでキーなる商品番号、売上日がマッチしたキー順に左右にリストしていきます。 「商品名」~「仕入先」は考慮しません >もしも「商品番号と売上日の両方が同じデータ」となっている行の数が右の表の方が多い場合には、右の表の「商品番号と売上日の両方が同じデータ」の中で余ったデータは、「商品番号か売上日がマッチしていないデータ」と同様に、右の表中の「左の表の最終行」の1つ下の行から下方に向かって順番に並べる。 (返答) リストの所々で左の表だけが存在する場合(右の表は空欄)、右の表だけが存在(左の表は空欄)する場合もあります。 商品番号、売上日を連結したキー順に左右にリストしていきます。 最終行に移動はしないです。 >もしも「商品番号と売上日の両方が同じデータ」となっている行の数が右の表の方が少ない場合には、左の表に「商品番号と売上日の両方が同じデータ」が入力されている行の右表のセル範囲に対して上から順番に、右の表の「商品番号と売上日の両方がマッチするデータ」を割り振って行き、割り当てるべきデータが不足している行に関しては空欄とする。 (返答) リストの所々で左の表だけが存在する場合(右の表は空欄)、右の表だけが存在(左の表は空欄)する場合もあります。 商品番号、売上日を連結したキー順に左右にリストしていきます。 最終行に移動はしないです。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.3

 どのように並べ替えたいのかが御質問文にある説明内容だけでは不明です。 ・右の表に「商品番号と売上日の両方がマッチするデータ」が存在しなかった場合にはどの様にすれば良いのですか?  右の表のその行は空欄にすれば良いのですか? ・左右の各表において「商品番号と売上日の両方が同じデータ」がどちらも複数存在する場合にはどの様にすれば良いのですか?  左の表の中で「商品番号と売上日の両方が同じデータ」が入力されている全ての行と同じ行の所に、右の表の中に複数存在している「商品番号と売上日の両方がマッチするデータ」の内、一番上にある1行のデータのみをコピーして貼り付ける様にすれば宜しいのですか?  それとも、並べ替え前の右の表の中に現れた順番で、左の表の「商品番号と売上日の両方が同じデータ」が入力されている各行と同じ行の右の表のセルに対して、順番に割り振って行けば宜しいのですか?  それとも、「商品名」~「仕入先」の各データが最もマッチしている順に割り振って行けば宜しいのですか? ・もし仮に左右の各表において「商品番号と売上日の両方が同じデータ」がどちらも複数存在していて、尚且つ、マッチするデータを何らかの基準で順番に割符て行くものとした場合において、もしも「商品番号と売上日の両方が同じデータ」となっている行の数が左右の表で異なっている場合には、右の表で余りが出たり、不足が出たりする事になりますが、その様な場合にはどの様にすれば宜しいのですか? ・もし、右の表の中に「商品番号か売上日がマッチしていないデータ」が存在していた場合にはどの様にすれば宜しいのですか?

回答No.2

【訂正】入れ替えは不必要ですね。

回答No.1

1、全てを構造体配列(L、R)に呼び込む。 2、構造体配列(R)をソートする。 3、構造体配列(L)の先頭から(R)をバイナリーサーチする。 4、一致したら、構造体配列(R)を入れ替える。 5、(R)をバイナリーサーチのスタートに入れ替え数を反映する。 6、全てのサーチと入れ替えが完了したらEXCELに反映する。 と、こんな感じで。

関連するQ&A