excel - VBA中具有多个条件的Do-Loop
问题描述
这是我在这里的第一个问题,我必须承认,到目前为止,我无法在这里或其他地方找到任何解决方案。这是问题所在:
我想编写一个代码,它应该执行以下操作:
- 询问用户需要多少行
- 问一下,需要多少列
- 创建一个矩阵,其中第一列中的所有行都被编号,第一行中的所有列都被编号,并且在矩阵中,所有这些数字都是相乘的(例如,第 3 行/第 4 列包含 12)。
- 最后,所有素数都应着色。
我的问题从最后一步开始(在我的代码中从“'Primzahlen hervorheben”开始)。对于行和列的每个组合,我使用两个循环,在其中我首先假设,通过设置和设置,for
乘积是质数,它在所有数字中增加 1,直到乘积本身......但由于某种原因,保持增长并最终达到五位数区域,然后崩溃。我想,问题一定出在这一行:primzahl = true
k = 2
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
这个案子不是什么急事什么的,我就是想知道,钩子在哪里。感谢您的支持和希望,以获得一些有用的建议。
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:
循环将继续,只要 [...] 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
withi
和j
大于 1 产生的数字根据定义不是素数,因此对它们进行检查是没有意义的。他们至少有i
和j
作为除数。
推荐阅读
- linux - Docker 使 CMD 保持活动状态以进行检查。sleep 不适合,ping 默认不可用
- ios - 面临的问题 - 错误的解释器:在 MAC 上使用 pod update 时没有这样的文件或目录
- python - sklearn KMedoids 返回空簇
- c# - 如何在 C# 中的对象初始化程序中使用 Console.ReadLine()
- docusignapi - 将附加选项卡添加到 TemplateRole
- bash - 测试 bash 脚本是否从 systemd 启动
- r - 闪亮的 DT 表更新问题并将表内容提取为 R 对象
- python - Python 等高线图/热图
- c++ - 谁能弄清楚这段代码如何显示运行错误?它正在打印无限时间-1以及正确答案
- php - 无法使用 PHP 将数据库连接到 heroku