gpt4 book ai didi

excel - VBA中具有多个条件的Do-Loop

转载 作者:行者123 更新时间:2023-12-04 22:25:10 25 4
gpt4 key购买 nike

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

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

  • 询问用户需要多少行
  • 问一下,需要多少列
  • 创建一个矩阵,其中第一列中的所有行都被编号,第一行中的所有列都被编号,并且在矩阵中,所有这些数字都是相乘的(例如,第 3 行/第 4 列包含 12)。
  • 最后,所有素数都应着色。

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

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

    我连接了所有条件,就像在 if 中一样。构造。编辑器本身似乎没有这个问题,但是为什么它忽略了第二个条件,它不允许 k大于 i * j ?我错过了什么吗?
    简而言之:循环将继续,只要
  • 事实证明它不是素数 (p rimzahl = false ),或
  • k小于或等于 i * j , 或
  • i * j不是 1

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

    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
    ``

    最佳答案

    您似乎混淆了 OR 和 AND:

    The loop shall continue, as long as [...] 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 * j 产生的数字与 ij根据定义,两者都大于 1 不是素数,因此对它们进行检查是没有意义的。他们至少有 ij作为除数。

    关于excel - VBA中具有多个条件的Do-Loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58581811/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com