この 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