繁体   English   中英

在宏中使用 VBA 以法语显示计算日期

[英]Display Calculated Date in French using VBA in Macro

创建了一个宏来计算日期值,然后转换(用于显示在文档上)为法语:

Sub FrenchFutureDate()
           
    Selection.TypeText Text:=Format(CDate(ActiveDocument.MailMerge.DataSource.DataFields("RREG_Registr_File_GSFTDateReceived").Value) + 30, "d, mmmm, yyyy")
    Selection.LanguageID = wdFrench

End Sub

注意:原始/基线日期作为邮件合并值传递。

我们不想更改 function 以使用当前日期。 所以我将邮件合并字段引用交换为日期(见下文)。 问题是日期不再以法语仅以英语显示。 这就像语言代码被忽略了。

Sub FrenchFutureDate()          
    Selection.TypeText Text:=Format(Date + 30, "mmmm d, yyyy")
    Selection.LanguageID = wdFrench
End Sub

关于我做错了什么的任何想法或想法,为什么它不会转换并以法语显示等?

您可以使用与此类似的 function ,只需替换为法语月份名称并将 function 重命名为MonthNameFrench

' Returns the English month name for the passed month number.
' Accepted numbers are 1 to 12. Other values will raise an error.
' If Abbreviate is True, the returned name is abbreviated.
'
' 2015-11-25. Gustav Brock, Cactus Data ApS, CPH.
'
Public Function MonthNameInvariant( _
    ByVal Month As Long, _
    Optional ByVal Abbreviate As Boolean) _
    As String
    
    Const AbbreviatedLength As Integer = 3
    
    Dim MonthName( _
        MinMonthValue To _
        MaxMonthValue)      As String
    Dim Name                As String
    
    If Not IsMonth(Month) Then
        Err.Raise DtError.dtInvalidProcedureCallOrArgument
        Exit Function
    End If
    
    ' Non-localized (invariant) month names.
    MonthName(1) = "January"
    MonthName(2) = "February"
    MonthName(3) = "March"
    MonthName(4) = "April"
    MonthName(5) = "May"
    MonthName(6) = "June"
    MonthName(7) = "July"
    MonthName(8) = "August"
    MonthName(9) = "September"
    MonthName(10) = "October"
    MonthName(11) = "November"
    MonthName(12) = "December"
    
    If Abbreviate = True Then
        Name = Left(MonthName(Month), AbbreviatedLength)
    Else
        Name = MonthName(Month)
    End If
    
    MonthNameInvariant = Name

End Function

它取自我的项目VBA.Date 中的模块 DateText.bas DateText.bas

只要 Word 的日期字段格式支持您要使用的语言(在您的情况下为法语),您就可以这样做:

Sub InsertDatePlus30FR()
Dim f As Word.Field
Set f = Selection.Fields.Add(Selection.Range, WdFieldType.wdFieldQuote, """" & Format(Date + 30, "YYYY-MM-DD") & """ \@ ""MMMM, D, YYYY""", False)
f.Code.LanguageID = wdFrench
f.Update
' If you want to remove the field, uncomment the following line
' f.Unlink
Set f = Nothing
End Sub

(注意,当您在 Word 中以这种方式构造日期时,Word总是将“NNNN-NN-NN”格式解释为 YYYY-MM-DD,而不是 YYYY-DD-MM - 假设它是一个日期)。

由于您的问题也被标记为Excel您可以考虑使用以下 function 来获取法语月份名称:

Function mois()

  • a) 使用(一种缩写的括号方法)公式评估来获得所有法语月份名称的基于 1 的二维数组(请参阅格式前缀[$-80C] )和
  • b) 简单地返回由第一个参数indx指示的月份字符串,可以是全长的,也可以是符合系统选项的缩写(第二个参数abbrev )。
Option Explicit

Function mois(ByVal indx As Long, Optional ByVal abbrev = False) As String
'Meth: Excel evaluation based on column sequence
'Purp: return French month name
'0) escape clause for invalid indices
    If indx > 12 Or indx < 1 Then Mois = "?": Exit Function
'a) get 1-based 1-dim array of french months name
    Dim months
    If abbrev Then
        months = [Text(Date(0,Column(A:L),1),"[$-80C]mmm")]
    Else    ' full length
        months = [Text(Date(0,Column(A:L),1),"[$-80C]mmmm")]
    End If
'b) return function result
    mois = months(indx)
End Function

示例调用

    Debug.Print Mois(4)       ' ~~> avril
    Debug.Print Mois(4, True) ' ~~> avr.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM