【问题标题】:Trouble with array without exactly size in VBSVBS中没有确切大小的数组的问题
【发布时间】:2016-08-03 07:30:13
【问题描述】:

我已经解决了这个问题:

我有数组:

weatherList = Array("rainy", "dry") 
cityList = Array("Mumbai", "Delhi", "Goa", "Varanasi")

但现在我要求包含所有城市,而不是仅数组中的 4 个,我不知道如何将它们全部包含在内?

tab = "countryMap"
For Each city In cityList
        For Each weather In weatherList
            count = count + 1
            ReDim Preserve commandList(UBound(commandList) + 1)
            commandList(UBound(commandList)) = """" & tabcmdPath & """ export --pagesize a4 --pagelayout landscape """ & workbook & "/" & tab & "?Weather=" & weather & "&Route" & city  & """ --pdf -f """ & workbook & "\" & count & ".pdf"""
            ReDim Preserve fileList(UBound(fileList) + 1)
            fileList(UBound(fileList)) = workbook & "\" & count & ".pdf" 
        Next
 Next

请求是遍历每个城市并列出天气,然后将其创建为 pdf 输出。但是印度有很多大城市,我无法在数组中手动​​定义它们,有时我会得到有关天气和其他条件的信息,有时却没有?

有人可以帮我解决这个问题吗?

谢谢, 马里哈

【问题讨论】:

    标签: arrays vb.net vba dynamic vbscript


    【解决方案1】:

    目前还不清楚您尝试将哪种字符串连接在一起。为 commandList 提供的命令格式不正确。 tabcount 也没有定义或分配。至少,count 似乎应该在循环中递增。

    这将循环遍历组合,在旅途中扩展 commandListfileList。你最终会得到每个数组一个太大的元素,所以多余的元素会被剪掉。

    weatherList = Array("rainy", "dry")
    cityList = Array("Mumbai", "Delhi", "Goa", "Varanasi")
    ReDim commandList(0)
    ReDim fileList(0)
    
    For c = LBound(cityList) To UBound(cityList)
        For w = LBound(weatherList) To UBound(weatherList)
            Debug.Print cityList(c) & ":" & weatherList(w)
            'what is COUNT? what is TAB?
            'commandList(UBound(commandList)) = """ & tabcmdPath & """ export --pagesize a4 --pagelayout landscape """ & workbook & "/" & tab & "?Weather=" & weather & "&Route" & city  & """ --pdf -f """ & workbook & "\" & count & ".pdf"""
            'what is COUNT?
            'fileList(UBound(fileList)) = Workbook & "\" & Count & ".pdf"
    
            ReDim Preserve commandList(UBound(commandList) + 1)
            ReDim Preserve fileList(UBound(fileList) + 1)
    
        Next w
    Next c
    
    ReDim Preserve commandList(UBound(commandList) - 1)
    ReDim Preserve fileList(UBound(fileList) - 1)
    

    【讨论】:

    • 嗨,我在服务器上有工作簿,需要以 pdf 格式打印。这不是所有代码...最初计数为 0 ,选项卡也是工作簿的特定部分。我需要遍历每个城市和每种天气条件才能在 pdf 中打印出来。无论如何,我会尝试修改我的脚本。
    • 通过ReDim创建空数组的正确方法是:ReDim a(-1)。
    • 谢谢,但我的问题是,如果我不知道确切的城市数量,我该如何迭代?今天可以10,明天20?我需要打印它们。我应该如何在我的 cityList 数组中定义? cityList=Array(?)
    • 这将取决于您计划如何“加载”城市数组。如果您不打算输入它们,那么它们一定来自某个地方。你说城市的名单每天都不一样;嗯...城市列表在哪里?
    • 在这种情况下,是的,我有城市列表 - 将显示大约 40 个城市,并非总是全部,但我明白你的意思。毕竟,我需要输入所有这些,对吗?我以为我可以以某种方式避免那部分。但是无论如何,当我没有某个城市时如何跳过案例,我不想在那种情况下打印那个页面?
    【解决方案2】:

    构建cartesian product

    也就是说,对于集合 A 和 B,笛卡尔积 A × B 是 a ∈ A 和 b ∈ B 的所有有序对 (a, b)。

    你应该计算结果数组的大小(如果你真的需要的话)。如:

    >> w = Split("r d")
    >> c = Split("M D G V Z")
    >> n = (UBound(w) + 1) * (UBound(c) + 1) - 1
    >> ReDim p(n)
    >> i = 0
    >> For Each ew In w
    >>     For Each ec In c
    >>         e = Join(Array(i, ew, ec), "-")
    >>         WScript.Echo e
    >>         p(i) = e
    >>         i = i + 1
    >>     Next
    >> Next
    >> WScript.Echo p(UBound(p))
    >>
    0-r-M
    1-r-D
    2-r-G
    3-r-V
    4-r-Z
    5-d-M
    6-d-D
    7-d-G
    8-d-V
    9-d-Z
    9-d-Z
    >>
    

    【讨论】:

      【解决方案3】:

      我找到了更灵活的解决方案。我创建了 xlsx 文件,该文件将每周更新一次精确测量的城市。我的脚本将读取该 xlsx 文件并从中提取城市。这样我就避免了空打印的 pdf 页面。 谢谢大家!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-22
        • 2012-02-05
        • 1970-01-01
        • 2021-05-10
        • 2016-07-06
        相关资源
        最近更新 更多