- ベストアンサー
VBAに関する種々の質問
VBAに関していくつか質問させて下さい。 ・ファンクションプロシージャでは Function Fun(x) ・・・ End Function という形で関数を定義しますが、この関数の中でこれとは別の関数を定義して使いたい場合にはどうすれば良いのでしょうか? Function Fun(x) ・・・ Function Fun2(x) ・・・ End Function ・・・ End Function みたいに入れ子状にすれば良いのでしょうか? ・Range()を使って、 Range(A1)*Range(A2)+Range(B1)*Range(B2)+・・・ ということは出来ないのでしょうか?こういうのはCellsを使うしかないのでしょうか? ・Int()で整数であるということ定義出来ますが、浮動小数点であるdouble()というのが効かないのはなぜなのでしょうか? Dim as doubleだと効くのですが。 何卒よろしくお願い致します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#前回の質問などがあるならばその後始末などもきちんとしましょう http://oshiete1.goo.ne.jp/qa4507211.html 関数の入れ子は出来ませんが関数内にサブルーチンを作成することは可能です # 以下はプロシージャの例ですが関数でも同様に出来ます Sub Test1() dim n as integer, m as integer for m = 0 to 5 gosub TestSub next exit sub TestSub: n = n + 1 debug.Print n return End Sub ただしこの方法では Testプロシージャの中なので サブルーチンTestSubと変数を共有してしまいます Rangeについては 法則が決まっているなら Offsetでオブジェクト自身を移動することでループ処理が可能です Dim objR1 as Range, objR2 as Range dim x as double, n as integer Set objR1 = Range("A1") Set objR2 = Range("A2") x = 0 ' A1*A2 + B1*B2 + C1*C2 + D1*D2 + E1*E2 for n = 1 to 5 x = x + objR1.value * objR2.Value ' 1列右へ移動する Set objR1 = objR1.Offset( 0, 1 ) Set objR2 = objR2.Offset( 0, 1 ) next といった具合です
その他の回答 (5)
- hana-hana3
- ベストアンサー率31% (4940/15541)
>For, Nextでこれをしたいのですが、Rangeでは列に対して連番することは出来ないのでしょうか? For i=1 to 100 X1=X1+Range("A1").Offset(,i-1) * Range("A2").Offset(,i-1) X2=X2+Range("A1").Offset(,i-1) * Range("A1").Offset(1,i-1) X4=X4+Range(Cells(1,i)) * Range(Cells(2,i)) X5=X5+Cells(1,i) * Cells(2,i) Next A~Z列の範囲であればこんな方法も可能。 X3=X3+Range(Chr(64+i) & 1 ) * Range(Chr(64+i) & 2 ) Cells() で指定する場合は、数値座標で指定できるので位置指定がしやすいのです。 要は使い分けの問題なので、特定の方法に拘る必用はありません。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>この関数の中でこれとは別の関数を定義して使いたい場合 プロシージャーは一つのプログラムとして完結している必用があるので、プロシージャーの中にプロシージャーを書くことはできません。 別のプロシージャーを呼び出して使います。 Function Fun1(x) Fun1=Fun2(x)/2 End Function >Range(A1)*Range(A2)+Range(B1)*Range(B2)+ 意味がわかりませんが・・・。 X=Range("A1")*Range("A2")+Range("B1")*Range("B2")・・・ のように書きます。 >・Int()で整数であるということ定義出来ますが 定義するのではなく、INT関数では小数点を含む値から整数部だけの値に変換するのです。 >浮動小数点であるdouble()というのが効かないのはなぜなのでしょうか? VBAでは自由に型変換する機能は持っていません。 どのような使い方をしているのか解りませんが、そのような関数は無いからです。
- korin_
- ベストアンサー率69% (46/66)
#2です。 ・Range()の件は、質問の意図を読み違えていたようです。 失礼しました。
- korin_
- ベストアンサー率69% (46/66)
こんにちは。 ・ファンクションプロシージャ Function Fun(x) ・・・ End Function この関数の中で別の関数(Fun2)を使いたい場合は、 Call Fun2(x) で使用出来ます。 よって、関数の途中で定義する必要がありません。 ・Range() Range(A1)*Range(A2)+Range(B1)*Range(B2)+・・・ は、Range("A1", "指定したい最終セル")で良いと思います。 仮に Range("A1", "B2").Select とすると、A1、A2、B1、B2のセルが選択されます。 ・Int() Int()は、型の定義ではありません。小数部を切り捨てる関数です。 文字列を入れてもうまくいくのは、暗黙的に型変換されているだけです。 文字列型から数値型へ型変換する際には、Cint、Cdbl、Clng などの関数を使用してください。
- nda23
- ベストアンサー率54% (777/1415)
関数だけでなく、プロシージャは入れ子にできません。 以下のように別々に記述します。 Function Fun(x) ・・・ X = Fnc2(Y) End Function Function Fun2(x) ・・・ End Function Fnc2を外部で参照させたくない場合はPrivate属性にします。 Private Function Fnc2(X) Cells(Y,X)はRangeオブジェクトの一種です。 Range("A1").Value は Cells(1,1).Value と同じです。 Valueプロパティで値を参照するようにしましょう。 Int()という関数はありますが、double()という関数はありません。 Int()は型定義ではなく、関数です。Dim Z As Int は構文エラーです。 型変換関数にはCLng(Long型に変換)、CDbl(Double型に変換)、などが あります。
お礼
ありがとうございます。 X=Range("A1")*Range("A2")+Range("B1")*Range("B2")・・・ に関してなのですが、このような簡単な場合は良いのですが、難しい式の場合には For, Nextでこれをしたいのですが、Rangeでは列に対して連番することは出来ないのでしょうか? 何卒よろしくお願い致します。