2017-02-15 24 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 для первого маленького бита больше 100, но каким-то образом код не узнает его сейчас, поскольку он действительно больше. –

+1

Вам нужно будет отнести числовую часть к числовым типам, прежде чем использовать сравнения акций на них. См. [Операторы сравнения] (http://stackoverflow.com/documentation/vba/5813/operators/20479/comparison-operators#t=201702151525369696781) в документации. – Comintern

ответ

0

Проблема в том, что вы пытаетесь решить проблему сравнения, нападая на определенные значения, и это будет проблемой для поддержания. Я сделал бы проблему более общей, создав функцию, которая снабжает двумя значениями, возвращающими -1, если первый операнд «до» второй, 0, если они одинаковы, и 1, если первый операнд «после» второй по вашим правилам.

Затем вы можете перестроить свой код, чтобы исключить конкретное твердое префиксное тестирование, а затем просто вызвать функцию сравнения напрямую, например (и это ПОЛНОСТЬЮ непроверено, вне манжеты, а мой VBA VERRRRRY устарел :), но идея есть: (это также предполагает наличие простой функции строкового называется StripPrefix, что просто принимает строку и срывает любые начальные цифры, которые я подозреваю, что вы можете раскрутить довольно легко себя)

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 

функция вроде это позволяет вам принимать любые ссылки на две ячейки и сравнивать их напрямую, чтобы принять любое необходимое решение:

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