Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


13539 / 13644 ツリー ←次へ | 前へ→

【4861】ユーザー関数についておしえてください。 Coo 03/4/11(金) 0:12 質問
【4874】Re:ユーザー関数についておしえてください。 こうちゃん 03/4/11(金) 16:24 回答
【4880】Re:ユーザー関数についておしえてください。 Coo 03/4/11(金) 23:31 質問
【4894】Re:ユーザー関数についておしえてください。 りん 03/4/13(日) 7:28 回答
【4942】Re:ユーザー関数についておしえてください。 Coo 03/4/14(月) 22:44 質問
【4943】かさねがさねすみません。 りん 03/4/14(月) 22:47 発言

【4861】ユーザー関数についておしえてください。
質問  Coo  - 03/4/11(金) 0:12 -

引用なし
パスワード
   こんばんわ。
現在VBAでマクロ作成している者です。
ユーザー関数を作成してみたいと考えています。
今、A列目に1行からN行まで任意のデータがB列目に1行からN行まで任意のデータがC列目の1行目にも任意のデータが入っています。
Function test(配列x,配列y,z) as double・・・(1)
このA列とB列のデータを配列指定で、C列のデータは単体で読み込んでその後のマクロに
データを使いたいのですが、どのように(1)式をどのように記述すればよいのでしょうか?

配列x x(1)=A1 x(2)=A2 ・・・x(N)=AN
配列y y(1)=B1 y(2)=B2 ・・・y(N)=BN
z    z=C1

どなたかご指導よろしくお願いいたします。

【4874】Re:ユーザー関数についておしえてください...
回答  こうちゃん E-MAIL  - 03/4/11(金) 16:24 -

引用なし
パスワード
   Cooさん、こんにちは

>ユーザー関数を作成してみたいと考えています。
>今、A列目に1行からN行まで任意のデータがB列目に1行からN行まで任意のデータがC列目の1行目にも任意のデータが入っています。
>Function test(配列x,配列y,z) as double・・・(1)
>このA列とB列のデータを配列指定で、C列のデータは単体で読み込んでその後のマクロに
>データを使いたいのですが、どのように(1)式をどのように記述すればよいのでしょうか?
>
>配列x x(1)=A1 x(2)=A2 ・・・x(N)=AN
>配列y y(1)=B1 y(2)=B2 ・・・y(N)=BN
>z    z=C1
>
>どなたかご指導よろしくお願いいたします。


配列を作るところはOKですか?
関数の呼び方はこんな感じですが、マクロからの呼び出しでいいんですよね。
#ワークシートで使うならチョッと違います。

標準モジュールに貼り付けてお試しください。(パクリ^^;)

Sub Main()
  Dim x(5) As Double
  Dim y(5) As Double
  Dim z As Integer
  Dim i As Integer
 
  For i = 1 To 5
    x(i) = i
    y(i) = i * 2
  Next
  z = 5
  
  MsgBox test(x(), y(), z)
End Sub

Function test(x() As Double, y() As Double, z As Integer) As Double
  Dim temp As Double
  Dim i As Long
  Dim j As Long
    
  For i = 1 To UBound(x())
    For j = 1 To UBound(y())
      temp = temp + x(i) * y(j)
    Next
  Next
  temp = temp * CDbl(z)
  test = temp
End Function

【4880】Re:ユーザー関数についておしえてください...
質問  Coo  - 03/4/11(金) 23:31 -

引用なし
パスワード
   こうちゃん さん こんばんわ。
回答ありがとうございます。
Functionのイメージはつかめたのですが質問が的確でなかったみたいです。
今回、ワークシートで使うことを考えています。
sheet1の
A列目に1行からn行まで任意のデータが
B列目に1行からn行まで任意のデータが
C列目の1行目にも任意のデータが入っています。
nは毎回変わります。

これらのデータをワークシート上で選択して(1)のファンクションで読み込んで例としてtest()マクロ内で使用したいのですが、読み込み方がわかりません。A/B列についてはn個のデータを以下のように配列にそれぞれ入れ、C1はzに入れたいのですが・・・
できれば読み込み方とその記述方法を教えていただけないでしょうか?
どうぞよろしくお願いいたします。

配列x x(1)=A1 x(2)=A2 ・・・x(n)=AN
配列y y(1)=B1 y(2)=B2 ・・・y(n)=BN
z    z=C1

Function test(x() as double,y() as double,z as Integer) ・・・(1)

For i=1 to n
  xx(0)=0#
  yy(0)=0#
  xx(i)=x(i)+xx(i-1)
  yy(i)=y(i)+yy(i-1)
Next
  Goukei=xx(n)+yy(n)+xx(n-2)/z
  test=Goukei
End Function

【4894】Re:ユーザー関数についておしえてください...
回答  りん E-MAIL  - 03/4/13(日) 7:28 -

引用なし
パスワード
   Coo さん、こうちゃん さん おはようございます。

>今回、ワークシートで使うことを考えています。
>sheet1の
>A列目に1行からn行まで任意のデータが
>B列目に1行からn行まで任意のデータが
>C列目の1行目にも任意のデータが入っています。
>nは毎回変わります。

引数がセル限定ですが。
xとyの範囲の大きさが違っている場合は、大きいほうに合わせて合計します。

Function test(x As Range, y As Range, z As Integer)
  Dim c As Range, xy As Long, II as Long
  xy = Application.WorksheetFunction.Max(x.Count, y.Count) '大きいほう
  ReDim xx(xy) As Double, yy(xy) As Double
  '
  xx(0) = 0: yy(0) = 0
  For II = 1 To xy
    xx(II) = x(II) + xx(II - 1)
    yy(II) = y(II) + yy(II - 1)
  Next
  'Result
  test = xx(xy) + yy(xy) + xx(xy - 2) / z
End Function

こんな感じです。
[セルD1]=test(A1:A6,B1:B6,C1) のようにして使ってください。
エラーチェックはつけていないので、文字列をはさんだりするとエラーになります。

【4942】Re:ユーザー関数についておしえてください...
質問  Coo  - 03/4/14(月) 22:44 -

引用なし
パスワード
   りん さん こうちゃん さん返答ありがとうございます。
お二人のおかげでよく理解できました!!
感謝しています。
ところで幾つか質問したいことがあります。
配列の値を確認したくDebug.Print x(10), y(10)として、ユーザー関数を実行したところ、全ての値をセルから選択したところでイミディエイトウインドウに値が2回返り、更にOKで計算を終わらせるとイミディエイトウインドウに値が3回返ります。これはどうして起こるのでしょうか?
Function test(x As Range, y As Range, z As Integer)
Debug.Print x(10), y(10)
Dim c As Range, xy As Long, II As Long
また、cはどこに影響を及ぼしているのでしょうか?
質問につぐ質問で申し訳ありませんがよろしければ教えていただけないでしょうか?

【4943】かさねがさねすみません。
発言  りん E-MAIL  - 03/4/14(月) 22:47 -

引用なし
パスワード
   Coo さん、こんばんわ。

>また、cはどこに影響を及ぼしているのでしょうか?

 c As Range は試しで作った関数の For each 〜 Nextの名残であって、
ただのはずし忘れです。
まぎらわしくてすみません。

13539 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free