Excel 或者即使在满足条件的情况下,声明也不起作用?

Excel 或者即使在满足条件的情况下,声明也不起作用?,excel,vba,Excel,Vba,概述 我目前正在开发一个简单的函数来帮助验证数组的起始位置。我使用的是DO语句,然后只是偏移活动单元格,直到满足DO语句的条件为止 代码 Public Function ArrayStart() As Variant Range("A3").Select Do ActiveCell.Offset(1, 0).Select Loop While (ActiveCell.Value <> "Date" Or _

概述

我目前正在开发一个简单的函数来帮助验证数组的起始位置。我使用的是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
日期位于“A4”范围内,所有数据的整个范围位于“A4:G11”范围内

问题

代码一直工作到到达循环While部分,即使activecell是“A4”,即“日期”,它也不会识别它,并将继续循环

当我取出OR条件并使用此代码时,它工作得非常完美

Loop While (ActiveCell.Value <> "Date")
Loop While(ActiveCell.Value“Date”)
我运行的是相同的代码,但是删除了OR语句,效果很好,我没有收到任何错误,我只是不明白为什么它不起作用。另外,当我将鼠标悬停在vba窗口中的activecell.value上时,当它到达单元格“A4”时,它会显示“日期”?

试试看

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
,有关详细信息,请参阅。更有效的代码将是

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
试一试

避免使用
ActiveCell
,有关详细信息,请参阅。更有效的代码将是

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

循环While和Unitl之间有什么区别?当我接受OR条件时,循环while将起作用out@ZacAttack-
DO-WHILE
只要某个条件为真,循环就会迭代,其中as
DO-UNTIL
会迭代直到某个条件不再为真。循环WHILE和Unitl之间的区别是什么?当我接受OR条件时,循环while将起作用out@ZacAttack-<代码> do--th/<代码>循环,只要某个条件为真,如<代码> do-> 迭代直到条件不再正确。考虑一个更简单的语句-<代码> x“a或x”b“< /代码>”。如果x是
“A”
,那么它就不是
“B”
,因此语句变为
False或True,即
True
。如果x是
“B”
,那么它就不是
“A”
,因此语句变为
真或假
,即
。如果x是
“C”
,则它不是
“A”
“B”
,因此该语句变为
True或True,即
True
。换句话说,它总是<代码>真< /代码>。考虑一个更简单的语句-<代码> x“a或x”b“< /代码>”。如果x是
“A”
,那么它就不是
“B”
,因此语句变为
False或True,即
True
。如果x是
“B”
,那么它就不是
“A”
,因此语句变为
真或假
,即
。如果x是
“C”
,则它不是
“A”
“B”
,因此该语句变为
True或True,即
True
。换句话说,它总是
真的