【发布时间】:2013-07-19 17:50:25
【问题描述】:
我正在使用这个 VBA 函数,现在它工作正常,因为我的电子表格的格式没有改变。但我会对其进行调整以供其他用途,并且订单可能会更频繁地更改。不过,我需要此函数的表头名称不会更改它们的名称。我的整个电子表格方程已经使用了结构化引用,但我正在努力思考如何准确地消除对 VBA 代码中列位置的显式引用的残余。
声明If data(i, 2).Value = expNum Then和
If data(i, 14).Value <> Empty Then
curEnergy = data(i, 14).Value`
是那些有问题的。第 2 列对应一个名为“Exp #”的列,第 14 列对应一个名为“G (kcal/mol)”的列米不知道。我想将那些对 2 和 14 的引用替换为结构化引用或能够承受列位置重新排序的稳健引用。
Function BoltzmannEnergy(expNum As String) As Double
Application.Volatile
Worksheets("Raw Values").Activate
Dim data As Range, curCell As Range
Dim numRows As Integer, arrayCount As Integer, arraySize As Integer
Dim energies() As Double, curEnergy As Double, minEnergy As Double, RT As Double, BoltzTop As Double, BoltzBtm As Double
Dim expFound As Boolean
Const T As Double = 298
Const R As Double = 0.001985
RT = R * T
BoltzTop = 0
BoltzBtm = 0
expFound = False
arraySize = 5
minEnergy = 0
ReDim energies(0 To arraySize)
Set data = Range("RawValues")
arrayCount = 0
numRows = data.Rows.Count
For i = 1 To numRows
If data(i, 2).Value = expNum Then
If arrayCount = UBound(energies) - 1 Then
ReDim Preserve energies(0 To arrayCount + arraySize + 1)
End If
expFound = True
If data(i, 14).Value <> Empty Then
curEnergy = data(i, 14).Value
If curEnergy <> 0 Then
If curEnergy < minEnergy Then
minEnergy = curEnergy
End If
energies(arrayCount) = curEnergy
arrayCount = arrayCount + 1
End If
End If
ElseIf expFound = True Then
Exit For
End If
Next i
For i = 0 To arrayCount - 1
BoltzTop = BoltzTop + energies(i) * Exp(-(energies(i) - minEnergy) / RT)
BoltzBtm = BoltzBtm + Exp(-(energies(i) - minEnergy) / RT)
Next i
BoltzmannEnergy = BoltzTop / BoltzBtm
End Function
【问题讨论】:
-
您正在阅读的命名范围是否包括列标题?
-
不,它没有出现,但我不确定将其称为命名范围是否正确,它不是以相同的方式创建的。我不选择表格单元格,然后在excel中编辑框中的名称。相反,您为表本身命名(在表设计选项卡中),并为该表名使用结构化引用。
-
即使它的创建和维护方式不同,它仍然是一个命名范围:在公式>>名称管理器下检查,你会在那里看到它。
-
是的,我理解,它就在那里,但由于它的创建和使用方式,它似乎不包括标题。如果我在单元格中输入“RawValues”,它只会选择数据,而不是标题。
-
Range("RawValues").rows(1).offset(-1,0).address()将为您提供带有标题的范围:您可以使用 Derek 的方法来查找相关的列位置。
标签: excel excel-2010 vba