【问题标题】:Dizzy with Excel VBA AND OR logical operators对 Excel VBA AND OR 逻辑运算符感到头晕
【发布时间】:2016-07-26 16:16:22
【问题描述】:

我希望我的程序删除column a (cA) is Fund ID 6347 OR 6349 AND 具有less than +/-100 基点影响的任何行 AND less than +/-50% price change

以下代码可用于删除行:either fund and a basis point impact +/- 100,但我不相信它可以按照我的意图工作,因为当我删除 @第一行中的 987654325@ 代码我的测试失败了,这让我相信我的代码在某种程度上可以部分工作,但这是偶然的。

有人理解我试图编码的逻辑吗?是否有一些 Web GUI,我可以编写 excel VBA 代码并查看突出显示的括号,以便在这些情况下获得更好的体验?谢谢

        For i = LR To 2 Step -1

                     If (Left(CStr(cells(i, cA)), 4) = "6347" And (cells(i, cJ) <= 100 And cells(i, cJ) >= -100)) Or _
                     (Left(CStr(cells(i, cA)), 4) = "6349" And (cells(i, cJ) <= 100) And cells(i, cJ) >= -100) Or _
                     Left(CStr(cells(i, cC)), 4) = "Trs " Or _
                     Mid(CStr(cells(i, cC)), 15, 8) = "bcomf1t " Or _
                     Mid(CStr(cells(i, cC)), 15, 7) = "bcomtr " Then

【问题讨论】:

  • re: '...结合可怜的 2007 excel IDE 界面' 是可怜的工人责备他的工具。
  • 将每个“或”语句拆分成自己的“如果”语句有助于理顺逻辑吗?
  • 您的代码还会检查cC 列中的值是否为“Trs”或“bcomfit”或“bcomtr”以便继续。这不是你在叙述开始时所声明的。谁是对的?
  • 如果你声明了一些变量,你的工作会容易得多,这样你就可以从If Then中删除所有这些CStr(Cells())
  • 这可以简化为:(cells(i, cJ) &lt;= 100 And cells(i, cJ) &gt;= -100)) 为:Abs(cells(i, cJ).Value &lt;= 100)。但否则,我会根据上面的 sous2817 评论将您的 Or 语句分解为自己的 If 语句来解决问题。

标签: vba excel logical-operators


【解决方案1】:

在构建 if 语句之前从电子表格中取出变量,然后将它们放在每一行。这更有效,并且更容易阅读。按照您的规范声明:

我希望我的程序删除列 a (cA) 所在的任何行 基金 ID 6347 或 6349 且基点影响小于 +/-100 并且价格变化小于 +/-50%

它看起来像这样(请注意,我在猜测什么值来自哪里,并且您的代码具有您未指定的其他条件):

Dim FundId As String
FundId = Left$(Cells(i, cA).Value, 4)
Dim BasisImpact As Long
BasisImpact = Cells(i, cJ).Value
Dim PriceChange As Long
PriceChange = Cells(i, whereever).Value

If (FundId = "6347" Or FundId = "6349") And _
   (BasisImpact >= -100 And BasisImpact <= 100) And _
   (PriceChange >= -50 And PriceChange <= 50) Then

正如@Jeeped 在 cmets 中指出的那样,VBA 将在If 语句中执行所有的测试(它不会短路)。如果这是代码的性能关键部分,或者您拥有庞大的数据集,则嵌套 If 语句和工作表访问将为您提供更好的性能:

If FundId = "6347" Or FundId = "6349" Then
    Dim BasisImpact As Long
    BasisImpact = Cells(i, cJ).Value
    If BasisImpact >= -100 And BasisImpact <= 100 Then
        Dim PriceChange As Long
        PriceChange = Cells(i, whereever).Value
        If PriceChange >= -50 And PriceChange <= 50 Then
            'Do your thing
        End If
    End If
End If

【讨论】:

  • 为什么每次都处理所有条件?嵌套每组条件可能会使该过程更容易理解,并且除非外部“嵌套”已经匹配,否则不会评估内部“嵌套”。 提示: 为了获得最佳优化,最不可能应该是外部条件。例如如果有 7000 个基金 ID,并且只有两个可能的匹配项,那么这可能是最好的外部条件。
  • 因为……原因? 真正的原因是我工作中的大部分编码都是用 C# 编写的,有时我忘记了 VBA 不会短路。
  • :) 只是一个优化建议...不是贬低。
【解决方案2】:

如果你只关心“资金”和“影响”检查,那就这样吧:

Dim okFund As Boolean, okImpact As Boolean

For I = LR To 2 Step -1

    okFund= Left(CStr(Cells(I, cA)), 4) = "6347" Or (Left(CStr(Cells(I, cA)), 4) = "6349"
    okImpact = Cells(I, cJ) <= 100 And Cells(I, cJ) >= -100

    If okFund And okImpact Then

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多