Vba 使用带有循环和If语句的DateSerial函数 我试图编写一个代码,它将隐藏所有过去的日期和一年的数据库中的空白行。下面代码的问题是,代码看到了要解决的数学问题的日期,即?由于除名,2016年1月1日
按原样编码:Vba 使用带有循环和If语句的DateSerial函数 我试图编写一个代码,它将隐藏所有过去的日期和一年的数据库中的空白行。下面代码的问题是,代码看到了要解决的数学问题的日期,即?由于除名,2016年1月1日,vba,excel,Vba,Excel,按原样编码: 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 =
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
子隐藏日期()
今年将变暗作为范围
将CD变暗为日期
Dim SD作为日期
Application.ScreenUpdating=False
Application.Calculation=xlCalculationManual
设置该年=范围(“A5:A3000”)
This_Year.EntireRow.Hidden=False
i=5
'CD=格式(日期,“dddd,mmmm dd,yyyy”)
CD=日期
直到单元格(i,1)=CD
SD=单元格(i,1)。数值
调试.打印i
调试.打印SD
调试。打印CD
如果SD
使用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
'Starts rows down
i = 5
'Current date
'CD = Format(Date, "dddd, mmmm dd,yyyy")
CD = DateSerial(Today.Year, Today.Month, Today.Day)
Do Until Cells(i, 1) = CD
'SD = Selected Date in the loop
SD = Cells(i, 1).Value 'Not sure how to DateSerial this!!!!
Debug.Print i
Debug.Print SD
Debug.Print CD
'Hides past days
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
子隐藏日期()
今年将变暗作为范围
将CD变暗为日期
Dim SD作为日期
Application.ScreenUpdating=False
Application.Calculation=xlCalculationManual
设置该年=范围(“A5:A3000”)
This_Year.EntireRow.Hidden=False
'开始排下来
i=5
“当前日期
'CD=格式(日期,“dddd,mmmm dd,yyyy”)
CD=日期序列(今天.年,今天.月,今天.日)
直到单元格(i,1)=CD
'SD=循环中选定的日期
SD=单元格(i,1)。值“不确定如何对此进行日期序列化!!!!”!!!!
调试.打印i
调试.打印SD
调试。打印CD
“隐藏过去的日子
如果SD
您需要不止一次尝试:这是一个问题,您可以通过消除一个又一个错误答案来解决
首先,仔细查看“.Value”-它不是您认为的那样:逻辑是评估范围的内容,考虑任何格式,包括任何日期格式
使用单元格的“.Value2”属性可能会更好:
SD=单元格(i,1)。值2
“.Value2”的要点是,单元格中的基础数字数据返回-而不是对格式化文本的计算-您可以避开日期序列(或数字,或包含除法“/”的表达式,或类似格式化日期的文本)的问题,Excel会自动在单元格中以日期格式显示
Excel经常出错:你确定你知道“07/06/2016”是哪一天吗?如果您使用的数据来自多个国家,我可以向您保证Excel不会。(还有:那辆标价39995英镑的豪华车可能与你侄子2009年7月1日的生日无关)
其次,使用日期转换尝试SD=Cells(i,1).Value2
:
SD=CVDATE(单元格(i,1)。值2
第三,拔出大锤:选择接收原始数据的区域,右键单击“格式化单元格…”,然后应用“文本”类别,然后重新导入原始数据
您需要再次进行导入:谁知道自动格式化对您的数据做了什么
现在你可以看到里面的内容了:你有数值吗?像42383这样的数字代表日期;像42383.5987615741这样的数字代表日期和时间。把它们直接输入SD=CVDATE(单元格(i,1)
并运行日期比较。您可能会遇到类型转换错误-如果是,字符串需要转换为数字,然后才能输入CvDate()
SD=CVDATE(CDbl(单元格(i,1))
就像我说的:一个接一个的错误答案
如果原始数据是文本,请仔细查看:它的格式是否一致?您可以直接将“01-Jan-2016”输入到CVDate(),但“2016年1月14日星期四”可能更难:您需要相当复杂的字符串处理。但更可能的是,您会遇到dd/mm/yyyy或mm/dd/yyyy以及另一个问题:
你能查一下“06/07/2015”和“07/06/2015”中有什么吗?可能是六月,也可能是七月
…也许CVDate()在这方面太“有用”了
因此,“Davy Crocket Sledgehammer”将接收文本格式范围内的数据,并指定读取方式:
作为字符串的Dim strDate
作为字符串的Dim strDay
作为字符串的Dim strMon
像细绳一样暗淡的头发
strDate = Cells(i, 1).Text
strDay = Mid(strDate, 1, 2)
strMon = Mid(strDate, 4, 2)
strYear = Mid(strDate, 7, 4)
…并将其输入DateSerial()以获取您的日期
如果您的日期格式不一致,您的问题就更难了:您需要进行一些错误检查,以验证任何给定的单元格是否可以作为日期读取,并且IsDate()
函数可能不像您希望的那样可靠。但是,有一种方法可以处理“24/8/2015”、“1/9/2015”和“14/10/15”等字符串:使用VBA.Strings.Split()
函数。不过,我将把这个留给您
另外:你能告诉我Excel开发人员要处理可怕的数据吗?问题到底是什么——即发生了什么事?在A5:A30000列中,我有2016年1月1日至2016年12月31日的日期,我想隐藏过去的所有日期。问题是,当它在每一行循环查看今天的日期是否只是隐藏的随机日期。因为它看到了日期因此,作为数学问题,它不是比较天数,而是比较已解决的数学问题。有人告诉我使用dateserial函数,但我不知道如何在循环中使用它与I或if语句。这就是问题所在和正在发生的事情。如果键入
1/1/2016<1/14/2016
,则会得到false,因为它解决了1/14除以2016。“因为它把日期看作数学问题”。不,它不是把日期看作日期,就是把它们看作看起来像日期的文本。因为你的第一个代码使用了日期变量(SD
),而你