[リストへもどる]
一括表示

投稿時間:2002/11/13(Wed) 16:59
投稿者名:かっちゃん
URL :
タイトル:
VBでのExcel関数の利用
初めまして、かっちゃんと申します。
VBでExcelのCorrel関数(二つの配列を元に相関係数を求める関数)を使う必要が生じ、
次の様にコーディングしたのですが、”WorksheetFunctionクラスのCorrelプロパティ
を取得できません”というエラーが出てしまい、うまく結果を得ることが出来ません。
解決策のヒントでも結構ですのでRESをお願いいたします。

Dim xlApp As Excel.Application
Set xlApp = New Excel.Application
REnum = CDbl(xlApp.WorksheetFunction.Correl([D1, D2, D3, D4, D5, D6, D7, D8,D9, D10, D11, D
12, D13, D14, D15, D16, D17, D18,D19, D20, D21, D22,D23, D24, D25, D26, D27, D28, D29, D30],
[D1S, D2S, D3S, D4S, D5S, D6S, D7S, D8S,D9S, D10S, D11S, D12S, D13S, D14S, D15S, D16S, D17S
, D18S, D19S, D20S, D21S, D22S,D23S, D24S, D25S, D26S, D27S, D28S, D29S, D30S]))
          
lblNewCorrel.Caption = REnum
Set xlApp = Nothing
  
[参考]
OS Version = WindowsMe    
Excel Version = Excel2002-SP1
VB Version = VisualBasic6.0-SP5

投稿時間:2002/11/13(Wed) 21:24
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: VBでのExcel関数の利用
Excel 上で上記動作のマクロを取ってそれを見て下さい。

投稿時間:2002/11/14(Thu) 13:19
投稿者名:かっちゃん
URL :
タイトル:
Re^2: VBでのExcel関数の利用
> Excel 上で上記動作のマクロを取ってそれを見て下さい。

返信有り難うございました、しかし当方何分初心者のため ”マクロを取る”の意味がよく分かりませ
ん。
具体的にどのようにすればよいのでしょうか?。VBEditor画面上にコーディングしその結果を見るとい
う意味でしょうか?、それともExcelのセルに実数を入力して同じCorrel関数を実行し、その結果を確認
すると意味でしょか?。

投稿時間:2002/11/14(Thu) 14:47
投稿者名:とろ
Eメール:
URL :
タイトル:
Re^3: VBでのExcel関数の利用
> 具体的にどのようにすればよいのでしょうか?。

マクロの記録はこのような感じです。

0. Excel を起動
1. ツール->マクロ->新しいマクロの記録
2. マクロの記録ダイアログ -> OK
3. 行いたいことを Excel 上で行います。
4. 記録終了ダイアログ -> ■
5. ツール->マクロ->Visual Basic Editor

標準モジュール内に 3. で行った処理のコードが
表示されます。

投稿時間:2002/11/14(Thu) 15:32
投稿者名:かっちゃん
URL :
タイトル:
Re^4: VBでのExcel関数の利用
とろさん返信有り難うございます。早速
教えていただいた方法でマクロを記録し
標準モジュールのコードを確認しました。

<結果は以下の通りです>
Sub Macro1()

Macro1 Macro
マクロ記録日 : 2002/11/14  ユーザー名 : NEC-PCuser

  Range("A35").Select
    ActiveCell.FormulaR1C1 = "=CORREL(R[-32]C:R[-2]C,R[-32]C[1]:R[-2]C[1])"
End Sub

<疑問>
この標準モジュールでは関数の引数として、二つのセルレンジ(範囲)が使われていますが、
引数の記述をこのようにしないと関数は使えないのでしょうか?。私が現在作成中のプログ
ラムでは、SQLでmdbファイルよりデーターを取り出し、各々を計算用の変数に代入して計算
をしたいと考えているため、どうしても引数は2組の数値列となり、結果最初の投稿の様な
コーディングになるわけなのですが。

投稿時間:2002/11/14(Thu) 15:21
投稿者名:A221
Eメール:
URL :
タイトル:
Re: VBでのExcel関数の利用
> 初めまして、かっちゃんと申します。
> VBでExcelのCorrel関数(二つの配列を元に相関係数を求める関数)を使う必要が生じ、
> 次の様にコーディングしたのですが、”WorksheetFunctionクラスのCorrelプロパティ
> を取得できません”というエラーが出てしまい、うまく結果を得ることが出来ません。
> 解決策のヒントでも結構ですのでRESをお願いいたします。

結構苦労したワリに駄プログラムになりましたが、結果を得られない原因は
配列を渡さねばならないことです。

Rangeオブジェクトで渡した場合、書式が標準では文字列で関数に渡されるため
下側のサブルーチンで数値にしています。
また、CorrelがDiv/0を返す場合もエラーで飛びました。

下記、Excel2002にて動作確認。
------------------------------------------------------------------
Option Explicit
Private xlApp As Excel.Application
Private xlbook As Workbook
Private xlSheet As Excel.Worksheet

Private Sub test1()

Dim renum As Double
Dim Xdim As Variant
Dim Ydim As Variant

Set xlApp = New Excel.Application
'ここで、xlsheetにシートオブジェクトを割り当ててください。

Call RangeToDim("d1:E30", Xdim)
Call RangeToDim("F1:G30", Ydim)

renum = xlApp.WorksheetFunction.Correl(Xdim, Ydim)

MsgBox renum

Set xlApp = Nothing

End Sub

Sub RangeToDim(ByVal X As String, ByRef Y As Variant)
Dim xlrange As Excel.Range
Dim tmpdim As Variant

Dim i As Long
Dim j As Long
Dim ColCount As Long

Set xlrange = xlSheet.Range(X)
tmpdim = xlrange.Formula
ColCount = xlrange.Count \ UBound(tmpdim)
For i = 1 To UBound(tmpdim)
    For j = 1 To ColCount
        tmpdim(i, j) = CLng(tmpdim(i, j))
    Next j
Next i
Y = tmpdim
End Sub

投稿時間:2002/11/14(Thu) 17:04
投稿者名:かっちゃん
URL :
タイトル:
Re^2: VBでのExcel関数の利用
A221さん返信有り難うございます。早速ですが2〜3解らない
ところがあるので質問させていただきます。
<1>
Set xlApp = New Excel.Application
'ここで、xlsheetにシートオブジェクトを割り当ててください。
        ↑
  具体的にはどうすればよいのでしょうか?

<2>
> Call RangeToDim("d1:E30", Xdim)
> Call RangeToDim("F1:G30", Ydim)
           ↑
    この部分は何を意味しているのでしょうか?
 
<3>
> Sub RangeToDim(ByVal X As String, ByRef Y As Variant)
> Dim xlrange As Excel.Range
> Dim tmpdim As Variant
>
> Dim i As Long
> Dim j As Long
> Dim ColCount As Long
>
> Set xlrange = xlSheet.Range(X)
> tmpdim = xlrange.Formula
> ColCount = xlrange.Count \ UBound(tmpdim)
> For i = 1 To UBound(tmpdim)
>     For j = 1 To ColCount
>         tmpdim(i, j) = CLng(tmpdim(i, j))
>     Next j
> Next i
> Y = tmpdim
> End Sub
Set xlrange = xlSheet.Range(X)のところでオブジェクト変数
またはWithブロック変数が設定されていませんというエラーメッセ
ージが出るのですが、どう対処すべきでしょうか。

<4>
上記のコードはデータを収納する配列を作成するSubプロシージャ
だと思うのですが、私が計算に用いたいデータをどうしたら、この
配列に組み込むことが出来るのでしょうか。

何分初心者のため、基本的な知識がかなり欠落しておりますので
その辺を踏まえ返信をいただけたら幸いです。

投稿時間:2002/11/14(Thu) 17:18
投稿者名:A221
Eメール:
URL :
タイトル:
Re^3: VBでのExcel関数の利用
> <1>
> Set xlApp = New Excel.Application
>  'ここで、xlsheetにシートオブジェクトを割り当ててください。
>         ↑
>   具体的にはどうすればよいのでしょうか?

Set XlBook = Xlapp.Workbook.Open("C:\Filename.Xls")
Set Xlsheet = XlBook.WorkSheets("Sheet1")

こんなカンジでSheetオブジェクトを与えてやります。

> <2>
> > Call RangeToDim("d1:E30", Xdim)
> > Call RangeToDim("F1:G30", Ydim)
>            ↑
>     この部分は何を意味しているのでしょうか?

えーと、RangeオブジェクトにRangeを与えています。
#テストした環境は"d1:E30"と"F1:G30"に数値が入っていましたので。
 
>  <3>
> > Sub RangeToDim(ByVal X As String, ByRef Y As Variant)
> > Dim xlrange As Excel.Range
> > Dim tmpdim As Variant
> >
> > Dim i As Long
> > Dim j As Long
> > Dim ColCount As Long
> >
> > Set xlrange = xlSheet.Range(X)
> > tmpdim = xlrange.Formula
> > ColCount = xlrange.Count \ UBound(tmpdim)
> > For i = 1 To UBound(tmpdim)
> >     For j = 1 To ColCount
> >         tmpdim(i, j) = CLng(tmpdim(i, j))
> >     Next j
> > Next i
> > Y = tmpdim
> > End Sub
>  Set xlrange = xlSheet.Range(X)のところでオブジェクト変数
> またはWithブロック変数が設定されていませんというエラーメッセ
> ージが出るのですが、どう対処すべきでしょうか。

xlSheetにSheetオブジェクトが割り当てられていないために発生したものです。

> <4>
> 上記のコードはデータを収納する配列を作成するSubプロシージャ
> だと思うのですが、私が計算に用いたいデータをどうしたら、この
> 配列に組み込むことが出来るのでしょうか。

えーと、別投稿を読んでみたのですが、SQLでMDBから読んでくるということですが、
Variant型の変数に入れることによりいけそうですね。

読んできたデータがどのようなものか分からないのですが、一例としては

読んできたデータが配列 Testに格納済みならば、

Dim X as Variant
X=Array(Test())

で、できます。

> 何分初心者のため、基本的な知識がかなり欠落しておりますので
> その辺を踏まえ返信をいただけたら幸いです。

投稿時間:2002/11/14(Thu) 18:50
投稿者名:かっちゃん
URL :
タイトル:
Re^4: VBでのExcel関数の利用
A221さん、早速の返信有り難うございます。
投稿の内容をまだ完全に理解するには至りませんが、
試行錯誤を繰り返しながら、ご指導いただきました
方法をトライしてみるつもりです。

ところで今回の2回の投稿を読ませていただき、新
たな疑問が生じましたので追加質問させていただき
ます。

<質問1>
> 読んできたデータが配列 Testに格納済みならば、
               ↑
格納するにはどうコーディングすればよいのでしょ
うか?。
Dim Test As string
Test=(1,2,3,4・・・・30)のようなコーディング
しか思い浮かばないのですが。

<質問2>
VB上でExcel関数を利用するには、関数オブジェクト
だけでなく、Workbook、Worksheet,更にはrange
オブジェクトの設定が不可欠なのでしょうか。

お忙しい中恐縮ですが返信をお願いいたしま
す。

投稿時間:2002/11/15(Fri) 08:55
投稿者名:A221
Eメール:
URL :
タイトル:
Re^5: VBでのExcel関数の利用
> <質問1>
> > 読んできたデータが配列 Testに格納済みならば、
>                 ↑
> 格納するにはどうコーディングすればよいのでしょ
> うか?。
> Dim Test As string
> Test=(1,2,3,4・・・・30)のようなコーディング
> しか思い浮かばないのですが。

Dim i As Long
Dim Tmp(N) As Long
Dim X As Variant

たとえばSQL発効でもらってきている場合、データが行単位なら
"SELECT 要因X1,要因X2,要因X3‥要因XN FROM Table1"
"SELECT 要因Y1,要因Y2,要因Y3‥要因YN FROM Table1"
で取得し、

For i=0 to N'要因の数
    Tmp(i)=Recordset(i)
Next i

データが列単位なら
"SELECT 要因 FROM Table1"

Do Until Recordset.EOF
    Tmp(i)=Recordset(i)
    i=i+1
    Recordset.MoveNext
Loop

で、Variant型の変数に
X=Tmp()とするかんじです。

> <質問2>
> VB上でExcel関数を利用するには、関数オブジェクト
> だけでなく、Workbook、Worksheet,更にはrange
> オブジェクトの設定が不可欠なのでしょうか。

決して不可欠ではありません。使いやすいように宣言してください。
#暗黙的な宣言はメモリリークの原因になります。
#そこに気をつければ宣言せずにxlAppからたどってもよいでしょう。

> お忙しい中恐縮ですが返信をお願いいたします。

投稿時間:2002/11/15(Fri) 14:40
投稿者名:かっちゃん
Eメール:shoubi@lion.zero.ad.jp
URL :
タイトル:
Re^5: VBでのExcel関数の利用
A221さん、返信有り難うございました。
早速返信内容をプリントの上、首っ引きで
取り組んでみたいと思います。本当に有り
難うございました。