アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。
エクセルのシートのある列に昇順に並んだ日付データがあり、
その中から指定した年の最初のデータを検索するマクロを作成したいです。
(データは1990年から2012年までで50000件ほどあり、歯抜け、日付重複があります。
また、1/1のデータがない年もあります)

Findメソッドではその年の1/1がなく1/2以降からの場合にはうまくいかず、
Loop系の場合は2011年のデータを対象としたときには1990年の最初のデータから
読み飛ばしをしなければならず、処理に無駄な時間がかかってしまいます。

何かいい方法はないでしょうか?

A 回答 (4件)

こんばんは。



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

マクロは上記の操作を「マクロの記録」で記録すれば分かります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/08/25 02:02

例えば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
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/08/25 02:27

こんばんは!


一例です。

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/08/25 02:32

No.3です!


たびたびごめんなさい。

前回のコード内の

>Application.ScreenUpdating = False
の行と
>Application.ScreenUpdating = True
の2行を削除してください。

画面更新を止めていますので、いくらその行を選択しても選択セルが画面上にない場合は
選択セルが表示されません。

何度も失礼しました。m(_ _)m
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!