• ベストアンサー

エクセルである年の最初の行を見つけたいのです。

お世話になります。 エクセルのシートのある列に昇順に並んだ日付データがあり、 その中から指定した年の最初のデータを検索するマクロを作成したいです。 (データは1990年から2012年までで50000件ほどあり、歯抜け、日付重複があります。 また、1/1のデータがない年もあります) Findメソッドではその年の1/1がなく1/2以降からの場合にはうまくいかず、 Loop系の場合は2011年のデータを対象としたときには1990年の最初のデータから 読み飛ばしをしなければならず、処理に無駄な時間がかかってしまいます。 何かいい方法はないでしょうか?

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

  • ベストアンサー
noname#187541
noname#187541
回答No.1

こんばんは。 >Findメソッドではその年の1/1がなく1/2以降からの場合にはうまくいかず データが降順に並んでいるなら、エクセルの検索機能で、検索する文字列を2011などとすれば、完全一致でない限り検索できます。 マクロは上記の操作を「マクロの記録」で記録すれば分かります。

naok023
質問者

お礼

ご教授ありがとうございました。 Ctrl+Fの検索で「セル内容が完全に同一であるものを検索する」ははずして試してみていたのですが、うまく検索できず質問させていただきました。 検索できるとの回答でしたので、他のオプションをいろいろ変えてみたところ、検索対象を「値」から「数式」に変えたら検索できました。 LookInの違いがあまりわかっていなかったのですが、勉強になりました。

その他の回答 (3)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

No.3です! たびたびごめんなさい。 前回のコード内の >Application.ScreenUpdating = False の行と >Application.ScreenUpdating = True の2行を削除してください。 画面更新を止めていますので、いくらその行を選択しても選択セルが画面上にない場合は 選択セルが表示されません。 何度も失礼しました。m(_ _)m

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんばんは! 一例です。 A列に日付データがあるとして、A列を選択するようにしてみました。 Sub test() Dim i As Long, j As Long, k As Long i = Cells(Rows.Count, 1).End(xlUp).Row k = Application.InputBox("検索西暦年を入力") Application.ScreenUpdating = False Columns(1).Insert Range(Cells(1, 1), Cells(i, 1)).Formula = "=YEAR(B1)" If WorksheetFunction.CountIf(Columns(1), k) Then j = WorksheetFunction.Match(k, Columns(1), False) Columns(1).Delete Cells(j, 1).Select Else MsgBox "検索年データがありません。" Columns(1).Delete End If Application.ScreenUpdating = True End Sub こんな感じではどうでしょうか?m(_ _)m

naok023
質問者

お礼

ご教授ありがとうございました。 MATCH関数のマクロ内での使用方法がよくわかりました。 今回はFindメソッドのパラメーターの使い方がよくわからなかったのが、発端でしたが、使ったことのないMATCH関数の使い方がわかり大変勉強になりました。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.2

例えばA列に昇順で日付のデータが入力されており、B列にデータが入力されているとします。 そこでC2セルに指定する年を1996のように入力するとします。 マクロでその年の最初のデータD2セルに表示させるとしたら例えば次のようなマクロにすればよいでしょう。   Range("D2").Select ActiveCell.FormulaR1C1 = "=INDEX(C[-2],MATCH(DATE(RC[-1],1,1)-0.01,C[-3],1)+1)" Range("D3").Select

naok023
質問者

お礼

ご教授ありがとうございました。 昇順並びなので指定した年の1/1から15分引いてMATCH関数を使ったのですね。 今回はマクロの中で指定した年の範囲の最初のデータの位置を求めて使いたかったのでベストアンサーではありませんでしたが、それはこちらの質問があいまいだったせいでした。 INDEXもMATCHも使ったことがなかったので大変勉強になりました。 いつもVLOOKUP用にわざわざ列を置き換えて検索用のテーブルを作っていたりしたのでそちらで応用させていただきます。

関連するQ&A