Excel 如果生日列表中的日期与今天匹配,请打开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“有人过生日了!” 如果结束 如果

每次我尝试执行代码时,它都会说“需要对象”

我想打开一个MsgBox,如果我生日列表上的日期与今天相符

生日列表从b2扩展到b100,我想通过查看找到生日

这是我从YouTube视频中提取的一段代码

每次打开工作簿时,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
表示单元格本身的值,如果该范围仅表示单个单元格,否则(即,如果该范围用于多个单元格),它产生一个指向2D
Variant
数组(在本例中为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