Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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 使用带有循环和If语句的DateSerial函数 我试图编写一个代码,它将隐藏所有过去的日期和一年的数据库中的空白行。下面代码的问题是,代码看到了要解决的数学问题的日期,即?由于除名,2016年1月1日_Vba_Excel - Fatal编程技术网

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
),而你