2011-06-06 78 views
1

我试图创建一个不同的用户可以将有不同数量的行针对每个用户的一列执行以下功能的功能的,但我可以不知道如何考虑行数的变化。在列执行VBA函数具有未知数量的行

Function MKT(ByVal Temperatures As Variant) As Double 
Dim Sum As Double 
Dim TemperatureCount As Long 
Dim GasConst As Double 
Dim DeltaH As Double 
Dim Conv As Double 
Conv = 273.15 
GasConst = 8.314472 
DeltaH = 10 * GasConst 
Sum = 0 
For TemperatureCount = Temperatures.Cells.Count To 1 Step -1 
     Sum = Sum + Exp(-DeltaH/(GasConst * (Temperatures(TemperatureCount) + Conv))) 
     Next TemperatureCount 
     MKT = (DeltaH/GasConst)/(-Log(Sum/Temperatures.Cells.Count)) - Conv 
End Function 

的功能的工作原理,如果我所述小区设置值= MKT(A1:A32557),但如果我做= MKT(A:A)。

我认为这可以帮助,但我不知道如何实现它:

Dim lastRow As Long 
lastRow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row 

此外,有可能通过1行偏移值要占一个头?

+0

UsedRange并不总是最新的;依靠单元格值更安全。理想情况下,你应该有一个列将包含函数应该工作的每一行的值,并且只包含这些行的值;如果不是,只要您还没有在该表下填充单元格,则End(xlUp)上的一些变体应该可以工作。 – 2011-06-06 18:23:16

回答

3
lastRowColA = Range("A65536").End(xlUp).Row 
For Each cell In Range("a2:a" & lastRowColA) 
'MsgBox cell 
Next cell 
+0

愚蠢的问题,但我在哪里把那个或如何整合到我的代码? – mmcnama4 2011-06-06 18:42:59

3

或避免硬编码行限制使用

with sheet1 
    lastRowColA = .Range("A" & .Rows.Count).End(xlUp).row 
    Set rng = .range("A2:A" & lastRowColA) 
end with 
1

您可以通过所使用的区域

Dim SubRange as Range 
Set SubRange=Intersect(Temperatures,Temperatures.Parent.UsedRange) 

或尼克和osknows相交创建温度的一个子集有发布你可以使用.End(xlUp),但是请注意,这忽略了隐藏单元格

Function SubRange(theRange As Range) As Range 
Dim LastRow As Long 
LastRow = theRange.Parent.Cells(theRange.Parent.Rows.Count, theRange.Column).End(xlUp).Row 
Set SubRange = theRange.Resize(LastRow - theRange.Row + 1) 
End Function