【问题标题】:OR Statement not working even when conditions are met?OR 即使满足条件,语句也不起作用?
【发布时间】:2017-09-03 00:32:15
【问题描述】:

概述

我目前正在研究一个简单的函数来帮助验证我的数组的起始位置。我正在使用 DO 语句,然后只是偏移活动单元格,直到满足我的 DO 语句的条件。

代码

Public Function ArrayStart() As Variant

    Range("A3").Select


    Do


        ActiveCell.Offset(1, 0).Select


    Loop While (ActiveCell.Value <> "Date" Or _
                ActiveCell.Value <> "Open" Or _
                ActiveCell.Value <> "High" Or _
                ActiveCell.Value <> "Low" Or _
                ActiveCell.Value <> "Close" Or _
                ActiveCell.Value <> "Adj Close" Or _
                ActiveCell.Value <> "Volume")

    ArrayStart = ActiveCell.Row


End Function

Excel 工作表中的数据

Date        Open    High     Low    Close   Adj Close  Volume
12/22/1998  19.05   19.05   18.85   18.94     9.98     55900
12/23/1998  18.86   19.22   18.86   19.22     10.13    78800
12/24/1998  19.22   19.34   19.15   19.34     10.20    43800
12/28/1998  19.33   19.33   19.04   19.09     10.06    51900
12/29/1998  19.12   19.29   18.89   19.29     10.17    100800
12/30/1998  19.19   19.32   19.09   19.22     10.13    154600
12/31/1998  19.22   19.24   19.04   19.04     10.04    65400

日期位于“A4”范围内,所有数据的整个范围都位于“A4:G11”范围内

问题

代码一直有效,直到到达 Loop While 部分,即使活动单元格是“A4”,也就是“日期”,它也不会识别它,并且会继续循环。

当我取出 OR 条件并使用此代码时,它可以完美运行

Loop While (ActiveCell.Value <> "Date")

我正在运行相同的整体代码,但消除了 OR 语句,它工作得很好,我没有收到任何错误,我只是不明白为什么它不工作。此外,当我将鼠标悬停在 vba 窗口中的 activecell.value 上时,它会在到达单元格“A4”时显示“日期”???

【问题讨论】:

  • 考虑一个更简单的语句 - x &lt;&gt; "A" Or x &lt;&gt; "B"。如果 x 是 "A",那么它不是 "B",因此语句变为 False Or True,即 True。如果 x 是"B",那么它不是"A",因此语句变为True Or False,即True。如果 x 是"C",那么它不是"A""B",因此语句变为True Or True,即True。换句话说,它总是 True.

标签: excel vba


【解决方案1】:

试试

Public Function ArrayStart() As Variant
    Range("A1").Select
    Do
        ActiveCell.Offset(1, 0).Select
    Loop Until (ActiveCell.Value = "Date" Or _
                ActiveCell.Value = "Open" Or _
                ActiveCell.Value = "High" Or _
                ActiveCell.Value = "Low" Or _
                ActiveCell.Value = "Close" Or _
                ActiveCell.Value = "Adj Close" Or _
                ActiveCell.Value = "Volume")
    ArrayStart = ActiveCell.Row
End Function

避免使用ActiveCell,详情请参阅this。更高效的代码将是

Public Function ArrayStartMMM() As Variant
    Dim rng As Range
    Set rng = Range("A1")
    Do
        Set rng = rng.Offset(1, 0)
    Loop Until (rng.Value = "Date" Or _
                rng.Value = "Open" Or _
                rng.Value = "High" Or _
                rng.Value = "Low" Or _
                rng.Value = "Close" Or _
                rng.Value = "Adj Close" Or _
                rng.Value = "Volume")
    ArrayStart = rng.Row
End Function

【讨论】:

  • Loop While 和 Unitl 有什么区别?当我取出 OR 条件时,循环 while 将起作用
  • @ZacAttack - 只要某个条件为真,DO-WHILE 循环就会迭代,而 DO-UNTIL 会迭代直到某个条件不再为真。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 2021-09-26
  • 2015-07-12
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多