Vba 使用Excel的DateAdd函数

Vba 使用Excel的DateAdd函数,vba,excel,Vba,Excel,我想使用excel DateAdd函数向包含波斯/希吉里日历日期的单元格中添加一些天。因此,我创建了一个按钮并为其指定了一个宏,如: Sub mydateaddfunction() Dim FirstDate As Date Dim Number As Integer FirstDate = Sheets(3).Range("e13").Value Number = Sheets(3).Range("b13").Value Sheets(3).

我想使用excel DateAdd函数向包含波斯/希吉里日历日期的单元格中添加一些天。因此,我创建了一个按钮并为其指定了一个宏,如:

Sub mydateaddfunction()
    Dim FirstDate As Date
    Dim Number As Integer
      FirstDate = Sheets(3).Range("e13").Value
      Number = Sheets(3).Range("b13").Value
      Sheets(3).Range("e14").Value = DateAdd("d", Number, FirstDate)
End Sub
但不幸的是,它抛出了一个错误

应用程序定义或对象定义错误

来自此行的错误:

Sheets(3).Range("e14").Value = DateAdd("d", Number, FirstDate)
e13单元格包含日期,b13包含我要添加到e13单元格的天数。因此,如果e13单元类似于:

1396/10/17

b13包含一个类似3的数字,我希望e14是:

1396/10/20


我做错了什么?

默认情况下,VBA使用公历。因此,我假设您需要将Hijri日期转换为公历日期,并在添加天数后将公历日期转换回Hijri日期

请试试这个

Sub mydateaddfunction()
    Dim FirstDate As Date
    Dim Number As Integer
    Dim gDate As Date
    FirstDate = HijriToGreg(Sheets(3).Range("e13").Value)
    Number = Sheets(3).Range("b13").Value
    gDate = DateAdd("d", Number, FirstDate)
    Sheets(3).Range("e14").Value = GregToHijri(gDate)
End Sub

Function GregToHijri(dtGegDate As Date) As String
    'Converts Gregorian date to a Hijri date
    VBA.Calendar = vbCalHijri
    GregToHijri = dtGegDate
    VBA.Calendar = vbCalGreg
End Function

Function HijriToGreg(dtHijDate As String) As Date
    'Converts Hijri date to a Gregorian date
    VBA.Calendar = vbCalHijri
    HijriToGreg = dtHijDate
    VBA.Calendar = vbCalGreg
End Function

如果是Excel 2016,请将代码更改为

Sub mydateaddfunction()
    Dim FirstDate As Date
    Dim Number As Integer

    Dim rg As Range
    Set rg = Union(Sheets(1).Range("E13"), Sheets(1).Range("E14"))
    rg.NumberFormat = "[$-fa-IR,16]dd/mm/yyyy;@"


      FirstDate = Sheets(1).Range("e13").Value
      Number = Sheets(1).Range("b13").Value
      Sheets(1).Range("e14").Value = DateAdd("d", Number, FirstDate)
End Sub

对于那些寻找简单解决方案的人,他们可以使用Excel现有的名为“Workday”的函数向数据中添加x个天数


WORKDAY(开始日期,天,[假日])

如果使用Office 365,这可能会有所帮助。很可能您已经有了这一功能,E13不是日期和/或B13不是数字。在这两种情况下,分别使用以下公式进行测试,
=值(E13)
。在这两种情况下,如果单元格包含字符串,则公式将返回#值错误。VBA中的等效函数是Val()函数,您可以将其包含在代码中。它返回0而不是错误。因此,
n=Sheets(3).Range(“e13”).Value
如果n那么FirstDate=CDate(n)
老实说,“不起作用”并没有真正的帮助。无论如何,如前所述,您需要Excel 2016,否则,您是对的,它将无法工作。