2017-02-02 8 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의 날짜가 일치하면 D9 (보고서 통합 문서)에서 B9와 연도의 주 번호를 입력 한 다음 내 날짜 (및 기타 해당하는 값)을 보고서 통합 문서, 열 a, b, c 등으로 바꿉니다.

관련하여 월요일은 월요일부터 시작해야하므로 B9 셀에 '2'를 입력하면 월요일부터 9 일 - 1 월 15 일

내 VBA 주 num 함수가 나를 (를) 가져 오는 중입니다. 05/01/2017. 이것은 잘못된 것입니다! 2011 년 9 월 1 일에만 가져 오는 것이 좋습니다.

내 원하는 결과 :

보고서 통합 문서 : 시트 3

Column A 
09/01/2017 

이 VBA를 내 WEEKNUM 함수를 함께 할 수있는 뭔가가하지만 난 내가 잘못 뭘하는지 모르겠어요. 누군가 내가 이걸 어떻게하면 좋을지 보여줄 수 있습니까? Heres는

내 코드 :

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 사과 단지 컨텍스트를 구축하려고했습니다. 그것은 바닥에있는 코드의 마지막 비트 일뿐입니다. 제가 생각하기에 문제가되는 주간 함수입니다. – user7415328

+1

WeekNum 함수 출력이 워크 시트 WEEKNUM 함수와 정확하게 일치하고 BTW에서 UDF에 대해 동일한 이름을 사용해서는 안됩니다 ... 내장 함수에 의해 함수가 오버 라이딩 된 것 같습니다. 난 그냥 내장 된 WEEKNUM 함수를 사용하고 (첫날로 간주되는 요일을 결정하는 두 번째 매개 변수를 제공한다.) –

답변

0

나는 다음과 같은 코드를 사용하여이 문제를 해결하기 위해 관리 :

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

그래서 세포 F9가 포함 된 경우, 예를 들면 : 다음

09/01/2017 

위의 코드를 사용하고 -1을 추가하면 주 2를 얻을 수 있습니다.

이것이 얼마나 적절한 지 잘 모르지만 여러 기간에 대해 올바르게 테스트 한 결과 제대로 작동하는 것 같습니다.

+0

원본 코드에서 'WEEKNUM (, 21)'을 사용했습니다. - 두 번째 매개 변수는 21이고 두 번째 매개 변수는 21입니다. 주를 계산하는 방법 : https://support.office.com/en-us/article/WEEKNUM-function-e5c43a03-b4ab-426c-b411-b18c13c75340?ui=en-US&rs=en-US&ad=US –

+0

@TimWilliams 죄송합니다. 내 질문에 관한 코드의 일부가 아닙니다. WEEKNUM (, 21)은 수식입니다. 내 질문 제목 weeknum 함수를 묻습니다 코드 하단에있는 함수 섹션을 의미 – user7415328

+0

나는 그 두 가지 다른 계산 (VBA vs 수식)을 통해 다른 결과를 얻었을 수도 있습니다. –