Excel 当给定2个日期时,查找单元格范围

Excel 当给定2个日期时,查找单元格范围,excel,vba,Excel,Vba,我有一张数字从1到10的桌子。(从D2开始到M2) 假设在A1中有2019年9月3日 而在B1中有2019年9月6日 在C1中有Hello 在A列中,我有一系列从A3到A10的单词 下面是Excel表格的一个示例 我想做的是:在列A中搜索学生这个词,当我找到它时,从A1-->3中获取数字 和A2-->6并将C1中的单词Hello写在查找到的单词学生的第3到6行的单元格中 所以我的输出是: 这是我目前的代码: Dim Cell As Range Columns("A:A").Select S

我有一张数字从1到10的桌子。(从D2开始到M2)

假设在A1中有2019年9月3日

而在B1中有2019年9月6日

C1中有Hello

在A列中,我有一系列从A3到A10的单词

下面是Excel表格的一个示例

我想做的是:列A中搜索学生这个词,当我找到它时,从A1-->3中获取数字 和A2-->6并将C1中的单词Hello写在查找到的单词学生的第3到6行的单元格中

所以我的输出是:

这是我目前的代码:

Dim Cell As Range
Columns("A:A").Select 
Set Cell = Selection.Find(What:="Student", After:=ActiveCell, LookIn:=xlFormulas, _
    LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False)

If Cell Is Nothing Then
    MsgBox "Word not found"

Else
    MsgBox "Word found"
End If

基本上我可以找到单词Student,但不知道如何在3到6之间的单元格中写单词Hello

以下代码的一些注释(未测试!)

1) 使用VBA时,请始终尝试使用工作表限定符。这将允许更干净的代码,减少不必要错误的空间

2) 当使用
.Find
方法时,我使用
LookAt:=xlWhole
因为如果不明确定义此方法,您的代码将使用您在Excel中使用的最后一个已知方法。同样,显式定义也减少了出错的空间

3) 尝试在编写代码时包含错误处理。这为将来的调试提供了“断点”

4) 您可以使下面的内容比当前更加动态。但我会让你自己去学习怎么做

选项显式
子搜索和构建()
Dim R搜索范围
一天一样长,两天一样长
调暗lColOne为长,lColTwo为长
暗淡的贝壳如细绳
将wsS1设置为工作表
我想我会坚持多久
'设置工作表对象
设置wsS1=ThisWorkbook.Sheets(“Sheet1”)
'存储变量
lDayOne=天(wsS1.范围(“A1”).值)
lDayTwo=天(wsS1.范围(“B1”).值)
sHello=wsS1.范围(“C1”).值
“首先找到学生
设置rSearch=wsS1.Range(“A:A”).Find(What:=“Student”,LookAt:=xlother)
'错误处理
如果rSearch什么都不是,那么
MsgBox“错误,找不到学生。”
出口接头
如果结束
'现在向前循环以查找第一个日期和第二个日期存储列的名称
'必要时调整这些限制-可使其动态
对于i=4到13
如果wsS1.Cells(2,i).Value=lDayOne,则
lColOne=i
如果结束
如果wsS1.Cells(2,i).Value=lDayTwo,则
lColTwo=i
退出
如果结束
接下来我
'现在合并范围
wsS1.Range(wsS1.Cells(rSearch.Row,lColOne),wsS1.Cells(rSearch.Row,lColTwo)).Merge
'设置vvalue
wsS1.Cells(rSearch.Row,lColOne).Value=sHello
端接头

这只是解决问题的一种方法。希望这有助于你的理解

这里不需要循环-只需找到您的值并解析日期即可。假设要查找的值存在于
列A
中,并且表从
列D
开始,则列之间存在明确的关系,即
天(日期)+3


我试过这个:

Dim ThisRow As Long

Dim FindWhat As String
FindWhat = "Student"

Dim MyStart As Byte
Dim MyEnd As Byte

MyStart = Day(Range("A1").Value) + 3 'we add +3 because starting 1 is in the fourth column
MyEnd = Day(Range("B1").Value) + 3 'we add +3 because starting 1 is in the fourth column

Dim SearchRange As Range
Set SearchRange = Range("A3:A10") 'range of values

With Application.WorksheetFunction
    'we first if the value exists with a count.
    If .CountIf(SearchRange, FindWhat) > 0 Then 'it means findwhat exists
        ThisRow = .Match(FindWhat, Range("A:A"), 0) 'we find row number of value

        Range(Cells(ThisRow, MyStart), Cells(ThisRow, MyEnd)).Value = Range("C1").Value
        Application.DisplayAlerts = False
        Range(Cells(ThisRow, MyStart), Cells(ThisRow, MyEnd)).Merge
        Application.DisplayAlerts = True
    Else
        MsgBox "Value 'Student' Not Found"
    End If
End With
注意,我使用了工作表函数COUNTIF和MATCH。MATCH将查找元素在某个范围内的位置,因此如果您检查整个列,它将告诉您行号。但如果它什么也没发现,它就会出错。避免这种情况的简单方法是,首先,使用COUNTIF计算值是否存在于该范围内,如果存在,则可以安全地使用MATCH

另外,请注意,因为我们使用的是MATCH,所以此函数只查找第一个重合点,所以如果列A中的值列表重复,则此方法将不适用于您


你的
范围。Find
正在
xlFormulas
中查找。这应该是最有可能的值。另外,我会删除
列(“A:A”)。选择
并明确限定该范围。耶,我没有注意到。。。我选择整个专栏是因为可能会有更多的词,只有这些词。。。所以基本上我不知道真正的范围,你可以通过从下到上查找最后使用的行,然后在该范围内搜索,而不是整个列,来明确定义范围。这不是你的问题,只是一个更好的实践,使用整个专栏不是问题。跳过
。选择
行并直接在
Find()
行中引用它:
Set Cell=Columns(“A:A”)。查找…
@urderboy只是尝试使用OP已经演示过的知识。哇,这是一个非常好的示例!我会记下,因为我从不处理错误@院长:您是一位教授,在
活动中,您是一位很好的教授。偷窃因为它更直观:)(+1)@ChangeWorld我很高兴能帮上忙。如果这是您正在寻找的答案,请不要忘记标记为答案以关闭票据。:)从未想过拆分日期以获得索引0中的日期,我最终将其更改为
day
函数,因为我更喜欢它。我想拆分的好处是它也可以处理伪装成日期的字符串。我最喜欢没有循环的代码,因为我真的很讨厌它,很好的方法,不幸的是我接受了@Dean…@ChangeWorld,他有一个很好的解决方案。没必要在这里道歉,哈哈。你为自己选择了答案,但这个答案可能会帮助其他人在路上遇到你的问题:)都有优点
Dim ThisRow As Long

Dim FindWhat As String
FindWhat = "Student"

Dim MyStart As Byte
Dim MyEnd As Byte

MyStart = Day(Range("A1").Value) + 3 'we add +3 because starting 1 is in the fourth column
MyEnd = Day(Range("B1").Value) + 3 'we add +3 because starting 1 is in the fourth column

Dim SearchRange As Range
Set SearchRange = Range("A3:A10") 'range of values

With Application.WorksheetFunction
    'we first if the value exists with a count.
    If .CountIf(SearchRange, FindWhat) > 0 Then 'it means findwhat exists
        ThisRow = .Match(FindWhat, Range("A:A"), 0) 'we find row number of value

        Range(Cells(ThisRow, MyStart), Cells(ThisRow, MyEnd)).Value = Range("C1").Value
        Application.DisplayAlerts = False
        Range(Cells(ThisRow, MyStart), Cells(ThisRow, MyEnd)).Merge
        Application.DisplayAlerts = True
    Else
        MsgBox "Value 'Student' Not Found"
    End If
End With