• ベストアンサー

比較して一致したら指定セルに貼り付け処理

【Sheet1】の日付A1セルと【Sheet2】の日付A行を比較。 ※ 【Sheet1】の比較元はA1だけでいい 一致しなければ【Sheet2】のA行を一つ下げ、比較し直し、一致するまで比較 一致したら【Sheet1】のA列以降を全てコピーし【Sheet2】の一致した日付の隣B列に以下の様に貼り付けする 【Sheet1】            【Sheet2】     A        B   C       A 1 2008/1/2 0:45  72  99   1 2008/1/2 0:00 2 2008/1/2 1:00  76  84   2 2008/1/2 0:15 3 2008/1/2 1:15  19  45   3 2008/1/2 0:30 4 2008/1/2 1:30  30  78   4 2008/1/2 0:45 5 2008/1/2 1:45  56  33   5 2008/1/2 1:00 ↓『結果』 【Sheet2】    A          B 1 2008/1/2 0:00 2 2008/1/2 0:15 3 2008/1/2 0:30 4 2008/1/2 0:45  2008/1/2 0:45 72 99 5 2008/1/2 1:00  2008/1/2 1:00 76 84 6 2008/1/2 1:15  2008/1/2 1:15 19 45 7 2008/1/2 1:30  2008/1/2 1:30 30 78 8 2008/1/2 1:45  2008/1/2 1:45 56 33 -------------------------------------------------------------------------- Dim i As Integer Dim Com As Integer Dim s As Integer SheetName = "Sheet1" SheetName2 = "Sheet2" Do For Com = 1 To 20 ' Sheet1のA1とSheet2のA行セルが一致するまで比較 If StrComp(Worksheets(SheetName).Cells(1, 1), Worksheets(SheetName2).Cells(Com, 1), vbTextCompare) Then ' 一致したらA列をコピー Rows("1:1").Select Selection.Copy Else ' 一致しなければSheet2のAセルを一つ下げる WorkSheets(SheetName2).Cells(Com, 1).Offset(1, 0).Select End If Next ' 一致するまで比較 Loop Until StrComp(Cells(1, 1), Cells(s, 10)) -------------------------------------------------------------------------- Loop Untilの箇所で記述がおかしいせいかアプリケーション定義、またはオブジェクトエラーになってしまいます。 一致した時、Sheet1のA1列の情報をSheet2の指定箇所に格納する記述の仕方がどうしてもわかりません。 何かいい記述はないでしょうか? 質問が長くなってしまいましたが、どうか教えていただきたく思います。 よろしくお願いします。

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

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

サンプルマクロです。 StrComp関数を使用しているから、A列の「日付+時刻」が文字列で入力されているのでしょうか。その場合は Sub Macro1() Dim idx As Long Dim res With Sheets("Sheet2")   For idx = 1 To Sheets("Sheet1").Range("A65536").End(xlUp).Row     res = Application.Match(Sheets("Sheet1").Cells(idx, "A").Value, _         .Range(.Range("A1"), .Range("A65536").End(xlUp)), 0)     If IsNumeric(res) Then       Sheets("Sheet1").Cells(idx, "B").Resize(1, 2).Copy .Cells(res, "B")     End If   Next idx End With End Sub もしA列の「日付+時刻」が日付型で入力されている場合はこうなります Sub Macro2() Dim idx As Long Dim res With Sheets("Sheet2")   For idx = 1 To Sheets("Sheet1").Range("A65536").End(xlUp).Row     res = Application.Match(CDbl(Sheets("Sheet1").Cells(idx, "A").Value), _         .Range(.Range("A1"), .Range("A65536").End(xlUp)), 0)     If IsNumeric(res) Then       Sheets("Sheet1").Cells(idx, "B").Resize(1, 2).Copy .Cells(res, "B")     End If   Next idx End With End Sub

その他の回答 (1)

  • nobu555
  • ベストアンサー率45% (158/345)
回答No.1

マクロは、まだまだ半人前ですが 勉強がてら調べてみました。 >Loop Untilの箇所で記述がおかしいせいか… 変数sを設定されていますが 値が代入されていません。 iも宣言してますが使用されてません。 (一部なので他で出てくるのでしょか?) StrComp関数は、比較して一致したとき 戻り値が"0"となりますので、 真偽が逆になります。 >If StrComp() Then >' 一致したらA列をコピー >Else >' 一致しなければSheet2のAセルを一つ下げる >End If ではなく、 If StrComp() Then ' 一致しなければSheet2のAセルを一つ下げる Else ' 一致したらA列をコピー End If となると思います。 コードにカーソルを合わせて ファンクションキー「F1」を押すと ヘルプが現れます。 とりあえず、自分なりに作ってみました。 Sub TEST() Dim Com As Integer SheetName = "Sheet1" SheetName2 = "Sheet2" LastRow = Worksheets(SheetName2).Range("A65536").End(xlUp).Row For Com = 1 To LastRow ' Sheet1のA1とSheet2のA行セルが一致するまで比較 If StrComp(Worksheets(SheetName).Cells(1, 1), Worksheets(SheetName2).Cells(Com, 1), vbTextCompare) Then Else ' 一致したらA列をコピー Sheets("Sheet1").Select Range("A1").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy Sheets("Sheet2").Select Cells(Com, 2).Select ActiveSheet.Paste Exit For End If Next End Sub

関連するQ&A

  • 日付と時刻を比較して一致した行を抜き出す。

    【Sheet1】             【Sheet2】     A        B        A         B 1 2008/1/2   00:00      1 2008/1/1   22:00 2 2008/1/2   01:00      2 2008/1/1   23:00 3 2008/1/2   02:00      3 2008/1/2   00:00 4 2008/1/2   02:00      4 2008/1/2   01:00 【Sheet1】のA行セルと【Sheet2】のA行セルの文字列を比較し、 一致しない場合は【Sheet2】のセルを一つずらしA3【一致】するセルと比較するまで ループを続ける。 ※ 上記例の場合だと日付一致は【Sheet1】A1 ⇔ 【Sheet2】A3 一致した時点で一致した【Sheet1】のAセルの隣B列と比較して、 【Sheet1】の日付、時刻が一致した列を検出する。 ※ 最終的に条件が一致して抜き出すのは 結果 : 【Sheet1】のA1行 そんなマクロを作っているのですが、 何かもっと簡潔に作れるやり方ってありますでしょうか? ヒントだけでもいいのでご教授していただけたら幸いです・・。 わかりにくくてすいません; ----------------------------------------------------------------------------------------------------- Dim Com As Integer Dim Com2 As Integer Dim Storage As String Dim i As Long ' Month関数を使う Do Until Month(Cells(i, 1).Value) = 11 For Com = 1 To 100 'Com = 日付 ' 【Sheet1】の指定されたAセルが【Sheet2】の指定されたAセルが一致しているかどうか If CDate(Worksheets(Sheet1).Range("A" & Com)) = CDate(Worksheets(Sheet2).Range("A" & Com)) Then ' 一致すれば【Sheet1】のAセルの文字列をStorage変数に格納 Storage = ActiveCell.Value Else ' Falseの場合、1行改行する ActiveCell.Offset(1, 0).Select End If Next Loop ----------------------------------------------------------------------------------------------------

  • 比較したいセルの文字列が一致したら"一致"

    いい案が思い浮かばないため皆さんのお知恵をお貸しください。 下はエクセルと思ってください    A列             B列 1  2009/01/07/22:55   2009/01/07/22:56 2  テスト1           テスト1 3  テスト2           テスト2 4  テスト3            テスト3 5  テスト4           テスト6 とこのようなシートがあります。 セルA1とB1は時間のため可変で比較対照としたくありません それ以外のA列とB列がすべて一致したとき一致 不一致があればセルA5が不一致とmsgboxで出したいと考えております。 まだ思案中で途中なのですが Sub test() Dim i As Integer i = 1 Do While Cells(i, 1) <> "" If Cells(i, 1) = Cells(i, 2) Then MsgBox "一致" i = i + 1 ElseIf Cells(i, 1) <> Cells(i, 2) Then MsgBox "不一致" i = i + 1 End If Loop End Sub いまはまだこの程度のレベルです 宜しくお願いします。

  • 完全一致したら複数のセルを順に代入するマクロは?

    エクセルのSheet1のA列にある文字列と、Sheet2にあるA列にある文字列と完全一致したら、前者のセルの右右右隣セル(一致したセルから数えて4番目のセル)から3番目までのセルに、後者のセルの右隣セル(一致したセルから数えて2番目のセル)から3番目までの文字列を順に代入するマクロをお教えください。つまり代入開始セルをSheet1のD列にしたいのです。(実は任意の列からにしたのですが…)。単純にvlookup関数を使えばいいのですが、VBAで行いたいのです。 一致したセルの右隣のセルから順に代入するマクロは以下で解決済みです。以下のマクロを編集して実行したいのですが、どこをいじったらよいかわかりません。 なお、代入したいセルを右の任意のセルまで引き延ばしたい場合、以下のコード任意Loop Until Coln1 = 4の右辺の数字を変更すればよいことまではわかっています。どうぞ、よろしくお願い申し上げます。 ---------------- Sub 試験() Dim Row1 As Integer Dim Coln1 As Integer Dim Row2 As Integer Dim Coln2 As Integer Set WS1 = Worksheets("Sheet1") Set WS2 = Worksheets("Sheet2") Coln1 = 1 Coln2 = 1 For Row1 = 1 To WS1.Cells(Rows.Count, 1).End(xlUp).Row For Row2 = 1 To WS2.Cells(Rows.Count, 1).End(xlUp).Row If WS2.Cells(Row2, 1) = WS1.Cells(Row1, 1) Then Do Coln1 = Coln1 + 1 Coln2 = Coln2 + 1 WS1.Cells(Row1, Coln1) = WS2.Cells(Row2, Coln2) Loop Until Coln1 = 4 Coln1 = 1 Coln2 = 1 End If Next Row2 Next Row1 End Sub

  • EXCEL2007のマクロで2つのBOOKを比較

    EXCEL2007のマクロでABook,BBookと2つのBookのセルを比較して、数値が違うセルがある場合、BBookの方に新しいsheetを作成して、このsheetのA列に数値が違うセルの番地を、新しいsheetのA1、A2・・・と埋めていくマクロは作成する事は出来るでしょうか?因みに新しいsheetを作成するマクロまでは、出来ました。しかし、新しいsheetのA1、A2と書き込んでいくと、クリップボードの値がA1、A2、・・・入ってしまいます。 Dim ws1 As Object Dim ws2 As Object Dim ws3 As Object Dim co As Integer, ro As Integer, e As Integer Set ws1 = Workbooks(bookname1).Worksheets("明細") Set ws2 = Workbooks(bookname2).Worksheets("明細") Set ws3 = Workbooks(bookname2).Worksheets("エラーセル") If ws1.Cells(y, x).Value = ws2.Cells(y, x).Value Then Else ws3.Cells(e).Select ActiveCell.FormulaR1C1 = "A,e+1" End If マクロの骨格はこんな感じですけど、後は、Forループで回せば良いと考えております。 ActiveCell.FormulaR1C1 = "A,e+1"の部分が良く分かりません。 どの様にすれば、新たに作成したsheetのA1に数値が違うセルの番地例えばE5と入れる事が出来るのでしょうか、それもE5一つだけではなく沢山あります。G7とか・・・ どなたか、ご教授願います。宜しくお願い申し上げます。

  • セルの内容の比較について

    こんにちは。 業務用の簡単なチェックプログラムを作っています。 基本データに扱い商品、日々売上に実際に売れた商品、結果にそれらを照合したデータを書き込むとします。 Private Sub button_Click() Dim i As Integer Dim n As Integer Dim x As Integer Range("A1:B1000").ClearContents n = 1 x = 1 For i = 1 To 1000 If Worksheets("日々売上").Cells(i, 1) = "" Then Exit For End If If Worksheets("基本データ").Cells(x, 1) = Worksheets("日々売上").Cells(n, 2) Then Worksheets("結果").Cells(x, 1).Value = Worksheets("日々売上").Cells(n, 2) Worksheets("結果").Cells(x, 2).Value = Worksheets("日々売上").Cells(n, 7) n = n + 1 x = x + 1 Else n = n + 1 End If Next i End Sub 基本データのシートには、あらかじめ抽出したい商品コードと商品名が書かれていて、日々売上のシートの内容と比較しながら、合致した場合はその商品を結果のシートに書き出すと言う感じです。 エラーは出ないのですが、なぜか途中で基本データの行番号数値の変数xが止まってしまい、最後まで照合出来ません。 初歩的なプログラムですが、どうぞよろしくお願い致します。

  • Excel VBA セルの値をシート名にしたいのです。

    こんばんは 新しくシートを挿入させて、「シート2」の値のみをコピーさせたいと考えています。 その新しく挿入させたシート名を「シート1」のせるA3とA4の文字列をあわせたものにしたいのですが、どうしたらよいのでしょうか。 途中まで考えたところでいきずまってしまいました。 どうか英知をお貸しください。 宜しくお願い致します。 A3には日付、A4には名前が入力されています。 Dim sheetName As String Worksheets("月度集計").Activate Sheets.Add After:=Sheets(Sheets.Count) ActiveSheet.Name = Worksheets("Sheet1").Cells(3, 3).Value On Error Resume Next Worksheets(1).Name = sheetName On Error GoTo 0 Range("f2").Select

  • 日付型変数を検索する方法

    シート内にある日付型の変数を検索させる処理をしたいのですが、以下のように記述したところ、 ================================== Dim hiduke As Date Dim lngYLine As Long Dim intXLine As Integer hiduke = Cells(1, 3).Value 'セルの値取得 Set Obj = Worksheets("Sheet1").Cells.Find(hiduke) If Obj Is Nothing Then MsgBox "該当の日付" & hiduke & "は、ありません。" Else lngYLine = Worksheets(newSh).Cells.Find(hiduke).Row intXLine = Worksheets(newSh).Cells.Find(hiduke).Column     MsgBox hiduke"は、" + CStr(lngYLine) + "行目の" _ + CStr(intXLine) + "列目にあります" End If ================================== Set Obj = Worksheets("Sheet1").Cells.Find(hiduke) で「実行時エラー"9" インデックスが有効範囲にありません」のエラーになります。 ワークブック内には Worksheets("Sheet1")存在しますし、なぜこのようなエラーがでるのか? また、どうしたら解消できるのか?について、教えていただきたく・・・ よろしくお願いいたします。

  • マクロ セル範囲の選択の仕方について

    いつも回答して頂きありがとうございます。 ネット等で検索し、有効なマクロ記述を使用してセル範囲の選択を行いましたが、 自分が思っている通りに動きませんでした。 『質問内容』 C7を起点とした最終の列 (C7:D7) ← 自分の狙いの選択範囲(Dより大きい文字がきて欲しかった) 実際は、(A7:C7)が選択された。 どこらへんの記述が間違っているのでしょうか? 御指導の程よろしくお願い致します。 ちなみに下記が自分が作成中のマクロです。 Sub シートを繰り返し選択する() Dim d As Integer Dim retu As Integer d = 3 retu = Range("IV7").End(xlToLeft).Column Worksheets(Worksheets("一覧").Cells(d, 2).Value).Activate ActiveSheet.Range(Cells(7, 3), Cells(7, retu)).Select End Sub

  • VBAで空欄にデータに表示

    エクセルVBAのIFを使って、シートaのA列に値があって、B列が空欄の場合のみ、空欄のセルにシートbの値を表示させたいです。 上手くできませんでしたので、教えてください。 Sub Do文2() Dim i As Integer i = 1 If Worksheets("a").Cells(i, 2) = "" Then Do While Worksheets("a").Cells(i, 1) <> "" Worksheets("a").Cells(i, 2) = Worksheets("b").Cells(1, 1) i = i + 1 Loop End If End Sub

  • ABookとBBookの同一セルが値か式かを比較

    環境:WindowsXPSP3EXCEL2007VBA:マクロでABookとBBookの同一番地のセルの書式(例:値とは20などのただの値をさします。 数式とは=SUM(A1:A10)などの式で記述された事をさします。)を比較して、違いがあれば、BBookのセルの色も変えます。新たに作成したBBookのsheetにセル番地を書き込みます。これをマクロで作成しましたが、比較の部分で実行時にエラーも無しに止まってしまいます。以下の記述では、駄目でしょうか。何処が悪いのでしょうか?ご教授願います。宜しくお願いもうし上げます。 Private Sub 定数か数式の比較(ii, jj, kk, ll, c, g) Dim y As Integer, x As Integer Dim a As Boolean, b As Boolean Dim ws2 As Object Dim ws3 As Object Set ws2 = Workbooks(bookname2).Worksheets("明細") Set ws3 = Workbooks(bookname2).Worksheets("エラーセル") MsgBox "値か数値の比較に入りました。" For y = kk To ll For x = ii To jj MsgBox "(1)ループに入りました。" MsgBox "(2)SpecialCells(xlCellTypeFormulas, xlLogical)に入りました。" a = ws2.Cells(y, x).SpecialCells(Type:=xlCellTypeFormulas, Value:=xlLogical).Activate Debug.Print a; b = ws3.Cells(y, x).SpecialCells(Type:=xlCellTypeFormulas, Value:=xlLogical).Activate Debug.Print b; If a <> b Then g = g + 1 Debug.Print g; ws2.Cells(y, x).Interior.ColorIndex = 4 ws3.Cells(g, "A") = Cells(y, x).Address(RowAbsolute:=False, ColumnAbsolute:=False) MsgBox "(3)緑に塗り終わりました。" c = c + 1 End If Next x Next y End Sub MsgBox "(2)SpecialCells(xlCellTypeFormulas, xlLogical)に入りました。" の部分で止まってしまいます。引数はキチンと渡っています。イミディエイトウィンドウで確認しました。VBA初心者なので、大変申し訳ありませんが、どなたかお判りになる方は、教えて頂けないでしょうか?宜しくお願い申し上げます。

専門家に質問してみよう