gpt4 book ai didi

vba - Excel vba 错误与工作表和文本框上的日期

转载 作者:行者123 更新时间:2023-12-04 20:41:36 30 4
gpt4 key购买 nike

我住在澳大利亚,我们使用 d/mm/yyyy 日期格式。我正在尝试在excel中使用VBA制作一个用户表单,它将读取一个单元格(A1),将其显示在一个文本框中。然后用户可以在另一个文本框中输入日期并将该日期设置回单元格(A1)。我遇到的问题是,当我从 Cell(A1) 读取日期时,文本框中的日期从 d/mm/yyyy 更改为 m/dd/yyyy。我用过
"= Format(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

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

最佳答案

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

首先,A1 中的日期是 0 到 42,225 之间的数字(2015 年 8 月 9 日是 42,225);没有更多或更少。无论您的计算机系统在什么语言环境下运行,您都可以将其修饰为 d/mm/yyyy。我的在 EN-US 下运行,如果我使用 d/mm/yyyy 的数字格式掩码,我可以轻松地将日期显示为 9/08/2015。要将 A1 中显示的日期作为字符串返回到文本框,请使用 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 就会选择 MDY 的 EN-US 语言环境。最好不要依赖这个。我相信 DateValue function至少同样不可靠。

关于vba - Excel vba 错误与工作表和文本框上的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31903449/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com