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 Userform中的欧洲日期格式_Excel_Vba_Date_Userform - Fatal编程技术网

Excel Userform中的欧洲日期格式

Excel Userform中的欧洲日期格式,excel,vba,date,userform,Excel,Vba,Date,Userform,我有一个用户表单,它用工作表中的日期填充文本框。这样做的目的是能够编辑日期并将其保存回工作表。问题是日期是以美国格式显示的,而不是欧洲格式。我知道我需要使用代码强制日期显示为欧洲。所以我试着使用这个代码 Dim LValue As String LValue = Format(Date, "dd/mm/YYYY") 然后,我有一个函数来填充表单,我希望在其中显示正确的日期格式 Sub PopulateForm() Me.Location.Value

我有一个用户表单,它用工作表中的日期填充文本框。这样做的目的是能够编辑日期并将其保存回工作表。问题是日期是以美国格式显示的,而不是欧洲格式。我知道我需要使用代码强制日期显示为欧洲。所以我试着使用这个代码

Dim LValue As String

LValue = Format(Date, "dd/mm/YYYY")
然后,我有一个函数来填充表单,我希望在其中显示正确的日期格式

Sub PopulateForm()
            Me.Location.Value = rngFound(1, 0).Value
            Me.ID.Value = rngFound(1, 1).Value
            Me.FirstName.Value = rngFound(1, 2).Value
            Me.LastName.Value = rngFound(1, 3).Value
            Me.Grade = rngFound(1, 4).Value
            Me.ARLFam = rngFound(1, 8).Value
            Me.ARLEvac = rngFound(1, 11).Value
            Me.HRDFam = rngFound(1, 16).Value
            Me.HRDEvac = rngFound(1, 19).Value
            Me.CRDFam = rngFound(1, 24).Value
            Me.CRDEvac = rngFound(1, 27).Value
            Me.RSQFam = rngFound(1, 32).Value
            Me.RSQEvac = rngFound(1, 35).Value
            Me.COVFam = rngFound(1, 40).Value
            Me.COVEvac = rngFound(1, 43).Value
            Me.LSQFam = rngFound(1, 48).Value
            Me.LSQEvac = rngFound(1, 51).Value
            Me.HPCFam = rngFound(1, 56).Value
            Me.HPCTrackFam = rngFound(1, 63).Value
            Me.HPCEvac = rngFound(1, 59).Value
            Me.KNBFam = rngFound(1, 67).Value
            Me.KNBEvac = rngFound(1, 70).Value
            
End Sub
我还没有找到在子程序中放置LValue的位置,以便将日期更改为正确的格式。我走对了吗?还是我找错树了

接下来,当我更改日期并将更改保存到工作表时,我遇到了一个新问题。日期进入的单元格设置为日期,其他单元格的公式利用日期单元格提供的信息。当我从Userform中保存日期时,它们会显示在正确的单元格中,但是从日期单元格中读取的所有其他单元格现在都显示了#值错误。这是用于将新日期保存到工作表的代码

Private Sub EnterButton_Click()
Dim LR As Long
Dim replace As Long
Dim response As Long
Dim LValue As String

LValue = Format(Date, "dd/mm/YYYY")
If Me.ID.Value = "" Then
    MsgBox "You have not entered an ID."
    Me.ID.SetFocus
    Exit Sub
End If

FindRecord (Val(Me.ID))
    If Not rngFound Is Nothing Then
       replace = MsgBox("This record already exists in this Database." & vbNewLine _
       & "Replace?", vbYesNo)
       If replace = vbYes Then
            LR = rngFound.Row
       Else
            ClearForm
            Me.ID.SetFocus
            Exit Sub
        End If
    Else
        LR = ws.Cells(Rows.Count, "A").End(xlUp).Row + 1
    End If
            
    With ws
          .Cells(LR, 1).Value = Me.Location
          .Cells(LR, 2).Value = Val(Me.ID)
          .Cells(LR, 3).Value = Me.FirstName
          .Cells(LR, 4).Value = Me.LastName
          .Cells(LR, 5).Value = Me.Grade
          .Cells(LR, 9).Value = Me.ARLFam
          .Cells(LR, 12).Value = Me.ARLEvac
          .Cells(LR, 17).Value = Me.HRDFam
          .Cells(LR, 20).Value = Me.HRDEvac
          .Cells(LR, 25).Value = Me.CRDFam
          .Cells(LR, 28).Value = Me.CRDEvac
          .Cells(LR, 33).Value = Me.RSQFam
          .Cells(LR, 36).Value = Me.RSQEvac
          .Cells(LR, 41).Value = Me.COVFam
          .Cells(LR, 44).Value = Me.COVEvac
          .Cells(LR, 49).Value = Me.LSQFam
          .Cells(LR, 52).Value = Me.LSQEvac
          .Cells(LR, 57).Value = Me.HPCFam
          .Cells(LR, 64).Value = Me.HPCTrackFam
          .Cells(LR, 60).Value = Me.HPCEvac
          .Cells(LR, 68).Value = Me.KNBFam
          .Cells(LR, 71).Value = Me.KNBEvac
    End With
    
            If replace = vbYes Then
                MsgBox "The existing record on " & ws.Name & " row# " & rngFound.Row & " was overwitten"
            Else
                MsgBox "The record was written to " & ws.Name & " row# " & LR
            End If
            
          response = MsgBox("Do you want to enter another record?", _
              vbYesNo)

          If response = vbYes Then
              ClearForm
              Me.ID.SetFocus
          Else
              Unload Me
          End If
End Sub

是否因为日期已保存为文本而不是日期?如果是这样,如何将其保存为欧洲日期?

您当然可以将当前forat更改为欧洲日期,下面是一些如何使用它的示例:

附属日期

端接头


我没有第二部分的答案,但我希望这也能有所帮助。以下假设您在Excel中有真实的日期(例如,您可以通过将包含日期的单元格格式化为
General
:它应该显示一个数字来证明这一点)

背景:日期在内部存储为数字,即整数部分 给出日期部分,从1开始计算天数。 1900年1月。分数部分表示时间,1/3表示 上午8点(一天的三分之一)

VBA中的文本框始终包含字符串。如果要将日期写入文本框并使用类似于
tbStartDate=ActiveSheet.Cells(“B2”)
B2
的代码包含日期,则需要VBA将日期转换为字符串。VBA会这样做,但它有自己的规则,所以你会得到一个看起来像美国日期的字符串。基本上,您应该始终避免VBA为您执行自动转换。相反,使用函数:
Format
it是将日期或数字转换为字符串的正确函数,您已经在前两条语句中正确使用了它。要将日期写入文本框,您现在可以编写

tbStartDate = Format(ActiveSheet.Cells("B2"), "dd/mm/YYYY")

现在是棘手的部分:用户可能会更改日期,而您希望将其写回单元格。同样,您不应该让Excel隐式地进行转换。问题是,使用普通文本框,您无法阻止用户输入垃圾内容(您可能会阅读)

但假设用户以“正确”的形式输入日期:如何将字符串转换为日期

您经常会看到使用
CDate
将字符串转换为日期的答案,这与系统的区域设置有关。很好,只要所有用户都有相同的设置。但是,如果您的用户携带的笔记本电脑是刚从美国进口的或来自世界其他任何地方,那么您又会遇到同样的问题:VBA将使用错误的假设转换日期(例如更改日期和月份部分)

因此,我通常使用一个小的自定义函数来拆分字符串,并将部分用作另一个VBA函数的参数
DateSerial
。如果输入完全无意义,它将返回0(=1.1.1900),但不会检查所有无效可能性。13作为输入被愉快地接受(
DateSerial
,顺便说一句,也接受这个)


日期是数字,因此如果将其另存为文本,则可以解释公式中的错误。另外,将单元格格式化为
dd/mm/yyyy
应该会有所帮助,而不是在变量中进行。@Foxfire And Burns And Burns感谢您的快速回复。单元格的格式为日期。我不确定的是,从用户表单传输到单元格的是什么,是文本、数字还是日期?如何使用VBA将其作为日期传输到单元格中?将单元格格式化为日期并不能使其成为日期。@FunThomas-现在我担心我完全错过了一些内容。我右键单击了单元格,选择了格式单元格,然后选择了数字选项卡。选择日期并从右边的框中选择我想要的样式。这就是你所指的吗?或者它是不同的?如果您将“Hello World”写入格式为date的单元格,则单元格的内容是字符串,而不是日期。如果将“ABC”写入单元格,然后将该单元格格式化为日期,则它仍然是一个字符串。格式化告诉Excel如何显示数据。如果您将日期写入单元格并将其格式设置为“常规”,它将以数字形式显示日期(因为日期实际上是数字),假设单元格包含日期,则不应向其写入字符串。@FunThomas What should
LValue
bet set as,如果没有设置为字符串,它就可以作为日期使用?@Ian Martin:当你将数据写入文本框时,你就可以编写一个字符串,这很好。我是在评论这个答案,这个答案是将字符串写入Excelcells@A.Amel-谢谢你的密码。我不知道如何将其中一个添加到我已经设置的代码中。如您所见,日期列专门放在工作表中,我需要能够使用欧洲格式的日期(“dd/mm/YYYY”)填充用户表单,然后编辑后,将其替换到工作表上的正确单元格中(“数据输入”),ws.Columns设置为rngFound=.Find(What:=ID,After:=.Cells(1),LookIn:=xlValues,Lookat:=xlother,SearchDirection:=xlNext)
tbStartDate = Format(ActiveSheet.Cells("B2"), "dd/mm/YYYY")
Function StrToDate(s As String) As Date
    ' Assumes input as dd/mm/yyyy or dd.mm.yyyy
    Dim dateParts() As String
    dateParts = Split(Replace(s, ".", "/"), "/")    ' Will work with "." and "/"
    If UBound(dateParts) <> 2 Then Exit Function
    
    Dim yyyy As Long, mm As Long, dd As Long
    dd = Val(dateParts(0))
    mm = Val(dateParts(1))
    yyyy = Val(dateParts(2))
    If dd = 0 Or mm = 0 Or yyyy = 0 Then Exit Function
    
    StrToDate = DateSerial(yyyy, mm, dd)
End Function
dim d as Date
d = StrToDate(tbStartdate)
if d > 0 then ActiveSheet.cells(B2) = d