![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
エクセルのFunctionプロシージャを使って以下のユーザー定義関数を作りたいのですが上手くいきません。
アドバイスお願いしますm(__)m
やりたいこと
エクセルのA列とB列に複数の(たとえば10行の)数字が並んでいます。
各行ごとに 0.5×[A列の値]×[B列の値の二乗]
を算出し、その合計を求めたいです。
別の列(例えばC列)を使って上記の計算式を入力し、その合計を求めればよいのですが
どうしてもFunctionプロシージャを使って1セルだけを使って求めたいのです。
自分はVBA(エクセルマクロ)はあまり詳しくないのですが
色々ネットで調べた結果、以下のようなプロシージャを書いてみたのですが
上手く計算できません。
Function KE(element As Range)
Dim e As Range
Dim m() As Variant
Dim v() As Variant
Dim ans As Integer
i = 0
j = 0
For Each e In element
If i = j Then
m(i) = e.Value
i = i + 1
Else
m(j) = e.Value
j = j + 1
End If
Next e
k = i
i = 0
j = 0
While i < k + 1
ans = ans + 0.5 * m(i) * v(i) * v(i)
i = i + 1
Wend
KE = ans
End Function
もちろん、この形に拘りません
Functionプロシージャを使ってうまく計算できる方法ありましたらご教示お願いします。
No.1ベストアンサー
- 回答日時:
あまり難しく考えない基本形で、
セル範囲ループ版と二次元配列版、2種。
もしもオーバーフローで困るようなことあれば、あらためて相談で。
' ' =ffKE(A1:B10) ' QNo.8312529
Function ffKE(element As Range)
Dim v As Variant
Dim i As Long
For i = 1 To element.Rows.Count
v = v + element(i, 1) * element(i, 2) ^ 2
Next i
ffKE = 0.5 * v
End Function
' ' =ffKE9(A1:B10) ' QNo.8312529
Function ffKE9(element As Range)
Dim mtxV() As Variant
Dim v As Variant
Dim i As Long
mtxV() = element.Value
For i = 1 To UBound(mtxV)
v = v + mtxV(i, 1) * mtxV(i, 2) ^ 2
Next i
ffKE9 = 0.5 * v
End Function
![「エクセルVBAのFunctionプロシー」の回答画像1](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/9/558092_5497eb26598c8/M.jpg)
ありがとうございます!!
どちらもうまく行きました!
本当にありがとうございます。
二つ目の
MtxV() = element.value
の記述は、この記述で、MtxVという配列に
各セルの値が格納されるという認識でよろしいでしょうか?
もし、お時間ありましたらご教示いただけると幸いです。
No.3
- 回答日時:
#2です、変な沼から抜け出せた嬉しさに(言い訳)推敲不足で投稿してしまいました。
最初のFunctionのbufは使用しておらず、消し損ないのゴミです。申し訳ありません。
Function KE(element As Range)
KE = 0.5 * WorksheetFunction.SumProduct(element.Columns(1).Value, element.Columns(2).Value, element.Columns(2).Value)
End Function
No.2
- 回答日時:
VBAを使うまでもなく、配列数式や、SUMPRODUCTの本来の使用法を用いれば、セル一個で算出できます。
下記は、暇つぶしで実用的な意味はありません。
KE2という関数名にしたら、#REF!のエラーになって、はまってしまいました。数字を含むユーザー定義関数名は使えないのでしょうか?調べてみると、KEEEEEE2と8文字以上なら良いらしいです。ご参考まで。
Function KE(element As Range)
Dim buf As Variant
buf = element.Value
KE = 0.5 * WorksheetFunction.SumProduct(element.Columns(1).Value, element.Columns(2).Value, element.Columns(2).Value)
End Function
VBA中でSUMPRODUCTに基本形以外の事をさせるには、Evaluateを用いる必要があるそうです。
Function KEa(element As Range)
Dim buf As String
buf = "0.5*SumProduct(myformula1,myformula2^2)"
buf = Replace(buf, "myformula1", element.Columns(1).Address)
buf = Replace(buf, "myformula2", element.Columns(2).Address)
KEa = Application.Evaluate(buf)
End Function
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAのFunctionプロシー...
-
CPUの考え方を教えてください ...
-
XML、XSLTの適応エラー(IEから...
-
東芝のDynabookなのですがアン...
-
このエラー、何とかなりません...
-
XMLの要素の内容の中に要素
-
ルート要素ノードが2個ある場合?
-
動的な構造体配列の初期化
-
4バイトを10進数に変換する方法
-
昔Winnyってありましたけど、あ...
-
xmlのテキストにリンクを張りた...
-
TreeView の初期表示について
-
u_shortなどの省略した宣言につ...
-
SNMP リンクダウンとノードダ...
-
TreeViewの再表示のちらつきを...
-
テンプレートを開く
-
XMLで要素が記述された順番に意...
-
excelにてweb関数を使い、webデ...
-
XSLTで固定長データファイルを...
-
XMLから指定テキストのみを抜き...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
順不同・任意のタグ
-
PerlによるXMLからCSVへの変換...
-
Eclipse でBASIC認証するには
-
PHPでXMLデータ生成、スキーマ...
-
属性リスト宣言
-
XML の属性部分を JavaScript ...
-
あせんうぶり言語
-
CPUの考え方を教えてください ...
-
東芝のDynabookなのですがアン...
-
XMLで要素が記述された順番に意...
-
ルート要素ノードが2個ある場合?
-
VBSでxmlの値を書き換えたい
-
XML、XSLTの適応エラー(IEから...
-
SNMP リンクダウンとノードダ...
-
UTF-8でエンコーディングとはど...
-
昔Winnyってありましたけど、あ...
-
バッチファイルでテキストファ...
-
C#でTreeViewのCheckBoxのサイ...
-
同じタグ名の項目取得
-
XMLファイル内のデータ(値)を変...
おすすめ情報