• ベストアンサー

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

kagakusukiの回答

  • 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

関連する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の方は閉じてしうまう形にしたいです。保存の確認はいりません。 ご指導のほどよろしくお願いします。