再質問 エクセルの表の列の最下行から指定数の・・
お世話になっております。
3日前にここでご回答いただいて解決したと思ったのですが、実シートで作業開始早々に不都合が出たので追加のHELPのお願いです。
各列の17行目以降に行方向にデータが入った表の下から30個のデータのMaxを求める関数のVBAを教わって早々に作業を開始したのですが、なぜか最下行を含まないVBAと、計算式の入った列では結果が「#VALUE!」となり、最下行を含むVBAの場合は、計算式の入った列の結果は「0」となってしまいます。
試しに別のシートで数値の列とその数値に定数をかけた列を作って試してみましたがうまく行きます。
また、対象のシートのセルの書式は数値になっています。
具体的な数式は
=IF(F127="","",F127*5) というような単純な計算式で日付が入るような特殊な計算はやっていません。
項目 数値A 計算値A 数値B 数値B 数値C
-------------------------------------------------------------------
平均 1.1197 #VALUE! 46.6133 #VALUE! 44.6767
σ 0.0008 #VALUE! 2.5940 #VALUE! 0.2128
最小 1.117 0.000 42.100 0.000 44.300
最大 1.121 0.000 51.100 0.000 45.100
<最下行を含む場合>
Function sfMax(Rng As Range, Optional bd) As Double
Dim LastRow As Long
Dim MyCol As Long
Dim tgRng As Range
Dim Border As Long
Dim StartRow As Long
Const DefBorder = 30
StartRow = 17 'データ開始行
If IsMissing(bd) Then
Border = DefBorder '省略された場合の閾値
Else
If ((bd = 0) Or (bd = "")) Then
Border = DefBorder '省略された場合の閾値
Else
Border = bd
End If
End If
MyCol = Rng.Column
LastRow = Cells(Rows.Count, MyCol).End(xlUp).Row
If LastRow > StartRow + Border - 1 Then
StartRow = LastRow - Border + 1
End If
Set tgRng = Range(Cells(StartRow, MyCol), Cells(LastRow, MyCol))
sfMax = WorksheetFunction.Max(tgRng)
End Function
<最下行を副含まない場合>
Function sfSTDEV(Rng As Range, Optional bd) As Double
Dim LastRow As Long
Dim MyCol As Long
Dim tgRng As Range
Dim Border As Long
Dim StartRow As Long
Const DefBorder = 30
StartRow = 17 'データ開始行
If IsMissing(bd) Then
Border = DefBorder '省略された場合の閾値
Else
If ((bd = 0) Or (bd = "")) Then
Border = DefBorder '省略された場合の閾値
Else
Border = bd
End If
End If
MyCol = Rng.Column
LastRow = Cells(Rows.Count, MyCol).End(xlUp).Row
If LastRow > StartRow + Border - 1 Then
LastRow = LastRow - 1
StartRow = LastRow - Border + 1
End If
Set tgRng = Range(Cells(StartRow, MyCol), Cells(LastRow, MyCol))
sfSTDEV = WorksheetFunction.StDev(tgRng)
End Function
お礼
こんばんわ ^^ Dm調のV7系だから、そのまま A7(6) の裏コードにテンションを加えたもの。。。 そうなんですね。 変にむずかしく考えてしまい、見逃していました。。。 よくわかりました。どうもありがとうございました。 ^^