[[20100713014944]] 『類似した値を検索したい』(みっひー) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『類似した値を検索したい』(みっひー)

'09/1/1 100

'09/1/2 130

'09/1/3 185

'09/1/4 110

  ・

  ・

  ・

という昨年度の実績のデータがあり

他方で

'10/1/1 101

'10/1/2 103

'10/1/3 200

  ・

  ・

という今年度のデータがあるのですが,類似するデータをすばやく検索して表示させるにはどうしたらよいのでしょうか。

「各日付ごとに,(年度は無視して)1週間以内の幅で,差が〇〇以内の実績があればそれを表示する」というふうにしたいのですけれど。

たとえば,今年の7月13日に150の実績が上がったとして,昨年の7月6日から7月20日までの間に,145〜155くらいの実績が上がったところはないかな〜,という感じです。

7月13日の分だけならむりやりifとかの関数を並べて何とかなるかもと思うのですが,これを今年の1月1日から全部の日についてやるとなると初心者の私にはお手上げです(^_^;)。

エクセルは2003です。


 Pivotで行に日付、列にデータ項目、データにデータを個数等でセットして、
 列のところで見たいデータを選択する(たとえば145から155のみ選択する)と、
 該当日付がわかるのですが、いかがですか?

 (こだぬき)

ありがとうございます。
ただ、その方法だと「7月13日の実績は150だったから145から155まで選択して、次には7月14日の実績が170だったから165から175まで選択して」とか手作業でやらないといけないのかな。そこはあきらめるしかないんですかね。(^^;)

(みっひー)


 回答ではありません、

 データの日付は昇順になっているのでしょうか?
 また、日付に抜けている日は無いのでしょうか

 >(年度は無視して)1週間以内の幅で 
 データは複数年分あるのでしょうか?
 1週間とは 厳密に考えるのでしょうか
 ・該当日が存在しない(2/29)の場合どのような範囲になるのでしょう
 ・前年度の場合 各日付の372前から358日前の範程度でいいのでしょうか

 >類似するデータをすばやく検索して表示させるにはどうしたらよいのでしょうか
 有り、無しがわかればいいのでしょうか
 該当日が複数の場合、すべての日にちを表示するということでしょうか

 質問ばかりですいません、質問の返事によって回答も変わりますのであしからず

 参考までに
 =SUMPRODUCT((A1:A10>各日付-372)*(A1:A10<各日付-358)*(B1:B10>実績-5)*(B1:B10<実績+5))
 でおおよその該当日数が出ます

 By しげちゃん

 >Pivotで行に日付、列にデータ項目、データにデータを個数等でセットして、
 >列のところで見たいデータを選択する(たとえば145から155のみ選択する)と、
 >該当日付がわかるのですが、いかがですか?

 Pivotで設定した日付を週単位で見るというのは?
http://www.relief.jp/itnote/archives/002672.php

 (うっかりさん)

 ウェブ環境のない(もうすぐ出来るかも・・;)職場に異動してきて、、
 仕事の合間に時間があったので、トライしてみました。。だけど、もう見てないかなぁーー?
 バックアップをとってから実行してみて。。

 <Sheet1>シート・・・検索対象範囲(過去の実績分)
   |    A   |  B |
 01|日付    |実績|
 02|2009/9/1| 107|
 03|2009/9/2| 108|
 04|2009/9/3| 105|
 05|2009/9/4| 136|
 06|2009/9/5| 145|
 07|2009/9/6| 141|
 08|2009/9/7| 116|
 09|2009/9/8| 131|
 10|2009/9/9| 107|

 <2010data>シート・・・(現在のシート)検索日または実績を選択し、「ダブルクリック」する。。
   |    A   |  B |
 01|日付    |実績|
 02|2010/9/1| 107|
 03|2010/9/2| 108|
 04|2010/9/3| 105|
 05|2010/9/4| 136|
 06|2010/9/5| 145|
 07|2010/9/6| 141|
 08|2010/9/7| 116|

 <検索>シート・・・検索条件を手入力し、抽出する。。
   |    A   |  B |    C    |  D |
 01|開始年  |2009|日付     |実績|
 02|終了年  |2011|2009/9/4 | 136|
 03|開始日付|9/3 |2009/9/6 | 141|
 04|終了日付|9/17|2009/9/10| 139|
 05|基準値  | 139|2009/9/16| 139|
 06|増減    |   5|2009/9/17| 138|
 07|        |    |2010/9/8 | 135|
 08|        |    |2011/9/6 | 134|

 <<下準備>>                            ↓
 1.<Sheet1>と<2010data>の日付データが→ '09/1/1 となっていると、「シリアル値」でなく「文字列」なので、
   月をまたがった時などの、日付の計算が出来ません。。
 2.上記の2つのシートで、それぞれ日付データの入っている "A列" を列ごと選択して、
      メニューの「データ」→「区切り位置」→そのまま「次へ」→そのまま「完了」をクリックすると、「シリアル値」になります。
 3.日付データの表題(A1)を "日付" と入力する。。
 4.右隣の数値の表題(B1)を "実績" と入力する。。

 <<運用>>
 1.<2010data>の画面で、下記の「準備」マクロを実行します。
 2.<2010data>の右側に<検索>のシートが作成されます。
 3.<検索>B1〜B6を直接入力して、「検索実行」マクロを実行すると、その結果がこのシートに反映されます。

 ここで、みっひーさんの希望する「仕様」どおりに運用するなら、、
        ※ <検索>シートが出来上がった状態で
          ※ <2010data>の "A列またはB列" のデータ内を「ダブルクリック」すると、、
                <検索>B1〜B6には、、
                   "年"は<Sheet1>のすべてのデータの範囲で、→つまり、ここには過去何年分もデータを蓄積できる。。
                      "日付"は"+−7日"を指定、
                         "基準値"は「ダブルクリック」した値、
                            "増減"は "5"
                                       と条件を設定して、抽出を実行します。。

 下記のコードをデータの入っている<2010data>のシートモジュールに貼り付けて、、
       ↓
 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim myYear1 As Long
    Dim myYear2 As Long

    If Not Intersect(Target, Range("A:B")) Is Nothing Then
        Cancel = True
        With Sheets("Sheet1")
            myYear1 = WorksheetFunction.Min(.Range("A:A"))
            myYear2 = WorksheetFunction.Max(.Range("A:A"))
        End With
        With Worksheets("検索")
            .Range("B1").Value = Year(myYear1)
            .Range("B2").Value = Year(myYear2)
            .Range("B3").Value = Month(Cells(Target.Row, 1).Value - 7) & "/" & Day(Cells(Target.Row, 1).Value - 7)
            .Range("B4").Value = Month(Cells(Target.Row, 1).Value + 7) & "/" & Day(Cells(Target.Row, 1).Value + 7)
            .Range("B5").Value = Cells(Target.Row, 2).Value
            .Range("B6").Value = 5
        End With
    End If
    Call 検索実行
 End Sub

 さらに、下記のコードを標準モジュールに貼り付けて、、
       ↓
 Sub 準備()
    Dim myWS As Worksheet

    For Each myWS In Worksheets
        If myWS.Name = "検索" Then
            Application.Goto Reference:=Worksheets("検索").Range("B1"), scroll:=False
            Exit Sub
        End If
    Next myWS
    Worksheets.Add After:=ActiveSheet
    ActiveSheet.Name = "検索"
    Range("A1:A6").Value = WorksheetFunction.Transpose([{"開始年","終了年","開始日付","終了日付","基準値","増減"}])
    Range("C1:L1").Value = [{"日付","実績","","日付","日付","実績","実績","","日付","実績"}]
    Range("B3:B4").NumberFormatLocal = "@"
    Range("F:L").EntireColumn.Hidden = True
    Range("B6").Value = 5
    Range("B1").Select
 End Sub

 Sub 検索実行()
    Dim i As Byte
    Dim myFind1 As Byte, myFind2 As Byte
    Dim myYear1 As Integer, myYear2 As Integer
    Dim myDay1 As String, myDay2 As String

    Worksheets("検索").Activate
    myYear1 = Range("B1").Value
    myYear2 = Range("B2").Value
    myDay1 = Range("B3").Value
    myDay2 = Range("B4").Value
    myFind1 = WorksheetFunction.Find("/", myDay1)
    myFind2 = WorksheetFunction.Find("/", myDay2)
    If Range("C2").Value <> "" Then
        Range(Range("C2"), Range("C" & Rows.Count).End(xlUp)).Resize(, 2).Value = ""
    End If
    Range("H2").Value = ">=" & Range("B5").Value - Range("B6").Value
    Range("I2").Value = "<=" & Range("B5").Value + Range("B6").Value
        For i = 1 To myYear2 - myYear1 + 1
            Range("F2").Value = ">=" & myYear1 + i - 1 & "/" & Mid(myDay1, 1, myFind1 - 1) & "/" & Right(myDay1, Len(myDay1) - myFind1)
            Range("G2").Value = "<=" & myYear1 + i - 1 & "/" & Mid(myDay2, 1, myFind2 - 1) & "/" & Right(myDay2, Len(myDay2) - myFind2)
            Sheets("Sheet1").Columns("A:B").AdvancedFilter Action:=xlFilterCopy, _
            CriteriaRange:=Range("F1:I2"), CopyToRange:=Columns("K:L"), Unique:=False
            If Range("K2").Value <> "" Then
                Range(Range("K2"), Range("K" & Rows.Count).End(xlUp).Resize(, 2)).Copy Cells(Rows.Count, 3).End(xlUp).Offset(1)
            End If
        Next i
    Range("B5").Select
 End Sub
                                                                       ↑
 もし、過去のデータの入っているシート名が "Sheet1" でなく他の名称だったら、ここから上に8行目の
                                           Sheets("Sheet1").Columns("A:B")→ Sheets("その名称").Columns("A:B")に変更!!
                                                   ^^^^^^                            ^^^^^^^^
 さらに、最初のシートモジュールの上から6行目の With Sheets("Sheet1")→ With Sheets("その名称")に変更!!
 すべて貼り付けたら、「準備」マクロから実行してみて。。     ^^^^^^                  ^^^^^^^^
 (kei)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.