首页 > 解决方案 > VBA中具有多个条件的Do-Loop

问题描述

这是我在这里的第一个问题,我必须承认,到目前为止,我无法在这里或其他地方找到任何解决方案。这是问题所在:

我想编写一个代码,它应该执行以下操作:

我的问题从最后一步开始(在我的代码中从“'Primzahlen hervorheben”开始)。对于行和列的每个组合,我使用两个循环,在其中我首先假设,通过设置和设置,for乘积是质数,它在所有数字中增加 1,直到乘积本身......但由于某种原因,保持增长并最终达到五位数区域,然后崩溃。我想,问题一定出在这一行:primzahl = truek = 2k

Do While (primzahl = True) Or (k <= i * j) Or (i * j <> 1)

我连接了所有条件,就像在if构造中一样。编辑器本身似乎对此没有问题,但为什么它忽略了第二个条件,它不允许k变得大于i * j?我错过了什么吗?
简而言之:循环将继续,只要

这个案子不是什么急事什么的,我就是想知道,钩子在哪里。感谢您的支持和希望,以获得一些有用的建议。

Sub rechnen()
    'Zellen leeren
      Cells.ClearContents
      Cells.ClearFormats

    'Variablen definieren
      Dim i As Integer, j As Integer, k As Integer, iMax As Integer, jMax As Integer, primzahl As Boolean

    'Variablen Werte zuweisen
      iMax = 3 'InputBox("Anzahl Zeilen")
      jMax = 5 'InputBox("Anzahl Spalten")

    'Eigentliche Prozedur
      For i = 1 To iMax
        Cells(1 + i, 1).Value = i
        For j = 1 To jMax
          Cells(1, 1 + j).Value = j
          Cells(1 + i, 1 + j).Value = i * j
        Next j
      Next i

    'Spaltenbreite anpassen
      ActiveSheet.UsedRange.Columns.AutoFit



    'Primzahlen hervorheben
      For i = 1 To iMax
        For j = 1 To jMax
          k = 2
          primzahl = True
          ''''''''
          Do While (primzahl = True) Or (k <= i * j) Or (i * j <> 1)
            If Cells(1 + i, 1 + j).Value Mod k = 0 Then
              primzahl = False
              Exit Do
            End If
              k = k + 1
          Loop
          ''''''''
          If primzahl = True Then
            Cells(1 + i, 1 + j).Interior.Color = vbRed
          End If      
        Next j
      Next i

End Sub
``

标签: excelvba

解决方案


您似乎混淆了 OR 和 AND:

循环将继续,只要 [...] OR [...] OR [...]

您实际上的意思是说,当这三个条件中的任何一个不为真时,循环将结束。所以从逻辑上讲,循环应该在所有条件仍然成立时继续。这表示逻辑 AND,而不是 OR。

所以你的意思是:

Do While (primzahl = True) And (k <= i * j) And (i * j <> 1)

但这可以简化。

该表达式primzahl = True将始终为真,因为一旦您设置primzahl = False,您就会显式退出循环Exit Do,因此While条件永远不会被评估primzahl = False

其次,如果(i * j <> 1)第一次迭代为真,那么在任何其他迭代中它也为真,因为迭代不会改变i也不j。但即使它第一次是真的,那么肯定k <= i * j不是真的(你已经设置k = 2并且它只会获得更大的值),所以一旦你超过条件,这个条件也总是会为真k

因此,考虑到这一点,您将拥有:

k = 2
Do While k <= i * j
    ' etc..
    k = k + 1
Loop

然后为什么不让它成为一个For循环,因为你k从 2 到i*j?

For k = 2 To i * j
    ' etc.. (don't do k = k + 1 now)
Next

关于您给自己的作业:由i * jwithij大于 1 产生的数字根据定义不是素数,因此对它们进行检查是没有意义的。他们至少有ij作为除数。


推荐阅读