使用带有循环和If语句的DateSerial函数

时间:2016-01-14 12:58:20

标签: vba excel-vba excel

我正在尝试编写一个代码,该代码将隐藏所有过去的日期和一年的数据库中的空白行。下面代码的问题是代码会看到要解决的数学问题的日期,即<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <body> <button class="btn-nav"> <div class="bar arrow-top-r"></div> <div class="bar arrow-middle-r"></div> <div class="bar arrow-bottom-r"></div> </button> </body>因为除法。我有一个建议使用DateSerial函数,但我不知道如何在循环或if语句中使用它。

代码原样:

? 1/1/2016 < 1/14/2016 = false

使用DateSerial尝试的代码:

 Sub Hide_Dates()
 Dim This_Year As Range
 Dim CD As Date
 Dim SD As Date

 Application.ScreenUpdating = False
 Application.Calculation = xlCalculationManual

 Set This_Year = Range("A5:A3000")
 This_Year.EntireRow.Hidden = False
 i = 5
'CD = Format(Date, "dddd, mmmm dd,yyyy")
 CD = Date

 Do Until Cells(i, 1) = CD

 SD = Cells(i, 1).Value
 Debug.Print i
 Debug.Print SD
 Debug.Print CD
 If SD < CD Or SD = "" Then
     Rows(i).EntireRow.Hidden = True
 End If

 i = i + 1
 Loop

 Application.ScreenUpdating = True
 Application.Calculation = xlCalculationAutomatic

 End Sub

1 个答案:

答案 0 :(得分:0)

你需要不止一次尝试:这是一个问题,你可以通过消除一个又一个错误的答案来解决。

首先,仔细看看'.Value' - 它不是你想象的那样:逻辑是评估范围的内容,考虑到任何格式,包括任何日期格式。

使用单元格的'.Value2'属性可能会做得更好:

SD = Cells(i, 1).Value2

关于'.Value2'的观点是,单元格中的基础数字数据会返回 - 而不是对格式化文本的评估 - 并且您回避日期序列号(或数字或包含除法'/'的表达式)的问题,或看起来像格式化日期的文本),Excel会自动在单元格中显示日期格式。

Excel经常会出错:你确定你知道“07/06/2016”的哪一天吗?如果您处理来自多个国家/地区的数据,我可以向您保证Excel不会。 (另外:价格为39,995英镑的豪华车可能与你2009年7月1日的侄子生日无关)。

其次,请尝试使用日期转换SD = Cells(i, 1).Value2

SD = CVDATE(Cells(i, 1).Value2

第三,拉出大锤:选择接收原始数据的范围,右键单击“格式化单元格...”,然后应用“文本”类别 - 然后重新导入原始数据。

您需要再次进行导入:谁知道自动格式化对您的数据做了什么?

你现在可以看到里面有什么:你有数值吗?像42383这样的数字代表日期;像42383.5987615741这样的数字代表日期和时间。直接将{em}直接导入SD = CVDATE(Cells(i, 1)并运行日期比较。您可能会收到类型转换错误 - 如果是这样,字符串需要转换为数字才能输入CvDate():

SD = CVDATE(CDbl(Cells(i, 1))

像我说的那样:一个又一个错误的答案。

如果原始数据是文本,请仔细查看它:它是否始终格式化?您可以直接将“01-Jan-2016”提供给CVDate(),但“2016年1月14日星期四”可能会更难:您需要相当复杂的字符串处理。但是你更有可能获得dd / mm / yyyy或mm / dd / yyyy以及另一个问题:

你能查看“06/07/2015”和“2015/06/06”中的内容吗?可能是六月,可能是七月......

...也许CVDate()对此有点太“乐于助人”。

因此'Davy Crocket Sledgehammer'将以文本格式接收您的数据,并指定应如何阅读:

Dim strDate As String
Dim strDay As String
Dim strMon As String
Dim strYear As String

strDate = Cells(i, 1).Text
strDay  = Mid(strDate, 1, 2)
strMon  = Mid(strDate, 4, 2)
strYear = Mid(strDate, 7, 4)

strDate = Cells(i, 1).Text strDay = Mid(strDate, 1, 2) strMon = Mid(strDate, 4, 2) strYear = Mid(strDate, 7, 4)

...并将其输入DateSerial()以获取日期。

如果您的日期格式不一致,那么您的问题会更加困难:您需要进行一些错误检查以验证任何给定的单元格是否可以作为日期读取,以及函数可能不如你所希望的那样可靠。但是,有一种方法可以处理“24/8/2015”和“2015年1月9日”和“14/10/15”等字符串:使用IsDate()函数。但是,我会把它留给你。

另外:你能告诉Excel开发人员处理可怕的数据吗?