我有一个问题,我试图比较可以是字母数字,仅数字或仅字母的值。
该代码最初适用于比较同一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)
问题是你试图通过攻击特定值来解决比较问题,这将是一个需要维护的问题。我通过创建一个函数来使问题更通用,如果第一个操作数在第二个操作数“之前”,则提供两个值返回-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