VBA For循环变量

时间:2018-09-05 21:42:50

标签: excel vba

我是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)转换为变量,还是我需要采用其他方法?

谢谢!

3 个答案:

答案 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或常量地址来获得更好的性能和可用性。