我是VBA的新手,我试图在Excel VBA中模拟一个复杂的方程式,因为我的数据记录器正在输出CSV,并且由于方程式是如此之长且复杂,且包含13个变量和17个中间计算,所以我我正在尝试创建变量,以使代码更易于阅读,既可以进行调试(现在以及将来做类似的事情),也可以使我对模拟所做的修改更加直观。
我的代码的基本结构如下:
'Temperature = .Cells(i,1)
'WindSpeed = .Cells(i,2)
'SolarRadiation = .Cells(i,3)
'Humidity = .Cells(i,4)
'SimulatedValue = .Cells(i,5)
Sub Simulation()
With Worksheets("DataLoggerValues")
Dim i As Integer
For i = 2 To 184
.Cells(i,5) = (.Cells(i,1)+.Cells(i,3)/.Cells(i,2))^2 + .Cells(i,4)/37
Next i
End With
End Sub
我想清理它,使代码行的内容更像是:
Simulated value = (Temperature+SolarRadiation/WindSpeed)^2 + Humidity/37
但是每次我尝试使用.Cells(i,j)作为变量声明任何内容(我尝试过字符串和数组)时,都会遇到许多不同的错误,最常见的是“运行时错误1004”,但是有时将“语法错误”或“期望的新名称或类型名称”作为编译错误。
是否甚至可以将.Cells(i,j)转换为变量,还是我需要采用其他方法?
谢谢!
答案 0 :(得分:0)
您的代码应如下所示。
Sub Simulation()
Dim i As Long
Dim Temperature As Long
Dim WindSpeed As Long
Dim SolarRadiation As Long
Dim Humidity As Long
Dim SimulatedValue As Long
With Worksheets("DataLoggerValues")
For i = 1 To 100
Temperature = .Cells(i, 1).Value
WindSpeed = .Cells(i, 2).Value
SolarRadiation = .Cells(i, 3).Value
Humidity = .Cells(i, 4).Value
.Cells(i, 5).Value = (Temperature + SolarRadiation / WindSpeed) ^ 2 + Humidity / 37
Next i
End With
End Sub
您也可以使用类似这样的东西。只需将该函数用作普通的excel函数即可。然后,您可以使用自动填充功能拖动它。将代码添加到模块后,即可使用它。
Function Simulation(Temperature As Long, WindSpeed As Long, SolarRadiation As Long, Humidity As Long)
Simulation = (Temperature + SolarRadiation / WindSpeed) ^ 2 + Humidity / 37
End Function
编辑:
下面评论的答案。
Sub Simulation()
Dim i As Long
Dim Temperature As Long
Dim WindSpeed As Long
Dim SolarRadiation As Long
Dim Humidity As Long
Dim SimulatedValue As Double
With Worksheets("DataLoggerValues")
For i = 1 To 100
Temperature = .Cells(i, 1).Value
WindSpeed = .Cells(i, 2).Value
SolarRadiation = .Cells(i, 3).Value
Humidity = .Cells(i, 4).Value
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
SimulatedValue = (Temperature + SolarRadiation / WindSpeed) ^ 2 + Humidity / 37
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
.Cells(i, 5).Value = SimulatedValue
Next i
End With
End Sub
我想您应该阅读一些有关编程语言中的对象的信息。您可以从以下开始:
https://analysistabs.com/excel-vba/objects-properties-methods/
您的代码有什么问题:
Worksheets("DataLoggerValues")
是一个对象。它有一些属性。例如,它的名称为:“ DataLoggerValues”。
您可以使用
进行检查Sub Test()
MsgBox Worksheets(1).Name
End Sub
如果其索引为1。可能会有所不同。您可以使用该对象的另一个属性进行检查。
Sub Test()
MsgBox Worksheets("DataLoggerValues").Index
End Sub
现在我们可以解决问题了。 Worksheets("DataLoggerValues").Cells(i, 5)
是另一个对象。这是一个子对象(子类对象)。
这不是一个单一的值!!!它是一个对象。它具有不同的属性和方法。这就是为什么:.Cells(i,5) =...
没有意义。您是将值分配给.Cells(i,5).Address
还是.Cells(i,5).Value
还是其他一些属性?它们都“存储”值。您可以阅读或更改它们。
也许我应该弄清楚为什么您必须不同地使用SimulatedValue
。
好吧,使用前四个单元格很简单。您创建一个变量,例如Dim Temperature As Long
。它可以将以后分配的值存储在计算机内存中的某个地方!!!只需为其分配一些单元格的值Temperature = .Cells(i, 1).Value
。
对不同的变量执行相同的操作并执行一些计算。正如我在新代码中所做的那样,您可以将该数字(必须为Double,因为它必须“在逗号后存储一些数字”)存储在另一个变量中(如果您的Temperature,WindSpeed等不是整数,则更改Long)加倍)。
现在,您可以将该值分配给单元格值.Cells(i, 5).Value = SimulatedValue
。如果要在计算之前的某处添加行SimulatedValue = .Cells(i, 5).Value
,则只需将变量的值分配给变量(SimulatedValue)(如果该单元为空或不存在,则为0,我不是专家如果尝试打印该值,那么您什么也不会得到,但是可以将任何值乘以它的值,然后得到0)。如果然后编写类似SimulatedValue = 5
的内容,则只需为变量分配新值。您无需对该单元格对象做任何事情(单元格,即单元格的值)。
我希望这很清楚。我尽力做到简洁
关于vba,我只是一个初学者,对编程我不太了解,因此请记住这一点,我可能使用了错误的术语。也许有人会纠正我。 :)
重要的事情,涉及使用浮点变量(例如Double)。阅读:
Whats wrong with this simple 'double' calculation?
Compare double in VBA precision problem
我猜想,如果您将值直接分配给某个单元格的值,问题仍然存在,尽管我没有阅读或尝试过。
.Cells(i, 5).Value = (Temperature + SolarRadiation / WindSpeed) ^ 2 + Humidity / 37
如果您使用浮点数进行一些计算,则可能会在将来为您节省一些时间。
答案 1 :(得分:0)
您实际上不需要循环此操作,因为Excel足够聪明,可以增加它,然后可以像这样复制和粘贴为值:
Sub Simulation()
With Worksheets("DataLoggerValues").Range("E2:E184")
.Formula = "=(A2+C2/B2)^2+D2/37" 'Excel will increment the row relative to the row the formula is in
.Copy
.PasteSpecial xlPasteValues
End With
End Sub
您应该将Shelty标记为正确,因为他的答案是通过在循环内移动变量分配来回答您的特定问题,我只是为您提供和替代的主意,以加快您的代码的速度。
答案 2 :(得分:0)
有N种标准化代码的方法。为了简单起见,您可以这样做
Sub Simulation()
Dim i As Long
Dim Temperature As Range
Dim WindSpeed As Range
Dim SolarRadiation As Range
Dim Humidity As Range
Dim SimulatedValue As Range
With Worksheets("DataLoggerValues")
'just initialize the header part
Set Temperature = .Cells(1, 1)
Set WindSpeed = .Cells(1, 2)
Set SolarRadiation = .Cells(1, 3)
Set Humidity = .Cells(1, 4)
Set SimulatedValue = .Cells(1, 5)
End With
Dim i As Integer
For i = 1 To 183
SimulatedValue.Offset(i, 0) = (Temperature.Offset(i, 0) + SolarRadiation.Offset(i, 0) / WindSpeed.Offset(i, 0)) ^ 2 + Humidity.Offset(i, 0) / 37
Next i
' and finally
Set Temperature = Nothing
Set WindSpeed = Nothing
Set SolarRadiation = Nothing
Set Humidity = Nothing
Set SimulatedValue = Nothing
End Sub
一些提示:避免使用With..End,可以使用命名范围或Tables或常量地址来获得更好的性能和可用性。