プロが教えるわが家の防犯対策術!

1列内の任意の複数セルのデータをチェックする関数を
下記のように作成しましたが、
セルにKANSU(A1:A10)と式を入力するとエラーになります。
セルにKANSU("A1","A10")と入力すると正常に機能します。
しかし、後者の方法で入力したものを別のセルに複写すると
全く同じものが複写されてしまい、汎用性がありません。
例えば、右隣のセルに複写した場合は、KANSU(B1:B10)と
変わって欲しいのです。
EXCELの標準関数のように汎用性を持たせるには、どのように
記述すれば、下記の変数 Hajime, OwariにA1、A10といった
範囲データが入力されるのでしょうか。

     記


Function KANSU(Hajime, Owari As String) As String
Application.Volatile
  ・・・・・・ 

A 回答 (1件)

Rangeオブジェクトを使って解決します。


RangeオブジェクトのCellsコレクションには、指定した領域に含まれるセルが詰まっていますので、その内容をFor Each ~ Nextを使って取得してやればいいです。

サンプル作ってみました。
指定したセルの合計を求めます。
= vbSum(A1:B200)
ってな感じで使ってみてください。


Public Function vbSum(rngData As Range) As Variant
  Dim RNG   As Range
  Dim vntKotae As Variant
  For Each RNG In rngData.Cells
    vntKotae = vntKotae + Val(RNG.Value)
  Next RNG
  vbSum = vntKotae
End Function


蛇足ですが、上記の方法は、例えば
=vbSum(A:A)
のように指定した場合は、馬鹿正直にA1:A65536 の範囲を調べてくれます。
このような無駄極まりない処置を減らすために、下記のような処置を行ったりします。

Public Function vbSum(rngData As Range) As Variant
  Dim RNG   As Range
  Dim vntKotae As Variant
  Dim lngMaxRow As Long
  
  '領域の最下行を調べる
  lngMaxRow = rngData.Worksheet.UsedRange.Rows(0).Row _
  + rngData.Worksheet.UsedRange.Rows.Count
  
  For Each RNG In rngData.Cells
    '領域の最下行に達した場合、抜ける
    If RNG.Row > lngMaxRow Then
      Exit For
    End If
    
    '合計を計算
    vntKotae = vntKotae + Val(RNG.Value)
  Next RNG
  vbSum = vntKotae
End Function





不明点とかあれば、補足にてご質問ください。GW中であれば、同日中に回答可能だと思います。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございました。何分全くの素人で、Rangeを使うのかなと、色々本やHPを物色し試行錯誤し、教えてよGooに頼ることになりました。
よく考えながら、関数に組み込んでいこうと思います。また、つまずいたら援護を
お願いするかも知れませんが、この連休中には、1仕事完成するかなと一安心しています。ありがとうございました。

お礼日時:2002/05/04 20:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!