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
Excel vba错误,工作表和文本框上有日期_Vba_Excel_Date - Fatal编程技术网

Excel vba错误,工作表和文本框上有日期

Excel vba错误,工作表和文本框上有日期,vba,excel,date,Vba,Excel,Date,我住在澳大利亚,我们使用d/mm/yyyy日期格式。我试图用excel中的VBA制作一个用户表单,它将读取a单元格(A1),并将其显示在文本框中。然后,用户可以在另一个文本框中输入日期,并将该日期设置回单元格(A1)。我的问题是,当我从单元格(A1)读取日期时,文本框中的日期从d/mm/yyyy更改为m/dd/yyyy。我用过 “=格式(DateCurrent_Tbx.Value,“d/mmm/yy”)”但没有区别。我正在Windows 7 SP1 64位计算机上使用32位Excel 2010,

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

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


我绞尽脑汁在网上搜索了好几天都没有结果。我希望我已经解释得足够清楚。

对于看起来像日期和实际日期的字符串存在一些混淆,而以EN-US为中心的VBA默认MDY语言环境并没有起到任何缓解作用

首先,A1中的日期是介于0和42225之间的数字(2015年8月9日是42225);差不多没什么。无论计算机系统运行在何种语言环境下,您都可以将其装扮成d/mm/yyyy。Mine在EN-US下运行,如果我使用d/mm/yyyy的数字格式掩码,我可以将日期显示为2015年8月9日。要将A1中显示的日期作为字符串返回文本框,请使用。这是单元格中显示的文本。它是只读的,因此您不能将“9/08/2015”字符串塞回其中

Private Sub UserForm_Initialize()
    DateCurrent_Tbx.Value = ThisWorkbook.Sheets(1).Range("A1").TEXT
End Sub
就用户输入的“类似于日期的字符串”而言,您可能需要稍微信任您的用户才能做正确的事情。如果可以依靠它们以DMY格式输入,则可以使用


就这个问题而言,我会避免使用它。如果您将“2015年8月19日”填入CDate(在VBE的即时窗口中作为
?CDate(“2015年8月19日”)
尝试),它将正确解释为2015年8月19日,但这只是因为它没有其他选择!如果您对CDate(“2015年8月9日”)进行同样的尝试,您将得到2015年9月8日,因为只要有选择,CDate都会选择MDY的EN-US地区。最好不要依赖这个。我相信这至少是不可靠的。

同样,如果你想让你的用户选择一个日期,你应该考虑使用OR或(你可用的)而不是TeXbox。
Private Sub UserForm_Initialize()
    DateCurrent_Tbx.Value = ThisWorkbook.Sheets(1).Range("A1").TEXT
End Sub
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