优化循环,这是最合适的循环或条件语句

时间:2013-11-13 08:18:24

标签: loops vbscript conditional-statements

我正在阅读大型xml文件(600mb)并使用excel文件检查值。我在使用几个循环并花费时间执行。我想将条件语句中的一些循环替换为

这样:

此函数将工作表名称作为字符串,并尝试查找工作表(对于所有xml节点)

function searchValue( val, rng, worksheet ) 
    set objWorksheet = nothing
    For Iter = 1 To objWorkbook.Worksheets.Count
        If objWorkbook.Worksheets(Iter).Name = worksheet then
            Set objWorksheet = objWorkbook.Worksheets(Iter)
            exit for
        end if
    next

如果我使用选择案例并传递下面的工作表名称的工作表编号

,该怎么办?
sub getSheetNumber( worksheet)
    select case worksheet
    case "A"
        getSheetNumber = 1
    case "B"
        getSheetNumber = 2
    case "C"
        getSheetNumber = 3
    case "D"
        getSheetNumber = 4
    case "E"
        getSheetNumber = 5
    case "F"
        getSheetNumber = 6
    case else
        getSheetNumber = worksheet

这是一个好主意还是有其他方法可以避免循环

3 个答案:

答案 0 :(得分:2)

可以计算字母到数字的映射:

>> For Each c In Split("A B C D E F")
>>     WScript.Echo c, Asc(c) - Asc("A") + 1
>> Next
>>
A 1
B 2
C 3
D 4
E 5
F 6

答案 1 :(得分:1)

除了计算值之外,另一个选择是使用字典:

Set getSheetNumber = CreateObject("Scripting.Dictionary")
getSheetNumber.Add "A", 1
getSheetNumber.Add "B", 2
getSheetNumber.Add "C", 3
getSheetNumber.Add "D", 4
getSheetNumber.Add "E", 5
getSheetNumber.Add "F", 6

...

WScript.Echo getSheetNumber(worksheet)

当您想要实现简单的键值映射时,使用Select..Case是过度的。

答案 2 :(得分:0)

假设这是您的要求:

  

此函数将工作表名称作为字符串并尝试查找   sheet(适用于所有xml节点)

为什么不使用Excel本身查找工作表?

function searchValue(val, rng, worksheet) 
    set objWorksheet = nothing
    On error resume next
    Set objWorksheet = objWorkbook.Worksheets(worksheet)
    On error goto 0

    If objWorksheet Is Nothing then
         ' Error! worksheet not found
    End if

    <..>