Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何在excel工作表中查找日期时间值_Vba_Excel_Datetime - Fatal编程技术网

Vba 如何在excel工作表中查找日期时间值

Vba 如何在excel工作表中查找日期时间值,vba,excel,datetime,Vba,Excel,Datetime,我需要找到第一个包含datetime值的单元格 我感兴趣的单元格显示了这一点 06-Mrz-2015 00:00 它的公式字段有以下内容(日期部分后两个空格) 单元格格式如下所示 DD-MMM-YYYY hh:mm 我试过了,但没找到手机 Public Function FindCurrentCell() As Range Dim cell As Range Dim current As String Sheets("Futures").Select current = Format(D

我需要找到第一个包含datetime值的单元格

我感兴趣的单元格显示了这一点

06-Mrz-2015 00:00

它的公式字段有以下内容(日期部分后两个空格)

单元格格式如下所示

DD-MMM-YYYY hh:mm
我试过了,但没找到手机

Public Function FindCurrentCell() As Range

Dim cell As Range
Dim current As String

Sheets("Futures").Select

current = Format(Date, "dd.mm.yyyy") + "  00:00:00"

Set cell = Cells.Find(What:=current, After:=Range("A1"), LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)

Dim test As String
test = cell.Address

Set FindCurrentCell = cell

End Function

如果你在网上搜索,你会发现许多网站告诉你如何找到一个日期。然而,他们给出了一个魔咒般的答案:“做这一系列复杂的步骤,它就会起作用。”问题是:如果它不起作用,你会怎么做

显然你需要:

.Cells.Find(What:=DateValue(Format(DateWanted, "dd/mm/yyyy")))
其中“dd/mm/yyyy”表示您所在国家/地区的Excel标准日期格式

我所能发现的“dd/mm/yyyy”的任何变体都不允许我成功地找到您希望的格式的日期

问题的根源是Excel如何存储日期。当我输入时,时间是2015年3月7日9:23。如果我键入
?CDbl(日期)
CDbl(现在())
进入即时窗口,我得到:

? CDbl(Date)
 42070 
? CDbl(Now())
 42070.3911805556
42070是自1900年1月1日以来的日期数。3911是(从午夜开始的秒数)除以(一天中的秒数)

因此,如果我在单元格中看到“2015年3月7日”或“2015年3月7日”,我知道,在幕后,Excel正在用
.NumberFormat
保存42070,告诉它42070是一个日期以及如何显示该日期

专家告诉您,在
DateValue(格式(DateWanted,“dd/mm/yyyyy”))
中,您需要按照Excel要求的格式获取“dd/mm/yyyyy”。此语句的问题在于
DateValue
将放弃所有仔细设置的格式并返回一个日期,那么这有什么意义呢

所有这些关于格式的建议不仅是垃圾,而且显然是有害的垃圾。重要的是“What value”是日期类型的。例如,以下两项均有效:

Cells.Find(What:=Date)

Dim SearchDate As Date: SearchDate = Date
Cells.Find(What:=SearchDate)
我想提醒你,日期必须完全一致;例如,搜索“2015年3月7日”不会找到“7匹配2015年9:00”。事实上,这是不真实的。似乎只有在对格式大惊小怪的情况下,经常重复的关于这一点的建议才是正确的

Sub Test()

  Dim RngToday As Range

  Set RngToday = FindCurrentCell

  If RngToday Is Nothing Then
    Debug.Print "Today's date not found"
  Else
    Debug.Print "Today’s date in " & RngToday.Address
  End If

End Sub
Public Function FindCurrentCell() As Range

  Dim cell As Range

  With Worksheets("Futures")

    Set cell = .Cells.Find(What:=Date, After:=.Range("A1"), LookIn:=xlFormulas, _
                           SearchOrder:=xlByRows, SearchDirection:=xlNext)
    If cell Is Nothing Then
      ' Today's date not found
      ' Add any appropriate code
    Else
      ' Today's date found
      ' Add any appropriate code
    End If

  End With

  Set FindCurrentCell = cell

End Function

它在这里工作得很好;您确定公式字段显示的是2015年3月6日00:00,而不是12:00:00 AM/PM吗?这仅仅是一个日期还是一个计算结果?不确定这对使用字符串会有什么影响,但类似于
如果c.NumberFormat类似于“dd.mm.yyy hh:mm”,那么
是否有效你说
NumberFormat
使用连字符,但
current
使用句点。ok
如果c.NumberFormat类似于“DD-MMM-yyyyy hh:mm然后
不管怎样,@tony我不明白为什么需要当前的字符串,所以我可能没有抓住要点。我不会使用
.find
,而是为下一个
@Raystafarian使用
。经过多次实验,我发现关于搜索日期的标准建议是垃圾<代码>当前
不是必需的。更多细节请参见我的答案。根据你的解释,我现在可以找到这样的
。那是OP的意图吗?你能把它展开,找到一组日期中的任何成员吗,比如一年或一个月?@Raystafarian在OP的问题中,函数搜索
current
,这是一个基于函数
Date
的格式化字符串。我的理解是,在工作表“Futures”的某个地方有一个单元格,其中包含以特定方式格式化的今天的日期。我的例程将找到包含今天日期的第一个单元格,无论其格式如何。如果工作表包含今天的多个副本,则我的例程将需要循环,直到找到具有正确日期和正确
.NumberFormat
的单元格。如果格式化是一个麻烦事,我的例程将满足OP的需要。我猜OP使用
Date
是的,搜索是针对今天的。但是,出于我自己的好奇心,我想说这不是一个什么样的规模呢?@Raystafarian。像
FindDate(byVal SearchDate as Date)这样的函数作为Range
可以查找任何感兴趣的日期<代码>查找
没有范围选项;例如,您不能搜索“猫”到“狗”。我不知道如何使用
Find
查找日期范围内的任何日期,如2015年3月1日至2015年3月31日或2015年1月1日至2015年12月31日。我写这篇文章是为了回答你第一个问题的第二部分。我想它也回答了你的第二个问题。我唯一的想法是,比如说,在单元格中循环查找日期格式的单元格,然后比较搜索之外的值。这可能与OP最初的意思相去甚远,所以我离题了+1.
Sub Test()

  Dim RngToday As Range

  Set RngToday = FindCurrentCell

  If RngToday Is Nothing Then
    Debug.Print "Today's date not found"
  Else
    Debug.Print "Today’s date in " & RngToday.Address
  End If

End Sub
Public Function FindCurrentCell() As Range

  Dim cell As Range

  With Worksheets("Futures")

    Set cell = .Cells.Find(What:=Date, After:=.Range("A1"), LookIn:=xlFormulas, _
                           SearchOrder:=xlByRows, SearchDirection:=xlNext)
    If cell Is Nothing Then
      ' Today's date not found
      ' Add any appropriate code
    Else
      ' Today's date found
      ' Add any appropriate code
    End If

  End With

  Set FindCurrentCell = cell

End Function