EXCEL関数について質問です。


現在以下のような条件のエクセルデータがあります。

http://oskuni7.sakura.ne.jp/hatena//question22/question22.htm

この状態のエクセルデータを

★シート1と2のIDを基に一番新しい最新取引日と一番最新の取引回数(取り引数が多いもの)をシート1に抽出するようにしたいと考えています。

上記を可能にする現関数はありますでしょうか?

もしない場合ですが、時間があるかたでユーザー定義関数を作成していただけるかたがおりましたら、作成していただきたいのですがよろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:2009/03/02 00:38:25
  • 終了:2009/03/09 00:40:02

ベストアンサー

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912009/03/02 01:09:39

ポイント60pt

一般関数でもできそうですが、データ列や内容に依存しそうなのでとりあえずマクロにしてみました。

Const SrcSheetName = "シート2"

'-------------------------------------------------------
Function getLastDate(tName As String) As Date
'-------------------------------------------------------
    Dim r As Range
    Dim lastRow As Long
    lastRow = Worksheets(SrcSheetName).Range("A" & Rows.Count).End(xlUp).Row
    For Each r In Worksheets(SrcSheetName).Range("A1").Resize(lastRow, 1)
        If r.Value = tName Then
            If DateDiff("s", getLastDate, r.Offset(0, 1)) > 0 Then
                getLastDate = r.Offset(0, 1)
            End If
        End If
    Next
End Function

'-------------------------------------------------------
Function getLastCount(tName As String) As String
'-------------------------------------------------------
    Dim r As Range
    Dim dd As Date
    Dim lastRow As Long
    lastRow = Worksheets(SrcSheetName).Range("A" & Rows.Count).End(xlUp).Row
    For Each r In Worksheets(SrcSheetName).Range("A1").Resize(lastRow, 1)
        If r.Value = tName Then
            If DateDiff("s", dd, r.Offset(0, 1)) > 0 Then
                dd = r.Offset(0, 1)
                getLastCount = r.Offset(0, 2)
            End If
        End If
    Next
End Function
B2=getLastDate(A2)
C2=getLastCount(A2)

のように設定して、試してみてください。

id:aiomock

ご回答ありがとうございます。試してみます。

2009/03/02 01:19:23
  • id:Mook
    数式でも可能ですので、対応例です。
    (式が長くなるのでエラー処理は入れていません。)

    最初にシート2で
    名前の範囲(A列)を選択し、名前BOX(下記参照)に「ORDER_NAME」とします。
    日付の範囲(B列)を選択し、名前BOXに「ORDER_DATE」とします。
    順番の範囲(C列)を選択し、名前BOXに「ORDER_COUNT」とします。
    http://blog.livedoor.jp/mizo3des/archives/10158879.html

    シート1で
    B2=SUMPRODUCT(MAX((ORDER_NAME=A2)*ORDER_DATE))
    C2=INDEX(ORDER_COUNT,MATCH(A2&B2,INDEX(ORDER_NAME&ORDER_DATE,),0))
  • id:aiomock
    Mook さん

    ご回答ありがとうございます。

    マクロ実行できました。

    数式を実行してみたのですが、数式は両方できませんでした。

    B2=SUMPRODUCT(MAX((ORDER_NAME=A2)*ORDER_DATE))

    こちらなのですが 12行から私の場合はデータの判定が始まり、シート1のヤフーIDはA列にあるので

    =SUMPRODUCT(MAX((ORDER_NAME=A12)*ORDER_DATE))

    を日付を求めるB列の12行目に設定しました。

    がしかし、出力結果は #N/A となり、エラー表示となってしまいます。
  • id:Mook
    単純に
    =MAX(ORDER_DATE)
    などは正常に数値が出るでしょうか。
    一番間違いやすいのは名前の設定の部分ですが、そのあたりをもう一度ご確認ください。

    また、本来はIf などを使用しエラーハンドリングをするのですが、今回該当するものがない
    場合等では、エラーになります。
  • id:aiomock
    Mook さん

    試してみました。

    =MAX(ORDER_DATE) では正常に数値が出ます。

  • id:Mook
    シート1で
    D12=COUNTIF(ORDER_NAME,A12)
    以下、名前の範囲へコピーですべて1以上になっていますか?
    これが0のところはエラーになります。

    名前範囲はすべてのデータが同じ行範囲になっていますか。
    シート2で日付列を選択し、書式を数値にした際にすべて39xxx.・・・ という数値になりますか?
    ならないようでしたら、日付以外のものが記載されているので、日付に修正ください。
    (確認後は書式を日付に戻してください)

    推測できるのはこのあたりでしょうか。
    こちらでは一応。EXCEL 2003、2007で正しく表示されることは確認しています。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません