gpt4 book ai didi

vba - 从函数 Excel VBA 返回多维数组

转载 作者:行者123 更新时间:2023-12-04 21:03:00 24 4
gpt4 key购买 nike

我正在尝试使用 Excel 查找全年的工作日。我需要它来创建时间表。问题是我不知道如何将多维数组传递给函数。在这种情况下,二维数组。我弹出“类型不匹配”。有人有什么想法吗?

Function markWorkingDays(ByRef monthArray() As Integer)
Dim mainArray(1 To 12, 1 To 31) As Integer

For i = 1 To 12 'set all days as no-working (0 - False)
For j = 1 To 31
mainArray(i, j) = 0
Next j
Next i

For i = 1 To 12 'set first and last day of the month
firstDay = DateSerial(Year(Date), i, 1)

If i = 2 And Year(Date) And 400 = 0 Then 'if leap-year
lastDay = DateSerial(Year(Date), 0, monthArray(i))
Else
lastDay = DateSerial(Year(Date), i, monthArray(i))
End If

For j = 1 To 31 'set workings days as True (1)
If Weekday(firstDay) = 7 Or Weekday(firstDay) = 1 Then 'skip Saturday and Sunday to Monday
firstDay = firstDay + 1
Else
mainArray(i, j) = 1
firstDay = firstDay + 1
End If

If firstDay = lastDay Then
Exit For
End If
Next j
Next i

markWorkingDays = mainArray()

End Function


Function countWorkingDaysPerMonth(ByRef workingDaysArray() As Integer) '(ByRef workingDaysArray() As Integer)
Dim mainArray(1 To 12) As Integer
Dim counter As Integer
counter = 0

For i = 1 To 12
For j = 1 To 31
If workingDaysArray(i, j) = 1 Then
counter = counter + 1
End If
Next j
mainArray(i) = counter
counter = 0
Next i

End Function


Sub main()
Dim monthArray(0 To 12) As Integer
monthArray(0) = 29
monthArray(1) = 31
monthArray(2) = 28
monthArray(3) = 31
monthArray(4) = 30
monthArray(5) = 31
monthArray(6) = 30
monthArray(7) = 31
monthArray(8) = 31
monthArray(9) = 30
monthArray(10) = 31
monthArray(11) = 30
monthArray(12) = 31

Dim workingDaysArray() As Integer
workingDaysArray = markWorkingDays(monthArray())

Dim workingDaysPerMonthArray() As Integer
workingDaysPerMonthArray = countWorkingDaysPerMonth(workingDaysArray())

'display number of workings days in every month
For i = 1 To 12
std = workingDaysPerMonthArray(i) & " "
Next i

MsgBox std

MsgBox Total


End Sub

最佳答案

您发布的代码有两个问题:

  • Function markWorkingDays(ByRef monthArray() As Integer) As Integer()
  • 功能 countWorkingDaysPerMonth()没有返回任何东西

  • Option Explicit

    Public Function markWorkingDays(ByRef monthArray() As Integer) As Integer()
    Dim mainArray(1 To 12, 1 To 31) As Integer, i As Integer, j As Integer
    Dim firstDay As Variant, lastDay As Variant

    For i = 1 To 12 'set all days as no-working (0 - False)
    For j = 1 To 31
    mainArray(i, j) = 0
    Next j
    Next i

    For i = 1 To 12 'set first and last day of the month
    firstDay = DateSerial(Year(Date), i, 1)

    If i = 2 And Year(Date) And 400 = 0 Then 'if leap-year
    lastDay = DateSerial(Year(Date), 0, monthArray(i))
    Else
    lastDay = DateSerial(Year(Date), i, monthArray(i))
    End If

    For j = 1 To 31 'set workings days as True (1)
    If Weekday(firstDay) = 7 Or Weekday(firstDay) = 1 Then 'skip Sat, Sun, Mon
    firstDay = firstDay + 1
    Else
    mainArray(i, j) = 1
    firstDay = firstDay + 1
    End If

    If firstDay = lastDay Then
    Exit For
    End If
    Next j
    Next i
    markWorkingDays = mainArray
    End Function
    Public Function countWorkingDaysPerMonth(ByRef workingDaysArray() As Integer) As Integer()
    Dim mainArray(1 To 12) As Integer, i As Integer, j As Integer
    Dim counter As Integer
    counter = 0

    For i = 1 To 12
    For j = 1 To 31
    If workingDaysArray(i, j) = 1 Then
    counter = counter + 1
    End If
    Next j
    mainArray(i) = counter
    counter = 0
    Next i
    countWorkingDaysPerMonth = mainArray
    End Function
    Public Sub main()
    Dim i As Integer, std As String
    Dim monthArray(0 To 12) As Integer
    monthArray(0) = 29
    monthArray(1) = 31
    monthArray(2) = 28
    monthArray(3) = 31
    monthArray(4) = 30
    monthArray(5) = 31
    monthArray(6) = 30
    monthArray(7) = 31
    monthArray(8) = 31
    monthArray(9) = 30
    monthArray(10) = 31
    monthArray(11) = 30
    monthArray(12) = 31

    Dim workingDaysArray() As Integer
    workingDaysArray = markWorkingDays(monthArray())

    Dim workingDaysPerMonthArray() As Integer
    workingDaysPerMonthArray = countWorkingDaysPerMonth(workingDaysArray())

    'display number of workings days in every month
    For i = 1 To 12
    std = std & workingDaysPerMonthArray(i) & " "
    Next i

    MsgBox std
    'MsgBox Total
    End Sub

    关于vba - 从函数 Excel VBA 返回多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32413539/

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