Excel 如果生日列表中的日期与今天匹配,请打开MsgBox
每次我尝试执行代码时,它都会说“需要对象” 我想打开一个MsgBox,如果我生日列表上的日期与今天相符 生日列表从b2扩展到b100,我想通过查看找到生日 这是我从YouTube视频中提取的一段代码 每次打开工作簿时,MsgBox都会弹出Excel 如果生日列表中的日期与今天匹配,请打开MsgBox,excel,vba,Excel,Vba,每次我尝试执行代码时,它都会说“需要对象” 我想打开一个MsgBox,如果我生日列表上的日期与今天相符 生日列表从b2扩展到b100,我想通过查看找到生日 这是我从YouTube视频中提取的一段代码 每次打开工作簿时,MsgBox都会弹出 Private子工作簿\u Open() Dim cl As范围 Set cl=ThisWorbook.Sheets(“生日”).范围(“B2:B100”) 如果是IsDate(cl),则 如果现在>=cl,那么 MsgBox“有人过生日了!” 如果结束 如果
Private子工作簿\u Open()
Dim cl As范围
Set cl=ThisWorbook.Sheets(“生日”).范围(“B2:B100”)
如果是IsDate(cl),则
如果现在>=cl,那么
MsgBox“有人过生日了!”
如果结束
如果结束
端接头
由于键入错误,您得到了所需的对象错误此工作簿
应该是此工作簿
遇到这样的错误是很正常的。因此,请始终使用选项Explicit
。我已经把它写进去了
那么我可以让它自动添加到我的代码中吗?
是的,你可以。要将其添加到您创建的所有新文件中,只需在VBE中选择“工具”->“选项”,然后勾选“需要变量声明”框
注意:这只会影响您创建的新文件。您需要自己将其添加到现有文件中
我基本上只是希望我的excel在打开msgbox时创建一个msgbox,前提是我的生日列表中有一个日期与今天相符
您可以使用Application.WorksheetFunction.CountIf
检查某个范围内是否有今天的日期
Sub Sample()
Dim ws As Worksheet
Dim rng As Range
Dim matchFound As Long
Set ws = ThisWorkbook.Sheets("Birthdays")
Set rng = ws.Range("B2:B100")
matchFound = Application.WorksheetFunction.CountIf(rng, Date)
If matchFound > 0 Then
MsgBox "Birthday Found"
Else
MsgBox "Birthday Not Found"
End If
End Sub
屏幕截图
cl
是一个范围
对象,代表99个斑点狗细胞,每个细胞封装一个变量
值
IsDate
函数很乐意接受一个变量
,但不知道如何处理其中的99个变量
因为Range
有一个隐藏的默认属性,所以您可以将其当作一个值来使用-但是,特别是对于刚刚开始学习VBA的人来说,它会导致混乱、隐含的“神奇”代码,它说一件事,做另一件事
此处的隐式Range.Value
成员调用产生一个Variant
表示单元格本身的值,如果该范围仅表示单个单元格,否则(即,如果该范围用于多个单元格),它产生一个指向2DVariant
数组(在本例中为99x1)的Variant
这是持有每一个单一的价值观
IsDate
需要一个值,所以如果我们有99个值,我们需要一个循环。但问题是:我们最不想做的事情是迭代单个单元格,获取它们的值
,并验证这一点,因为这将非常缓慢
因此,取而代之的是,我们获取2D变量
数组,并对其进行迭代
现在,无论生日是否匹配,每次我打开excel时,msgbox都会弹出 听起来您的实际代码在某个地方出现了
错误恢复下一步
,这使得VBA忽略任何运行时错误并愉快地继续运行,…您肯定不希望这样。根据经验,切勿在出错时使用下一步继续
来回避错误。当出现“需要对象”错误时,执行通常会停止:无条件的MsgBox
弹出意味着允许在错误状态下继续执行,这不是一件好事
,类型不匹配是由键入错误引起的——这是不允许发生的:确保您在其中键入任何代码的每个模块的顶部都显示Option Explicit
,这样就不会再发生这种情况了。。。对于您的早期绑定代码(后期绑定代码仍然容易出现拼写错误,但这是另一个时代的故事)
最后,请注意,上面提到的几个问题可能已由的代码检查报告(免责声明:我管理这个开源项目)-包括打字错误、隐式默认成员调用,以及缺少
选项Explicit
您无法针对和范围数组测试单个值。您需要循环范围并测试每个范围。即使我将范围声明为B2,它仍然不会执行cl
是一个范围,而不是一个值。尝试IsDate(cl.value)
(假设cl
是一个单元格)@controlnetic.nomad,这只会使隐式成员调用显式化。如果它改变了什么,我会很惊讶。你得到的对象所需的错误是因为一个打字错误。这本书应该是这本工作簿啊啊啊,该死的,当然是一个打字错误!!好眼力!现在可能是一个很好的时机来提及选项Explicit
;-)非常感谢你!你是救命恩人!
If IsDate(cl.Value) Then
If cl.Count = 1 Then
'single-cell range: not a 2D array
If Now >= cl.Value Then
MsgBox "Somebody's had a birthday on " & Format(cl.Value, "yyyy-mm-dd")
End If
Exit Sub
End If
Dim values As Variant
values = cl.Value
Dim currentRow As Long
For currentRow = LBound(values, 1) To UBound(values, 1)
Dim currentCol As Long
For currentCol = LBound(values, 2) To UBound(values, 2)
Dim currentValue As Variant
currentValue = values(currentRow, currentCol)
If IsDate(currentValue) Then
If Now >= currentValue Then
MsgBox "Somebody's had a birthday on " & Format(currentValue, "yyyy-mm-dd")
Exit Sub
End If
End If
Next
Next