【问题标题】:Implement Structured Reference in VBA Function在 VBA 函数中实现结构化引用
【发布时间】: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


【解决方案1】:

如果您知道标题名称不会改变,您可以将这些数字替换为两个变量,每个变量都引用一个 find range.columns。

类似:

Dim intColumn1, intColumn2 As Integer
Dim rngTemp As Range
'assuming your header row is row 1
Set rngTemp = Worksheets("Raw Values").Rows(1).Find(what:="Header_1_value")
'check if you actually found a cell
If Not rngTemp Is Nothing Then
    intColumn1 = rngTemp.Column
End If

'assuming your header row is row 1
Set rngTemp = Worksheets("Raw Values").Rows(1).Find(what:="Header_2_value")
'check if you actually found a cell
If Not rngTemp Is Nothing Then
    intColumn2 = rngTemp.Column
End If

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    相关资源
    最近更新 更多