excel - VBA无限嵌套for循环
问题描述
我正在尝试编写嵌套的 for 循环来循环遍历列的行以进行一些计算,然后转到下一列再次执行此操作。逻辑对我来说是有意义的,但是工作表的输出在正确答案之间来回闪烁并用相同的数字覆盖所有内容,并且它只是继续这样做。如果我需要澄清任何事情,请让我知道,提前谢谢。
Sub findAvg2()
Dim maxVal As Double
Dim preHr As Double
Dim nextHr As Double
Dim cVal As Double
Dim pVal As Double
Dim nVal As Double
Dim avg As Double
Dim maxAvg As Double
Dim i As Integer 'row
Dim j As Integer 'col
Dim lRow As Integer
Dim lCol As Integer
lRow = Cells(Rows.count, 1).End(xlUp).row 'Find the number of rows in column A(1)
lCol = Cells(1, Columns.count).End(xlToLeft).Column
For i = 19 To lRow
For j = 2 To lCol
maxVal = Cells(2, j).Value
preHr = Cells(8, j).Value
nextHr = Cells(9, j).Value
avg = (maxVal + preHr + nextHr) / 3
If Cells(i, j).Value > 0 Then
pVal = Cells(i - 1, j).Value
cVal = Cells(i, j).Value
nVal = Cells(i + 1, j).Value
maxAvg = (pVal + cVal + nVal) / 3
If avg > maxAvg Then
maxAvg = avg
End If
End If
Cells(12, j).Value = maxAvg
'Debug.Print maxAvg
Next j
Next i
End Sub
解决方案
我查看了您的代码,并没有发现任何问题。我所做的修改在我看来是具有装饰性的。这是结果。
Sub findAvg2()
' 005
Dim maxVal As Double
Dim preHr As Double
Dim nextHr As Double
Dim cVal As Double
Dim pVal As Double
Dim nVal As Double
Dim Avg As Double
Dim maxAvg As Double
Dim Cl As Long ' last used column
Dim Rl As Long ' last used row
Dim C As Long ' column
Dim R As Long ' row
' Find the number of used columns and roaws in the sheet
Cl = Cells(1, Columns.Count).End(xlToLeft).Column
Rl = Cells(Rows.Count, 1).End(xlUp).Row
For R = 19 To Rl
For C = 2 To Cl
maxVal = Cells(2, C).Value
preHr = Cells(8, C).Value
nextHr = Cells(9, C).Value
maxAvg = (maxVal + preHr + nextHr) / 3
cVal = Cells(R, C).Value
If cVal > 0 Then
pVal = Cells(R - 1, C).Value
nVal = Cells(R + 1, C).Value
Avg = (pVal + cVal + nVal) / 3
If Avg > maxAvg Then maxAvg = Avg
End If
Cells(12, C).Value = maxAvg
'Debug.Print maxAvg
Next C
Next R
End Sub
您的这行代码可能存在弱点。For R = 19 To Rl
. 由于您在计算平均值时包括了前一行,因此第 18 行必须包含数据。如果不是,并且您不能从评估中排除第一个数据行,则必须对初始 maxAvg 的计算做出特殊规定。
所有动作都发生在 ActiveSheet 上。这是我本能地不喜欢的安排。除非您从该工作表上的按钮调用 sub - 即便如此,如果智能 alec 想要使用 F5 代替 - 我会在代码中命名工作表。使用 CodeName 既可以提高安全性,又可以让用户自由地重命名工作表。此代码将在恰好处于活动状态的任何工作表上运行。它甚至不必在同一个工作簿中。
推荐阅读
- django - Python Django Admin 创建新对象并过滤水平过滤器元素
- unit-testing - gtest/gtest.h:没有这样的文件或目录#include "gtest/gtest.h"
- machine-learning - 如何使用keras理解fit_generator中的steps_per_epoch?
- webpack - 如何将单独的供应商脚本添加到多页面 Webpack 项目中的不同页面?
- android - Fragment$Companion 无法在 BottomNavigationView 侦听器上强制转换为 androidx.fragment.app.Fragment
- php - laravel morphable 获取源码
- android - 触发 AppBar 回到其在 CoordinatorLayout 内的正常位置
- c - Unix中的fork函数
- iis - ASP.NET Core 3 - 有没有办法将模块部分添加到生成的 Web 配置文件
- javascript - 如何在 MVC 模式中创建模型类的实例 - SapUI5