我有兩本工作簿VBA Weeknum函數返回錯誤的週數?
工作簿1 = L.O.線交付跟蹤
Column G Column M
05/01/2017 (Other Criteria)
09/01/2017 (Other Criteria)
01/01/2017 (Other Criteria)
簿2 =報告:
表2
B6 = (Other Criteria)
B9 = 2 D9 = 2017
表3
Column A Col B Col C etc.
如果在我的輸送跟蹤器的工作簿B列中的時間相匹配的在B9和D9的一年中(在報告工作簿上),然後我想複製我的日期(和其他相應的值)到報告工作簿,列a,b,c等
就我而言,一週應該在星期一開始,因此如果我輸入'2'到單元格B9 - 這應該複製日期之間星期一1月9日至15日。
我的vba週數函數是取我05/01/2017。這是錯誤的! 它應該只提取09/01/2017。
我想要的結果:
報告工作簿: 表3
Column A
09/01/2017
這事做在VBA我WEEKNUM函數,但我不知道我做錯了。請有人告訴我如何讓這個工作,我想要什麼?
繼承人我的代碼:
Option Explicit
Sub code2()
MsgBox "This will take upto 2 minutes."
Application.ScreenUpdating = False
Dim WB As Workbook
Dim i As Long
Dim j As Long
Dim Lastrow As Long
'On Error Resume Next
'Clear Data Sheet
'On Error GoTo Message
With ThisWorkbook.Worksheets("Data")
.Rows(2 & ":" & .Rows.Count).ClearContents
End With
Set WB = Workbooks("L.O. Lines Delivery Tracker.xlsm")
'On Error GoTo 0
If WB Is Nothing Then 'open workbook if not open
Set WB = Workbooks.Open("C:\Users\Mark O'Brien\Desktop\L.O. Lines Delivery Tracker.xlsm")
End If
' ======= Edit #2 , also for DEBUG ======
With WB.Worksheets(1)
Lastrow = .Cells(.Rows.Count, "G").End(xlUp).Row
j = 2
For i = 7 To Lastrow
' === For DEBUG ONLY ===
Debug.Print CInt(ThisWorkbook.Worksheets(2).Range("B9").value)
Debug.Print WeekNum(.Range("G" & i).value)
Debug.Print CInt(ThisWorkbook.Worksheets(2).Range("D9").value)
Debug.Print Year(.Range("G" & i).value)
Debug.Print ThisWorkbook.Worksheets(2).Range("B6").value
Debug.Print .Range("M" & i).value
If CInt(ThisWorkbook.Worksheets(2).Range("B9").value) = WeekNum(.Range("G" & i).value) Then ' check if Month equals the value in "A1"
If CInt(ThisWorkbook.Worksheets(2).Range("D9").value) = Year(.Range("G" & i).value) Then ' check if Year equals the value in "A2"
If ThisWorkbook.Worksheets(2).Range("B6").value = .Range("M" & i).value Then
ThisWorkbook.Worksheets(3).Range("A" & j).value = .Range("G" & i).value
ThisWorkbook.Worksheets(3).Range("B" & j).Formula = "=WeekNum(A" & j & ",21)"
ThisWorkbook.Worksheets(3).Range("C" & j).value = .Range("L" & i).value
ThisWorkbook.Worksheets(3).Range("D" & j).value = .Range("D" & i).value
ThisWorkbook.Worksheets(3).Range("E" & j).value = .Range("E" & i).value
ThisWorkbook.Worksheets(3).Range("F" & j).value = .Range("F" & i).value
ThisWorkbook.Worksheets(3).Range("g" & j).value = .Range("p" & i).value
ThisWorkbook.Worksheets(3).Range("H" & j).value = .Range("H" & i).value
ThisWorkbook.Worksheets(3).Range("I" & j).value = .Range("I" & i).value
ThisWorkbook.Worksheets(3).Range("J" & j).value = .Range("J" & i).value
ThisWorkbook.Worksheets(3).Range("k" & j).value = .Range("Q" & i).value
ThisWorkbook.Worksheets(3).Range("L" & j).value = .Range("m" & i).value
j = j + 1
End If
End If
End If
Next i
End With
'ThisWorkbook.Worksheets("Data").UsedRange.Columns("B:B").Calculate
'ThisWorkbook.Worksheets(2).UsedRange.Columns("B:AA").Calculate
'On Error GoTo Message
'With ThisWorkbook.Worksheets(2) '<--| change "mysheet" to your actual sheet name
'Intersect(.Range(Rows(14), .UsedRange.Rows(.UsedRange.Rows.Count)), .Range("G:G")).WrapText = True
'Intersect(.Range(Rows(14), .UsedRange.Rows(.UsedRange.Rows.Count)), .Range("G:G")).EntireRow.AutoFit
'End With
'End
Application.ScreenUpdating = True
Exit Sub
Message:
On Error Resume Next
Exit Sub
End Sub
Function WeekNum(D As Date) As Integer
WeekNum = CInt(Format(D, "ww", 2))
End Function
如果你能把所有的代碼燒到幾行來說明實際問題 - 真的只需要幾行來調用你的WeekNum函數,而其餘部分不相關 –
@TimWilliams apologies I只是試圖建立上下文。這只是底部代碼的最後一點 - weeknum函數導致我認爲的問題。 – user7415328
您的WeekNum函數輸出與工作表WEEKNUM函數完全匹配,而順便說一句,您可能不應該對UDF使用相同的名稱......我敢打賭,您的函數正在被內置的函數覆蓋。我只是使用內置的WEEKNUM函數(並提供第二個參數,它決定了哪一天是第一天) –