You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBScript中For循环无法终止问题排查:请求定位错误原因

问题描述

第二个外层For循环内的For Each循环存在问题:变量t会一直递增到数组末尾,明明只存入了25个有效数据,但循环却执行完了整个数组的所有元素。以下是代码及输出结果:

Set Jakobi = Rastr.Tables("jakobi")
Set yzel_i = Jakobi.Cols("ni")
Set yzel_j = Jakobi.Cols("nj")
Set dp_dv = Jakobi.Cols("b")

Dim array1(50, 2), j
j = 0

Dim array_r(50, 2)
k = 0

Dim t, m
For i = 0 To Jakobi.Size - 1
    If yzel_i.Z(i) = yzel_j.Z(i) And yzel_i.Z(i) <> 0 Then
        array1(j, 0) = yzel_i.Z(i)
        array1(j, 1) = dp_dv.Z(i)
        j = j + 1
    End If
Next

k = 0
For i = 0 To Jakobi.Size - 1
    
    If yzel_i.Z(i) <> yzel_j.Z(i) Then
        
        t = 0
        m = yzel_i.Z(i)
        
        For Each x In array1
            Rastr.Printp array1(t, 0)
            If x <> m Then
                array1(t, 2) = array1(t, 2) - dp_dv.Z(i)
            End If
            t = t + 1           '<------问题位置
            Rastr.Printp t
        Next
        
        array_r(k, 1) = array1(t, 1) - dp_dv.Z(i)
        array_r(k, 0) = yzel_i.Z(i)
        k = k + 1
    
    End If
    
Next

For i = 0 To UBound(array1)
    Rastr.Printp array1(i, 0) & "     " & array1(i, 2)
Next

输出结果:

我仅存25个值,但循环执行到数组末尾:
51
1
52
2
4
3
3
4
1
5
2
6
152
7
151
8
15
9
7
10
71
11
6
12
72
13
8
14
13
15
9
16
12
17
101
18
102
19
11
20
10
21
14
22
141
23
142
24
5
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

问题定位与修复方案

错误原因

  1. For Each遍历二维数组的特性:你定义的array1是(50,2)的二维数组,总共有51*3=153个元素。For Each x In array1会遍历数组里的每一个元素,包括未赋值的空白元素,所以t会一直递增到153,而非停在25个有效数据的位置。
  2. 遍历逻辑错误:你想按行处理array1的有效数据,但For Each拿到的是单个元素的值,不是整行数据,这里的x变量完全无用,还会导致判断逻辑混乱。
  3. 后续赋值错误:循环结束后t的值等于有效数据行数j,array1(t,1)是未赋值的空白元素,直接用它赋值给array_r(k,1)会导致数据错误。

修复代码

把原来的For Each循环替换成基于有效数据行数j的For循环(j已记录有效数据数量),同时修正后续的赋值逻辑:

' 替换原For Each循环及后续赋值部分
t = 0
m = yzel_i.Z(i)
Dim targetIndex As Integer
targetIndex = -1

' 只遍历前j行有效数据
For t = 0 To j - 1
    Rastr.Printp array1(t, 0)
    ' 记录目标m对应的行索引
    If array1(t, 0) = m Then
        targetIndex = t
    Else
        array1(t, 2) = array1(t, 2) - dp_dv.Z(i)
    End If
    Rastr.Printp t + 1
Next

' 找到目标行后再赋值
If targetIndex <> -1 Then
    array_r(k, 1) = array1(targetIndex, 1) - dp_dv.Z(i)
    array_r(k, 0) = yzel_i.Z(i)
    k = k + 1
End If

这样就能保证只处理25个有效数据,不会遍历到数组末尾,同时修正了后续的赋值错误。

内容的提问来源于stack exchange,提问作者young_energizer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 06:00:04