Excel 在与另一列和日期匹配的列中搜索值?

Excel 在与另一列和日期匹配的列中搜索值?,excel,vba,Excel,Vba,我将数据存储在Excel的三列中 A列:序列号 B栏:日期 C栏:价值(如成本) 我需要查找与特定序列号(a列)和日期(B列)相关联的值(C列) 例如,在下面的屏幕截图中,如果我想查找与序列号(T455)和日期(2010年12月13日)相关的值,那么该值应该是8 我唯一能想到的方法是计算效率低下,因为每次我寻找一个值时,我都会遍历所有的单元格 例如,是否有一种方法可以限制给定序列号的搜索区域 例如,如果我正在查找序列号T455的值,我如何限制代码在行(6-13)中搜索日期并在列C中找到相应的值

我将数据存储在Excel的三列中

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
子FindValue()
像线一样变暗
日期
作为整数的Dim V
S=T455
D=2010年12月13日
对于i=1到范围(“A1”)。结束(xldown)。行
如果范围(“A”&i)=S,范围(“B”&i)<日期-7,范围(“B”&i)<日期+7,则
'这样我可以搜索日期范围,而不是特定日期
V=范围(“C”和i).值
如果结束
端接头

我想到了While循环或查找函数,但却走到了死胡同。

非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
子FindValue()
Dim S作为字符串,D作为日期,V作为整数,RNG作为范围,cel作为范围
S=“T455”需要在字符串周围加引号
D=“2010年12月13日”需要日期前后的报价
将工作作为工作表
设置wks=ActiveSheet
有工作
'如果可以,自动筛选总是比循环更好!
.UsedRange.AutoFilter 1,S

.UsedRange.AutoFilter 2,“>”&D-7,xlAnd,“如果您愿意接受非VBA解决方案,则可以使用,它基本上使用以下公式:

=IFERROR(INDEX(List, MATCH(0, COUNTIF(H1:$H$1, List)+
  IF(Category2<>Criteria2, 1, 0)+IF(Category1<>Criteria1, 1, 0), 0)), "")
=IFERROR(索引(列表,匹配(0,COUNTIF)(H1:$H$1,列表)+
如果(类别2标准2,1,0)+如果(类别1标准1,1,0,0)),“”)
有几种VBA方法,这实际上取决于您对该语言的熟悉程度以及您希望解决方案的效率。我不知道:

1) 使用这两个条件筛选列表,然后在任何可见行(如果有)中返回相关值


2) 按这两列对数据进行排序(先按序列,然后按日期),然后执行搜索(您可能希望调用内置函数,如
MATCH

我喜欢这个想法,但它有一些问题,具体取决于日期/序列组合。例如,如果您有“S111”和“1/1/2000”,您将看到这会创建与“S110”和“S110”相同的值1/1/2000“。除此之外,这是一个很好的简单解决方案。再仔细考虑一下,您可能可以通过添加一个下划线或类似的分隔符来避免这种情况,而在序列/日期列中不存在分隔符。另外,如果您执行我提到的排序,那么您可以在没有VBA的情况下使用一些。@Zairja-串联
S111&1/1/2000
S110&1/1/2000
如何创建相同的值?如果你在电子表格上这样做,第一个结果是
S11136526
,第二个结果是'S11036526'(它使用了日期序列号)我的错误,我的意思是更类似于
S111&1/1/2000
S11&10/16/2273
(两者最终都是
S11136526
)或
S1113&11/12/1917
,但是对于Alaa可能使用的日期范围,这不应该是一个问题。@Zairja-哦,好的。这是一个很好的观点,但是正如你所说的,用户可能永远也找不到自己。正是这些案例教会你成为一名更好的程序员/公式编写者。非常感谢Zaiirja。我会考虑这一切。谢谢你的宝贵意见。