Excel 当给定2个日期时,查找单元格范围
我有一张数字从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行的单元格中 所以我的输出是: 这是我目前的代码: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
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