我正试着用Excel来找全年的工作日。我需要它来创建时间表。问题是我不知道如何将多维数组传递给函数。在这种情况下,2D数组。我会弹出“类型错配”。有人有什么想法吗?
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发布于 2015-09-05 13:50:57
发布的代码有两个问题:
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 FunctionPublic 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 FunctionPublic 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发布于 2015-09-05 13:53:39
另一种选择是使用变体类型:
Sub test2()
Dim x() As Variant
x = ActiveSheet.Range("A1:B3").Value
Call markWorkingDays(x)
End Sub
Function markWorkingDays(ByRef monthArray() As Variant)
Dim r As Integer
Dim c As Integer
For r = 1 To UBound(monthArray, 1)
For c = 1 To UBound(monthArray, 2)
MsgBox monthArray(r, c)
Next
Next
End Function发布于 2015-09-05 20:17:55
我不太确定我是否说得很清楚,但这句话的问题是:
workingDaysPerMonthArray = countWorkingDaysPerMonth(workingDaysArray())workingDaysArray()是返回2-D数组的函数,我想将它作为参数传递给函数countWorkingDaysPerMonth()。有个问题
https://stackoverflow.com/questions/32413539
复制相似问题