tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル引数の数を変動できる関数を作る方法について教えてください
記事No11870
投稿日: 2008/03/24(Mon) 15:36
投稿者のぶ
Excelのマクロでの質問です。
Excelのsum関数のように、セルの位置を複数指定し、解を返す関数を作りたいのですが、
sum関数のように、最大30までですが任意の数のセル位置を指定する事ができる関数を作るには
どのようにしたらよいのかご教授下さい。
引数を30個用意すればもしかしたら出来なくはないですが、不要な引数をその関数を使う毎に
与えないといけないとおもうので、そのあたりがよく分からないです。
Sum関数のように、引数が3個でも10個でも自由に指定する関数は作れますでしょうか?

F1 ←セルの位置
F1=1
F2=2
F3=3
=sum(F1,F2,F3) 解   6
=sum(F1,F2)  解   3    
=sum(F1:F2,F3) 解   6
このように同じ関数でも引数の数が異なっても解をだしてくれる様にしたいです。
ちなみに、引数に渡すのは、セルの位置です。

以上 よろしくお願いします。

[ツリー表示へ]
タイトルRe: 引数の数を変動できる関数を作る方法について教えてください
記事No11871
投稿日: 2008/03/24(Mon) 17:29
投稿者K.J.K.
ParamArrayについて調べてみてください。

[ツリー表示へ]
タイトルRe: 引数の数を変動できる関数を作る方法について教えてください
記事No11875
投稿日: 2008/03/24(Mon) 22:39
投稿者戸豚
以下のような書き方でいけると思います。
そのままではSumマクロと同じにはならないので使用目的に会わせて工夫してください。

Function getSumCells(Rows As Long,Cols As Long,Cnts As Long)
    ' Rows:足し算始めるセルの行位置
    ' Cols:足し算始めるセルの桁位置
    ' Cnts:セルの数
    Dim X As Long
    getSumCells=0
    For X=0 To Cnts - 1
        getSumCells = getSumCells + Cells(Rows,Cols + X)
    Next
End Function

間抜けな方法として Cells(1,1)にマクロを書き込むというのも…

Sub setFormuraSumMacro(Rows As Long, Cols As Long, Cnts As Long)
   Dim s As String
   s = "=Sum( R" & Rows & "C" & Cols & ":R" & Rows & "C" & Cols + Cnts - 1 & ")"
   Cells(1,1).FormulaR1C1 = s
End Sub

[ツリー表示へ]
タイトルRe: 引数の数を変動できる関数を作る方法について教えてください
記事No11877
投稿日: 2008/03/25(Tue) 09:46
投稿者のぶ
K.J.K 様  戸豚 様 早速のレスありがとうございました

戸豚様わざわざ例文書いていただきありがとうございます。
ただ、私のイメージだとSum文のように sum(F1,F3,F6,A4) など、任意のセル位置を
カンマで区切る引数をイメージしています。
実際に、どこからどこまでの 範囲では一応再現できています。
========================================
Function hmsum(p As Object)
    nen = ActiveSheet.Name
    a = p.Address
    x1 = Sheets(nen).Range(a).Column
    xn = x1 + Sheets(nen).Range(a).Columns.Count - 1
    y1 = Sheets(nen).Range(a).Row
    yn = y1 + Sheets(nen).Range(a).Rows.Count - 1
    min1 = 0
    min2 = 0
    For x = x1 To xn                      'x
        For y = y1 To yn                  'y
            min1 = Val(Sheets(nen).Cells(y, x))
            min2 = Val(min1) + min2
        Next y
    Next x
    hmsum = min2
End Function

excelのセルに =hmsum(C3:C11) みたいに指定すれば合計します。
========================================

K.J.K 様のParamArray を調べてみました。
マイクロソフトのHPからそれらしい例文があり、動かしてみました。
====================================
    Sub Test()
        x = myfun(1)
        MsgBox x
    End Sub

    Function myfun(y As Integer, ParamArray myarr() As Variant) _
        As Integer
        myfun = otherfun(y, myarr)
    End Function

  Function otherfun(y As Integer, ByVal myarr As Variant) As Integer

        otherfun = y * 2
    End Function
=======================================
動き自体は、予想してたとおりできました。
セルの中にmyfun(1,F1,F2,F3)の様に直接式を入れることで再現できました^^


お二人とも初心者の質問に回答していただきありがとうございました。

[ツリー表示へ]
タイトルRe^2: 引数の数を変動できる関数を作る方法について教えてください
記事No11883
投稿日: 2008/03/25(Tue) 18:11
投稿者戸豚
少々的外れでしたか。

Optionalキーワードでヘルプを見てみてください。
たぶん、やりたいことができるはずです。

[ツリー表示へ]