2017-12-01 1 views
0

Range.ValueRange.NumberFormat과 달라서 코드를 실행하는 동안 문제가 발생합니다. 예를 들어, 내 값은 날짜와 시간이며 요일을 테스트하고 싶습니다. 숫자 형식을 Sun-Sat으로 설정할 수 있었지만 CountIf으로 테스트하는 방법을 모르겠습니다.VBA - CountIf 셀 범위 표시 값이 원하는 값과 같습니다.

Dim rep   as Worksheet 
Dim day   As Range 
Dim time  As Range 
Dim wf   As WorksheetFunction 
Set rep = Worksheets("Report") 
Set day = rep.Range("H1", rep.Range("H1").End(xlDown)) 
Set time = rep.Range("I1", rep.Range("I1").End(xlDown)) 
Set wf = WorksheetFunction 

With rep 
    .Columns("H").NumberFormat = "dddd" 
    .Columns("I").NumberFormat = "AM/PM" 

    .Range("K1") = "Monday" 
    .Range("K2") = "Tuesday" 
    .Range("K3") = "Wednesday" 
    .Range("K4") = "Thursday" 
    .Range("K5") = "Friday" 
    .Range("K6") = "Saturday" 
    .Range("K7") = "Sunday" 

    .Range("M1") = "AM" 
    .Range("M2") = "PM" 

     .Range("L1") = wf.CountIf(day, "Monday") 
     .Range("L2") = wf.CountIf(day, "Tuesday") 
     .Range("L3") = wf.CountIf(day, "Wednesday") 
     .Range("L4") = wf.CountIf(day, "Thursday") 
     .Range("L5") = wf.CountIf(day, "Friday") 
     .Range("L6") = wf.CountIf(day, "Saturday") 
     .Range("L7") = wf.CountIf(day, "Sunday") 

    .Range("N1") = wf.CountIf(time, "AM") 
    .Range("N2") = wf.CountIf(time, "PM") 
End With 

이것은 내가 지금까지 가지고있는,하지만 그것은 단지 countif에 대한 해결책에 대해 0을 출력합니다. 미리 감사드립니다.

+0

countif가 하나의 셀이 아니라 다중 셀 범위를 원할 때 루프에 있으면 안됩니다. 'wf.CountIf (day, ...)' –

+0

@ScottCraner - 시도했지만 또한 작동하지 않았다, 위의 해결했습니다. –

+0

또한'.Columns ("H"). NumberFormat = "dddd"'는 데이터를 마스크로 변경하지 않으며 기본 값은 여전히 ​​date입니다. "dddd"와 같은 형식 인'42563 '과 같은 숫자이므로 결코 "월요일"이 될 수 없습니다. numberformat 뒤에 다음을 추가하십시오 :'.Columns ("H : I") .Value = .Columns ("H : I "). 텍스트' –

답변

2

숫자를 계산하는 다른 방법은 다음과 같습니다.

편집 :이 반복적으로 워크 시트를 액세스하는 것보다 훨씬 빠르다로 주 전 VBA 배열에서 "작업"의 대부분을 한 오전 또는 오후 시간으로 열 H에있는 항목의 수를 계산에 포함하려면

Option Explicit 

Sub foo() 
    Dim rep As Worksheet 
    Dim rDts As Range 
    Dim vDts As Variant 
    Dim vCnts As Variant 'for the weekday count 
    Dim vAP As Variant 'for the AM PM count 
    Dim I As Long, J As Long 

Set rep = Worksheets("sheet1") 
'read dates into array -- faster processing 
With rep 
    vDts = .Range(.Cells(1, 8), .Cells(.Rows.Count, 8).End(xlUp)) 
End With 

'Results array 
ReDim vCnts(1 To 7, 1 To 2) 
    vCnts(1, 1) = "Sunday" 
    vCnts(2, 1) = "Monday" 
    vCnts(3, 1) = "Tuesday" 
    vCnts(4, 1) = "Wednesday" 
    vCnts(5, 1) = "Thursday" 
    vCnts(6, 1) = "Friday" 
    vCnts(7, 1) = "Saturday" 

ReDim vAP(1 To 2, 1 To 2) 
    vAP(1, 1) = "AM" 
    vAP(2, 1) = "PM" 
'Do the counts 
    For I = 1 To UBound(vDts, 1) 
     J = Weekday(vDts(I, 1)) 
     vCnts(J, 2) = vCnts(J, 2) + 1 

     'Check for AM or PM 
     If Hour(vDts(I, 1)) < 12 Then 
      vAP(1, 2) = vAP(1, 2) + 1 
     Else 
      vAP(2, 2) = vAP(2, 2) + 1 
     End If 

    Next I 

'output the results 
rep.Range("K1:L7").Value = vCnts 
rep.Range("M1:N2").Value = vAP 

End Sub 
+0

게시 된 예제를 참조하십시오. "AM"/ "PM"에 대한 내용은 무엇입니까? –

+0

동일한 날짜/시간 항목에 VBA 'Hour' 함수를 사용하고 12 (= AM)보다 작은 지 테스트합니다. 그렇지 않으면 PM –

+0

일 것입니다. 모든 질문에 대해 유감스럽게 생각합니다.하지만 포함 된 이러한 방법을 사용한 적이 없지만 'For and If' 문에만 사용할 수 있습니까? 아니면 내가 한 일을해야합니까? –