2017-02-02 41 views
0

我有兩本工作簿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 
+1

如果你能把所有的代碼燒到幾行來說明實際問題 - 真的只需要幾行來調用你的WeekNum函數,而其餘部分不相關 –

+0

@TimWilliams apologies I只是試圖建立上下文。這只是底部代碼的最後一點 - weeknum函數導致我認爲的問題。 – user7415328

+1

您的WeekNum函數輸出與工作表WEEKNUM函數完全匹配,而順便說一句,您可能不應該對UDF使用相同的名稱......我敢打賭,您的函數正在被內置的函數覆蓋。我只是使用內置的WEEKNUM函數(並提供第二個參數,它決定了哪一天是第一天) –

回答

0

我設法通過使用下面的代碼來解決這個問題:

Dim WeekNum As Integer 
WeekNum = CInt(Format(.Range("F9").Value, "ww", 2) - 1) 

因此,舉例來說,如果電池F9包含:

09/01/2017 

然後excel將其轉換爲第3周。但是,使用上面的代碼並加上-1可以讓我獲得第2周。

不知道這是多麼妥當,但我測試了幾個日期範圍,它似乎工作正常。

+0

在你原來的代碼中,你使用了'WEEKNUM(,21)' - 這個(21作爲第二個參數與2)使用不同的機制來確定以數週計算:https://support.office.com/zh-cn/article/WEEKNUM-function-e5c43a03-b4ab-426c-b411-b18c13c75340?ui=en-US&rs=zh-CN&ad=US –

+0

@TimWilliams對不起不是我的問題所涉及的代碼的一部分。 WEEKNUM(,21)是一個公式。我的問題標題提到了weeknum函數,意思是代碼 – user7415328

+0

底部的函數部分,我意識到這一點 - 只是指出你可能在這兩種不同的計算中得到了不同的結果(VBA vs Formula) –