VBA评估和For循环发生奇怪

时间:2018-02-20 22:42:55

标签: excel vba excel-vba

我在循环中使用了Evaluate(),除了整个循环中的第一个求值之外,一切都很顺利。

RowBegin = 98 
For RowCount = RowBegin To RowBegin + 23   'Total 24 rows per site per day
    If (RowCount Mod 4 <> 1) Then
        Cells(RowCount, 6).Value = Evaluate(Cells(RowCount, 10).Value)
        Cells(RowCount, 7).Value = Evaluate(Cells(RowCount, 11).Value)
    End If
Next RowCount

请注意,我会跳过4行中的1行,因为我有一个公式。除了第一个之外,所有的Evaluate()都能正常工作:

Evaluate(Cells(98, 10).Value)

这个显示#REF错误。我仔细检查了配方,没关系。实际上,即使是同一循环中的下一个也可以工作:

Evaluate(Cells(98, 11).Value)

这是我放入细胞(98,10)的公式:

='R:\20180220\[Filename.xlsb]Summary'!$D$2

这是我放入Cell(98,11)的公式:

='R:\20180220\[Filename.xlsb]Summary'!$D$3

但是,如果我将代码修改为:

RowBegin = 98
For RowCount = RowBegin To RowBegin + 23   'Total 24 rows per site per day
    If (RowCount = RowBegin) Then
        Cells(RowBegin, 6).Value = Evaluate(Cells(RowBegin, 10).Value)
        Cells(RowBegin, 7).Value = Evaluate(Cells(RowBegin, 11).Value)
    End If
    If (RowCount Mod 4 <> 1) Then
        Cells(RowCount, 6).Value = Evaluate(Cells(RowCount, 10).Value)
        Cells(RowCount, 7).Value = Evaluate(Cells(RowCount, 11).Value)
    End If
Next RowCount

然后一切正常。

陌生人,这也有效:

RowBegin = 98
For RowCount = RowBegin To RowBegin + 23   'Total 24 rows per site per day
    If (RowCount = RowBegin) Then
        Cells(RowBegin, 7).Value = Evaluate(Cells(RowBegin, 11).Value)
    End If
    If (RowCount Mod 4 <> 1) Then
        Cells(RowCount, 6).Value = Evaluate(Cells(RowCount, 10).Value)
        Cells(RowCount, 7).Value = Evaluate(Cells(RowCount, 11).Value)
    End If
Next RowCount

请注意,在第一个IF中,它实际上不会触及Cells(RowCount,6)!

我正在挠头,因为我认为第一段代码和第二段完全相同(因为当RowCount = 98时,它不会被跳过)。它与循环或Mod运算符有什么关系吗?

1 个答案:

答案 0 :(得分:1)

我认为它第一次打开外部引用 - 但不及时 - 并抛出错误,然后从那时起就可以了。因此IF工作而不是ELSEIF的原因是因为当您使用IF时它再次重做它,而ELSEIF它没有。这解释了所有奇怪的行为。只需在那里保留一条虚线即可打开它,如:

RowBegin = 98 
Cells(RowBegin, 6).Value = Evaluate(Cells(RowBegin, 10).Value) ' Dummy
For RowCount = RowBegin To RowBegin + 23   'Total 24 rows per site per day
    If (RowCount Mod 4 <> 1) Then
        Cells(RowCount, 6).Value = Evaluate(Cells(RowCount, 10).Value)
        Cells(RowCount, 7).Value = Evaluate(Cells(RowCount, 11).Value)
    End If
Next RowCount