2014-07-07 2 views
1

"GM"이라는 용어가 열에 나타나는 횟수를 계산하는 매크로를 작성하고 있습니다. 전에 countif 문을 사용하기로 결정했는데 잘 작동했습니다. 그러나, 어떤 이유로 내 코드를 실행할 때 매번 0을 출력하는데, 이는 정확하지 않습니다. 나는 다른 열과 문자열을 가진이 동일한 코드를 실행했으나 정상적으로 작동했지만 어떤 이유로이 "GM"열의 특정 열을 검색하면 실패합니다. 내가 생각할 수있는 유일한 것은 어쩌면 countif가 검색하는 문자열이 셀의 유일한 문자열 인 경우에만 작동합니다. 왜냐하면이 모든 경우에 코드가 정상적으로 작동하기 때문입니다. 이 특별한 경우에는 찾고있는 문자열이 셀의 유일한 문자열이 아니며 코드가 실패하고 있습니다. 이것이 사실인지 아닌지에 대한 자세한 정보를 찾으려고했지만 온라인에서 찾을 수있는 정보가 없습니다.VBA countif 문은 0 만 반환합니다

Function OemRequest() As Long 

Sheets("CS-CRM Raw Data").Select 
Sheets("CS-CRM Raw Data").Unprotect 

    Dim oem As Long 
    Dim LastRow As Long 
    Dim LastColumn As Long 

     'Determines size of table in document 
     LastRow = Range("A" & Rows.Count).End(xlUp).row 
     LastColumn = Cells(1, Columns.Count).End(xlToLeft).Column 

     oem = Application.WorksheetFunction.CountIf(Range(2 & "2:" & 2 & LastRow), "gm") 

OemRequest = oem 

End Function 
+0

나는 이전에 그 같은 문장을 사용 해왔다. 왜 지금은 작동을 멈출까요? – user3783788

답변

3

당신은 서면으로 COUNTIF은 전체 내용이 "GM"입니다 세포와 일치하는 것으로 올바른 : 여기 사람이보고 싶습니다 경우 코드가있다. COUNTIF 함수의 기준는 또한 "GM"가 들어있는 셀에 않습니다 일치하는 와일드 카드를 받아 들일 것입니다 :

.CountIf(Range(2 & "2:" & 2 & LastRow), "*gm*") 

업데이트

당신이 당신의 Range 전화에 문제도있다 언급 한 바와 같이. 즉, 괄호 안의 표현식은 "22:2<LastRow>" (<LastRow>LastRow 변수의 값임)으로 평가됩니다. .이 "B2:B<LastRow>"로 평가됩니다

Dim col as String 
col = "B" 
... Range(col & "2:" & col & LastRow) ... 

, 당신이 원하는 무엇인가 :

이의 2의 당신이 관심있는 열 이름을 포함하는 변수와 같은 뭔가해야한다.

+0

감사합니다. 더 잘 작동하는 것처럼 보였지만 카운트는 여전히 꺼져 있습니다. 이전 의견에 언급 된 사람은 내 범위 설명이 이상하게 보인다고 언급했지만 의견은 삭제되었습니다. 그것을 작성하는 더 좋은 방법이 있다면 어떤 아이디어? 열의 두 번째 행에서 열의 마지막 행까지 검색하려고합니다. – user3783788

+0

실제로 문제는 "GM"이 시트가 아닌 범위에서 참조되는 방식이라고 생각합니다. – user3783788

0

다른 가능성이 첫 번째 행에있는 하나를 제외하고, 테이블의 마지막 열에 "gm" (필요한 경우 사용 wilcards)를 함유하는 세포를 카운트한다

oem = WorksheetFunction.CountIf(Columns(LastColumn).Cells(2).Resize(rowsize:=LastRow - 1), "gm") 

.

Dim lngCol as Long 
lngCol = ... 
oem = WorksheetFunction.CountIf(Columns(lngCol).Cells(2).Resize(rowsize:=LastRow - 1), "gm") 
0

나는이 방법

Sub Main() 
    Application.ScreenUpdating = 0 
    Dim Count As Double 
    Range("C1").Activate 'Firs row in the column 
    Do While ActiveCell.Value <> "" 
     If InStr(ActiveCell.Value, "MyText") Then 
      Count = Count + 1 
     End If 
     ActiveCell.Offset(1, 0).Activate 
    Loop 
    Application.ScreenUpdating = 1 
End Sub 
생각 : 당신이 다른 열을 계산하려는 경우 변수를 만들 수 있습니다 물론

(이 테이블 왼쪽 상단 셀 "A1"에 가정) 워크 시트의 중간에 빈 공간이있는 경우

이것은, 데이터 셀이 비어 있지 않은 경우에만 작동합니다, 이렇게 :

Sub Main() 
    Application.ScreenUpdating = 0 
    Dim Count As Double 
    Range("C1").Activate 
    Do While ActiveCell.Row <> Rows.Count ' This wil evaluate all the rows in the 'C' Column 
     If InStr(ActiveCell.Value, "MyText") Then 
      Count = Count + 1 
     End If 
     ActiveCell.Offset(1, 0).Activate 
    Loop 
    Application.ScreenUpdating = 1 
End Sub 
,

희망은 당신을 위해 일합니다.