1

Excel の 3 つの列にデータを保存しています

列 A: シリアル番号 列 B: 日付 列 C: 値 (例: コスト)

特定のシリアル番号 (列 A) と日付 (列 B) に関連付けられた値 (列 C) を探す必要があります。

たとえば、下のスクリーンショットで、シリアル番号 (T455) と日付 (2010 年 12 月 13 日) に関連付けられた値を探したい場合、値は 8 である必要があります。

ここに画像の説明を入力

私が思いつく唯一の方法は、値を探すたびにすべてのセルを調べることになるため、計算効率が悪いでしょう。

たとえば、特定のシリアル番号の検索領域を制限する方法はありますか?

たとえば、シリアル番号 T455 の値を探している場合、テーブル全体を検索するのではなく、行 (6 ~ 13) の日付を検索し、列 C で対応する値を見つけるようにコードを制限するにはどうすればよいでしょうか?

Sub FindValue()

Dim S as String
Dim D as Date
Dim V as Integer

S = T455
D = Dec 13, 2010

for i = 1 to Range("A1").End(xldown).Row 

If Range("A" & i) = S And Range("B" & i) < Date - 7 And Range("B" & i) < Date + 7   Then
' This way i search a date range rather than a specific date

V = Range("C" & i).Value

End If

End Sub

While ループ、または Lookup 関数を考えましたが、行き止まりになりました。

4

2 に答える 2

2

はるかに簡単で頭痛の少ない非VBAソリューション。

列 A は、A1 = "=B1&C1" の式で構成されます。

セル G1 の数式は、数式バーに表示されます。

ここに画像の説明を入力

更新 これはより速く動作するVBAソリューションですが、あなたが書いたものに基づいて、私にはわからないメモがいくつかあります。また、コードが思い通りに機能するように、いくつかのコメントを参照してください。

Sub FindValue()

Dim S As String, D As Date, V As Integer, rngFound As Range, cel As Range

S = "T455" 'needs quotes around the string
D = "Dec 13, 2010" 'needs quotes around the date

Dim wks As Worksheet
Set wks = ActiveSheet

With wks

     'always better to AutoFilter than Loop when you can!
    .UsedRange.AutoFilter 1, S
    .UsedRange.AutoFilter 2, ">" & D - 7, xlAnd, "<" & D + 7

    Set rngFound = Intersect(.UsedRange, .Columns(3)).SpecialCells(xlCellTypeVisible)

    'the only thing here is if you have a date range _
        'you may return more than one result _
        'in that case, I don't know what you want to do with all the V's

    If Not rngFound Is Nothing Then
        For Each cel In rngFound
            V = cel.Value
        Next
    End If

    .AutoFilterMode = False

End With

End Sub
于 2012-06-27T18:15:46.360 に答える
1

非 VBA ソリューションを楽しませたい場合は、基本的に次の式を使用するこの実装を使用できます。

=IFERROR(INDEX(List, MATCH(0, COUNTIF(H1:$H$1, List)+
  IF(Category2<>Criteria2, 1, 0)+IF(Category1<>Criteria1, 1, 0), 0)), "")

VBA の方法はいくつかありますが、言語にどれだけ慣れているか、ソリューションをどれだけ効率的にしたいかによって異なります。私の頭の上から:

1) 両方の基準でリストをフィルタリングし、表示されている行 (存在する場合) に関連する値を返します。

2) これらの 2 つの列でデータを並べ替え (最初にシリアル順、次に日付順)、検索を実行します (おそらく のような組み込み関数を呼び出す必要がありますMATCH) 。

于 2012-06-27T18:17:48.237 に答える