0

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

1 に答える 1