• ベストアンサー

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

  • 行の並び替え、セルの比較

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

  • Excel データの再配置

    Excelでデータを再配置するマクロの組み方を教えて下さい! 参考画像→ http://goo.gl/2nLWH 画像左側のように複数のデータセットが縦方向に配置されているシートで、左上が「セット○」セルから始まるデータセット単位で横方向に空白列を挟んで再配置したいと思っています。 画像はサンプルデータで、実際には行数は不定数、列数は4列のセットが複数個存在します。 宜しくお願いします。

  • perl シングルコーテーションを含んだ文字編集

    active perl(アクティブパール)で 以下の文字列編集を行いたいのですが、 シングルコーテーションの編集で上手く出来ずに困っています。 どなたか経験豊富な方、良いコーディング方法があれば ご教授下さい。 やりたい事としては、 文字列 aaaaaa bbbbbb cccccc dddddd といった内容を 取り込んで 'aaaaaa','bbbbbb','cccccc','dddddd' といった文字列の出力を行います。 上記の例では文字はddddddまでですが、 場合により bbbbbbまでたったりといった感じで 変換前の文字の行数は可変で、2行でも3行でも4行でも、 各行の文字をシングルコートで囲って、カンマでつなげた文字列を出力します。 上記の仕様内容で、こうすれば出来る! といったサンプルコードを教えていただけると助かります。

  • エクセル セルの比較

    セルの比較について教えてください。 A1~A10と、B1~B10に文字が入っています。 Aがりんごのときは、Bは果物、 Aがキャベツのときは、Bは野菜 となっていなければなりません AとBの同じ行のセルの内容が、この条件と一致しないものが、1行から10行までひとつでもあった場合に、C1に『一致していない箇所があります』と出るようにしたいです。 マクロは使わないでお願いします。

  • エクセルとセルの比較について

    エクセルとセルの比較について エクセル2007で二枚のシートを以下のように作成しました。 シート1   A 1   ←全くの未入力の空白セルです 2 3 シート2   A 1   ←未入力で空白セルですが、数式(if関数とISERROR関数)が入っています。 2 3 ここでしたい処理は、二枚のシートをIF関数で調べて正誤チェックをして、相違するセルに×を表示したいです。 ただ、A1セルに  if(シート1A1=シート2A1,"","×")  の数式をいれると、両者は違うセルとして認識してしまいます。 同じ空白セルなのにどうしてでしょうか。 また、この二つのセルはともに空白なので、同じものとして処理する方法はあるのでしょうか。 お願いします。

  • Excelのセルの比較について教えて下さい

    使用しているのはExcel2003です。 下記のようなシートがあります。          1月  2月  3月  4月 …  | 前年比(%) 平成19年度 10   20   30   40  …  | 平成20年度 50   60              | この状態から平成20年度の前年比を算出したいのですが、 平成20年度3月の値を入力したら 前年の1~3月の値の合計 と 20年の1~3月の値の合計 の比率を右下のセルに表示し、          1月  2月  3月  4月 …  | 前年比(%) 平成19年度 10   20   30   40  …  | 平成20年度 50   60   70          |  300% 平成20年度4月の値を入力したら 前年の1~4月の値の合計 と 20年の1~4月の値の合計 の比率を右下のセルに上書き表示(自動更新)できるようにする          1月  2月  3月  4月 …  | 前年比(%) 平成19年度 10   20   30   40  …  | 平成20年度 50   60   70   80      |  260% といったものは可能でしょうか? 可能であればご教授お願いします。 よろしくお願いします。

  • Excelのセルの比較について

    Excelのマクロにてセルの比較を行っています。 A1に"123" A2をハイパーリンクに指定して"123"と表示しています。 表示形式はどちらも通貨で表示しています。 If Range(A1).Value <> Range(A2).Value Then   MsgBox "同じではない" Else   MsgBox "同じ" End If と比較しているのですが"同じではない"が表示されてしまいます。 試しに MsgBox Range(A1).Value と MsgBox Range(A2).Value を表示してみたところ、どちらも"123"と表示されました。 セルに表示されている値で比較するにはどうしたらいいのでしょうか?

  • Excel VBAで比較させたい。

    sheet1のA1に山田さん、B1に佐藤さんと打ちます。 で、sheet2のA列に山田さんB列に佐藤さんの情報があります。 それを比較する方法を知りたいんですけど。 ちなみに、sheet1のA1に鈴木さん、B1に山崎さんなど色んなパターンが存在します。 A1に山田さんだったらsheet2のA列、B1に佐藤さんだったらsheet2のB列を見に行って それを比較して、一致しない所だけsheet3に表示させる方法などありますか? 当方まったくの初心者で…(^^;

  • エクセル2003 VBAで セル内を 一発呼び出し

    エクセル2003 オートフィルタではなく VBAで セル内を 一発呼び出ししたいので。  よろしく お願いします。 表 列A~E(結合2行) :商品名と内容   列H~K(結合2行) 住所氏名電話番号を記載してます。 1年分を オートフィルターで  氏名 や 商品名で 探すのは 結構 時間がかかります。 同じものが ほぼ少ないため。。。 そこで  たまに 同じ氏名  同じような 品を 検索する セルを 2個ほど作って  そこへ セル1へ 商品名を入力すると  該当する 行のみ 表示される。 セル2に 名前をを入力すると  該当する 行のみ 表示される。 また、セルを赤色に塗った部分の結合行(2~3行)を 赤色に塗りつぶした行のみ 表示も できれば うれしいです。 コマンドボタン等を使ってもいいので お願いします。 そんな VBAを 作っていただけませんでしょうか^^; お手数おかけしますが どなたか よろしく お願いします。 

  • ExcelのVBA、セルについて教えて下さい

    セル内容の比較についてのマクロで教えてください。 まずブックAとブックBという2つのワークブックがあります。 ブックAのD4セルにはS144A03といったよな数字と英語が入っています。 ここからが行いたいことなのですが ブックAでマクロ実行 ⇒ ブックBを開きシートAを選択 Application.InputBoxでブックBのシートA内のセルを選択してOKを押した時 ブックAのD4セルの内容とApplication.InputBoxで選んだセルの内容が同じなら”認証OK” 違う場合は”認証NG”とMsgBoxで表示されるようにしたいです。 認証後はどちらの結果であってもブックBの方は閉じてしうまう形にしたいです。保存の確認はいりません。 ご指導のほどよろしくお願いします。