2017-02-15 6 views
0

영숫자, 숫자 또는 영숫자 만 사용할 수있는 값을 비교하려고하는 문제가 있습니다.VBA보다 큰 기능이 작동하지 않습니다.

코드는 원래 동일한 100s 그룹 (영문 구성 요소와 IE 1-99) 내에서 비교할 때 정상적으로 작동했습니다. 그러나 100+를 포함 시키면 오작동을 일으 킵니다.

코드의 현재 부분을 읽

  For j = 1 To thislength 
       If lennew < j Then 
        enteredval = Left("100A", lennew) 
       ElseIf lennew >= j Then 
        enteredval = Left("100A", j) 
       End If 
       If lenold < j Then 
        cellval = Left("67", lenold) 
       ElseIf lenold >= j Then 
        cellval = Left("67", j) 
       End If 
       'issue occurs here 
       If enteredval >= cellval Then 
        newrow = newrow+1 
       End If 
      Next j 

문제는 지난 if 문에 발생합니다. 100을 순환하는 것이 67보다 크지 만 계속 건너 뜁니다. 나는 그것들이 도움이되는지 아닌지를보기 위해 (이 코드 부분 위에) 두 문자열을 모두 선언하려고 시도했지만 그렇지 않았다.

내가 수행하려고하는 것은 일련의 행을 정렬하고 이동해야하는 위치를 찾는 것입니다. IE 100A는 100 ~ 100B 사이에 있어야합니다.

죄송합니다. lennew=len("100A")lennold=len("67")입니다. 그리고 thislength=4 또는 두 길이 중 큰 것.

+0

숫자 부분을 숫자로 정렬하고 싶다면 그 숫자가 같은 경우 알파벳 순으로 정렬하고 맞습니까? –

+0

예. 그것을 할 수있는 더 좋은 방법이 없다면. 나는 기본적으로 그것이 나타나기를 원한다. 69, 69A, 69B, 70A, 99A, 100, 100A). (또는 숫자와 문자의 변형). 내가 겪고있는 문제는 첫 번째 비트가 69보다 커 보이지만 실제로는 코드가 실제로 커지면 코드가 인식하지 못한다는 것입니다. –

+1

숫자 비교를 사용하기 전에 숫자 부분을 숫자 형식으로 변환해야합니다. 문서의 [비교 연산자] (http://stackoverflow.com/documentation/vba/5813/operators/20479/comparison-operators#t=201702151525369696781)를 참조하십시오. – Comintern

답변

0

문제는 특정 값을 공격하여 비교 문제를 해결하려고 시도하는 것이므로 문제가 지속될 수 있습니다. 나는 첫 번째 피연산자가 두 번째 앞에 "0"을, 두 번째 피연산자가 같으면 0을 반환하고 첫 번째 피연산자가 두 번째 "후"이면 1을 반환하는 함수를 만들어서 문제를 좀 더 일반적인 것으로 만들 것입니다. 귀하의 규칙에 따라.

그런 다음 특정 하드 코딩 된 접두사 테스트를 제거하기 위해 코드를 재구성 한 다음 비교 함수를 직접 호출 할 수 있습니다. 예를 들어 (이 코드는 완전히 테스트되지 않은 채로, 비 커프스이며 VBA는 VERRRRRY stale입니다.)하지만 아이디어가 :

Function CompareCell(Cell1 as String, Cell2 as String) as Integer 

    Dim result as integer 
    Dim suffix1 as string 
    Dim suffix2 as string 

    if val(cell1)< val(cell2) Then 
     result = -1 
    else if val(cell1)>val(cell2) then 
     result = 1 
    else if val(cell1)=val(cell2) then 
     if len(cell1)=len(cell2) then 
      result =0 
     else 
     ' write code to strip leading numeric prefixes 
     ' You must supply StripPrefix, but it's pretty simple 
     ' I just omitted it here for clarity 
     suffix1=StripPrefix(cell1) ' eg returns "ABC" for "1000ABC" 
     suffix2=StripPrefix(cell2) 
     if suffix1 < suffix2 then 
      result = -1 
     else if suffix1 > suffix2 then 
      result = 1 
     else 
      result = 0 
     end if 
    end if 

    return result 

end function 

함수처럼 (그것은 또한 단지 비교적 쉽게 자신을 당신이 최대 회전 수 의심되는 선행 숫자를 문자열을 사용합니다 오프 스트립 StripPrefix라는 간단한 문자열 함수의 존재를 가정) 그러면 두 개의 셀 참조로 가져 와서 직접 비교하여 원하는 결정을 내릴 수 있습니다.

if CompareCell(enteredval,newval)>=0 then 
    newrow=newrow+1 
end if