Excel VBA質問箱 IV

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

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


2164 / 13645 ツリー ←次へ | 前へ→

【69584】今、VBAで感度などを算出したいと思っています。 ここ。 11/8/4(木) 16:01 質問[未読]
【69586】Re:今、VBAで感度などを算出したいと思... momo 11/8/4(木) 19:16 発言[未読]
【69595】Re:今、VBAで感度などを算出したいと思... ここ。 11/8/5(金) 12:40 お礼[未読]

【69584】今、VBAで感度などを算出したいと思っ...
質問  ここ。  - 11/8/4(木) 16:01 -

引用なし
パスワード
   はじめまして。

今、VBAで感度、特異度、1−特異度を算出し、最終的にはROC曲線を作成したいと思っています。

   A   B
1  2.35  a
2  19.81 b
3  5.63  a
・・・
このようなセルが、120行まで続いています。

aを周期ありとして、122行から、

122 0.01    周期あり 周期なし   
123 以上     ○    △
124 未満     □    ■
125 合計      ☆    ◎
126 感度     ▲
127 特異度    ★
128 1−特異度  ●
129
130 0.02    周期あり 周期なし
131 以上     
132 未満
133 合計
134 感度
135 特異度
136 1-特異度
・・・
というように、縦に表示させていきたいと考えています。

まず、ためしに、0.01における感度と特異度、1−特異度出力されるようにしてみました。

インターネットや本で探りながら、下記のようにやってみました。

Sub test1()

k = 0.01
i = 1
myshift = 121
Cells(myshift + (i * 8 - 7), 1) = k
Cells(myshift + (i * 8 - 7), 2) = "周期あり"
Cells(myshift + (i * 8 - 7), 3) = "周期なし"
Cells(myshift + (i * 8 - 7) + 1, 1) = "以上"
Cells(myshift + (i * 8 - 7) + 2, 1) = "未満"
Cells(myshift + (i * 8 - 7) + 3, 1) = "合計"
Cells(myshift + (i * 8 - 7) + 4, 1) = "感度"
Cells(myshift + (i * 8 - 7) + 5, 1) = "特異度"
Cells(myshift + (i * 8 - 7) + 6, 1) = "1−特異度"
Range(Cells(myshift + (i * 8 - 7) + 1, 2)).Value = Evaluate("SUMPRODUCT(((A1:A120)>=k)*((B1:B120)=a))")
Range(Cells(myshift + (i * 8 - 7) + 1, 3)).Value = Evaluate("SUMPRODUCT(((A1:A120)>=k)*((B1:B120)=b))")
Range(Cells(myshift + (i * 8 - 7) + 2, 2)).Value = Evaluate("SUMPRODUCT(((A1:A120)<k)*((B1:B120)=a))")
Range(Cells(myshift + (i * 8 - 7) + 2, 3)).Value = Evaluate("SUMPRODUCT(((A1:A120)<k)*((B1:B120)=b))")

End Sub

しかし、「エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。」が出てしまいました。

SUMPRODUCTを使わないで、COUNTIFなども使ってみましたが、どうにも動きません。

VBA初心者なのですが、勉強したいと思い、いろいろと挑戦しているところです。

もしよかったら、ご回答いただけるとうれしいです。

【69586】Re:今、VBAで感度などを算出したいと...
発言  momo  - 11/8/4(木) 19:16 -

引用なし
パスワード
   ▼ここ。 さん:

間違いは2種類ですかね。

Range(Cells( ))という書き方がそのエラーですね。
単一セルなのにその書き方はしません。
というかそれまでCellsだけで書いているのになぜRangeが出たのでしょう?
>Range(Cells(myshift + (i * 8 - 7) + 1, 3)).Value = ・・・
Cells(myshift + (i * 8 - 7) + 1, 3).Value = ・・・
に書き換えるとそのエラーは出なくなると思いますが、

あとはEvaluateの数式の中にk、a、bというのがありますが
これは変数ではないのでしょうか?
変数を文字として書いても中身はkという文字なので計算出来ないですね。

>Evaluate("SUMPRODUCT(((A1:A120)>=k)*((B1:B120)=a))")
Evaluate("SUMPRODUCT(((A1:A120)>=" & k & ")*((B1:B120)=" & a & "))")
のようにしないと。

【69595】Re:今、VBAで感度などを算出したいと...
お礼  ここ。  - 11/8/5(金) 12:40 -

引用なし
パスワード
   ▼momo さん:
ご返答ありがとうございました。
いろいろRangeとCellsの使い方、SUMPRODUCTの使い方がだんだんわからなくなってしまい、この形で行っていました。
なるほど、Cellsを用いれば、Rangeはいらないのですね。
勉強になります。

aとbは文字としての扱いですが、kは変数としての扱いです。
この方法でやってみたいと思います。ありがとうございました。

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