Excel vba错误,包含工作表和文本框上的日期

时间:2015-08-09 10:56:24

标签: excel vba excel-vba date

我住在澳大利亚,我们使用d / mm / yyyy日期格式。我试图在excel中使用VBA创建一个用户表单,它将读取一个单元格(A1),将其显示在文本框中。然后,用户可以在另一个文本框中输入日期,并将该日期设置回单元格(A1)。我遇到的问题是,当我从Cell(A1)读取日期时,文本框中的d / mm / yyyy变为m / dd / yyyy。我用过了 " =格式(DateCurrent_Tbx.Value," d / mmm / yy")"但它没有任何区别。我在Windows 7 SP1 64位计算机上使用Excel 2010 32位,并将计算机设置为英语(澳大利亚)时间格式。单元格(A1)设置为自定义格式" d / mm / yyyy"

由于我使用的文件的VBA代码非常长,我在较小的用户表单(附加的excel文件)中复制了错误。

Sample of Excel file with Error

Private Sub LockInput_Cmd_Click()
SetDate_Cmd.Caption = InputDate_Tbx.Value
SetDate_Cmd.Caption = Format(SetDate_Cmd.Caption, "d/mmm/yy")
End Sub

Private Sub SetDate_Cmd_Click()
ThisWorkbook.Sheets(1).Range("A1").Value = SetDate_Cmd.Caption
DateCurrent_Tbx.Value = ThisWorkbook.Sheets(1).Range("A1").Value
DateCurrent_Tbx.Value = Format(DateCurrent_Tbx.Value, "d/mmm/yy")

End Sub

Private Sub UserForm_Initialize()
DateCurrent_Tbx.Value = ThisWorkbook.Sheets(1).Range("A1").Value
DateCurrent_Tbx.Value = Format(DateCurrent_Tbx.Value, "d/mmm/yy")
End Sub

我一直绞尽脑汁,在网上搜索几天无济于事。我希望我已经清楚地解释了一些事情。

1 个答案:

答案 0 :(得分:1)

对于看起来像日期和实际日期的字符串存在一些混淆,以EN-US为中心的VBA默认MDY语言环境无法缓解这种情况。

首先,A1中的日期是0到42,225之间的数字(2015年8月9日是42,225);没有更多或更少。无论您的计算机系统在哪个地方运行,您都可以将其打扮成d / mm / yyyy。我在EN-US下运行,如果我使用d / mm / yyyy的数字格式掩码,我可以毫不费力地显示日期为2015年8月9日。要将显示的日期从A1返回到文本框AS A STRING,请使用Range.Text property。这是单元格中显示的文本。它是只读的,因此您无法将“9/08/2015”字符串填入其中。

Private Sub UserForm_Initialize()
    DateCurrent_Tbx.Value = ThisWorkbook.Sheets(1).Range("A1").TEXT
End Sub

就用户输入'字符串看起来像日期'而言,您可能需要相信您的用户一些事情才能做正确的事情。如果可以依赖它们以DMY格式输入,您可以使用DateSerial function拆分碎片并将它们正确放在一起。

Private Sub LockInput_Cmd_Click()
    dim dt as date, vDT as variant
    vDT = split(InputDate_Tbx.Value, chr(47))  'split the string-date on the forward slash
    dt = DateSerial(vDT(2), vDT(1), vDT(0))   'create a real date
    SetDate_Cmd.Caption = Format(dt, "d/mmm/yy")   'use any format mask you want to create another string-date
End Sub

Private Sub SetDate_Cmd_Click()
    dim dt as date, vDT as variant
    vDT = split(SetDate_Cmd.Caption, chr(47))  'split the string-date on the forward slash
    dt = DateSerial(vDT(2), vDT(1), vDT(0))   'create a real date
    ThisWorkbook.Sheets(1).Range("A1").Value = dt  'put the actual date back into A1
End Sub

CDate function而言,我会避免使用它。如果你把“19/08/2015”填入CDate(在VBE的立即窗口中试用?CDate("19/08/2015")),它将正确地解释为2015年8月19日,但这只是因为它没有其他选择!如果您对?CDate("9/08/2015")尝试相同的操作,则最终会在2015年9月8日结束,因为只要有选择,CDate就会选择EN-US MDY区域设置。最好不要依赖这个。我相信DateValue function至少是不可靠的。