- ベストアンサー
VBA(エクセル)のプラグラムについて
こんにちわ。 昨日からVBA(エクセル)を始めたのですが、 わからないことが多いので教えてください。 値1 値2 120 0 256 0 235 1 256 1 267 1 356 0 345 0 785 1 678 1 789 0 上のようにエクセルデータがあるのですが、 (値1)は任意の数 (値2)の方は、0か1を表示しています。 その連続した1の部分の(値1)の平均値を求めたいのです。 上の例でいうと初めに1が連続して出ているのは3つです。 その隣の数の平均なので答えは252.6666…となります。 次に1が連続して出ているのは2つです。 その隣の数の平均なので答えは731.5です。 ちなみにデータの数は(値1)(値2)とも10000個ぐらいの数値です。 (特に速さにはこだわってないので少し遅くても良いです) 上記のような質問なのですが、何分始めたばかりでさっぱり分りません。どなたか教えてください。よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
以下でどうでしょうか? A列にデータ、B列にフラグ(0/1)、C列に平均 Sub samp1() Dim ct As Integer Dim tmp As Double Dim i As Long ct = 0 tmp = 0 For i = 1 To 10000 If Cells(i, 2) <> "" Then If Cells(i, 2) = 1 And Cells(i + 1, 2) = 1 Then ct = ct + 1 tmp = tmp + Cells(i, 1) ElseIf Cells(i, 2) = 1 Then ct = ct + 1 tmp = tmp + Cells(i, 1) Cells(i, 3) = tmp / ct ct = 0 tmp = 0 End If End If Next End Sub とか Sub samp2() Dim ct As Integer Dim tmp As Double Dim i As Long ct = 0 tmp = 0 For i = 1 To 10000 If Cells(i, 2) <> "" Then If Cells(i, 2) = 1 Then ct = ct + 1 tmp = tmp + Cells(i, 1) ElseIf Cells(i, 2) = 0 And ct > 0 Then Cells(i - 1, 3) = tmp / ct ct = 0 tmp = 0 End If End If Next End Sub
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
#2でもあります。 VBAの勉強の質問らしいが、この程度までは、関数でやっと(作業列を使って)できるという例。 ということは、VBAでセルに式を埋め込むことができるので そちらからの回答もできそうということ。将来勉強されたらわかります。#2で言った、課題解法のロジックのヴァリエーションの1つであるわけです。 ーーー 関数で考えて見ました。 例データA1:D18 ただし元データはA、B列で、C列は作業列、D列が答えです 掲載スペースの関係上、C列、D列は先回りして掲載しました。 A列 B列 C列 D列 第1行目 空白行 1 0 0 2 1 1 3 1 2 4 1 3 3 1 0 0 2 0 0 3 0 0 4 1 1 1 1 2 2.5 2 0 0 3 0 0 1 1 1 2 1 2 1 1 3 2 1 4 1.5 1 0 0 2 1 1 2 ーー C列C2の式は =IF(B2=0,0,C1+1) 18行(最終行)まで式を複写。 ーー D2の式 =IF(AND(C2<>0,C3=0),AVERAGE(OFFSET(A2,-C1,0,C2)),"") 18行(最終行)まで式を複写。 結果 上記列の数字が出た行の数字。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 質問がよく分からないのですが、 値1 値2 120 0 256 0 235 1 256 0 267 1 356 0 345 0 785 1 678 0 789 0 というデータなら、平均値は出さなくてよいということなのですか? なお、「丸投げ」自体は、削除されてはいないのですが、質問しっぱなしっていうのか、そういうのは解答にはたどり着かないことが多い、ということだと思うのです。私なんかも、ここで勉強しているようなものですが、ただ、ソフトやプログラム自体の問題よりも、相手の言外の言--行間の行を読むということに他ならないのです。相手の人がどういう中から、そのような質問を導き出しているか、ということですね。私のスキルはぜんぜん上がっていないどころか落ちていますが、質問を読む力が上がっているように思います。(一応、私は、経験者にさせていただきます) これは、もしかしたら、株価の変動を見るためなのかなぁ、なんて思っています。 ちなみに、目的のあって何かを勉強する人は、なかなか、その目標までにはたどり着かない、ということでもあるのですね。挫折の可能性が高いのです。高い目的を持たないことは、ある意味では、上達の道かもしれません。 >昨日からVBA(エクセル)を始めたのですが、わからないことが多いので教えてください。 本当は、もう少し、粘ってみることですね。ライブドアのあの堀江さんが始めたときでも、何ヶ月かがんばっていたのです。ある意味で、私たち回答者は、そういう伸びる芽を摘んでいるようなものです。(年齢的なことは関係ないです)こういうことに、がんばれる人には、いろんな応援しますが、そうでない人には、さっさと答えを教えてしまいます。人生は、すべて選択ですからね、ダメだと思ったら、すぐに方向転換することも大事かもしれません。(^^; 「1」が連続したときだけ平均を出すというコードのレベルは、別のプログラムの経験のない人は、良くて丸1年以上のレベルです。悪くすれば、3年経ったレベルでも、できない人もいます。 がんばってくださいね。
- imogasi
- ベストアンサー率27% (4737/17069)
課題が先にありき、なのでしょうが >昨日からVBA(エクセル)を始めたのですが、で質問しても、回答は 理解できない恐れが多い。課題の丸投げになり、このコーナーでは遠慮してもらうことになっているはず。 ーー 短い処理単位の、プログラムには A.ロジック(処理の筋道) B.プログラムコードにロジックを実現 の2つあり、Aは経験をしないと、本を見てもわからないと思う。 Bの部品を知っているかどうかでAの考えに影響する場合も多い。 Aは人により色々で、巧拙の差が出る場合もある。Bも人により色々 になっている場合が多い。 ーー Aについての1例。 考えることは データ最終行を知るコード(仮にd行とする)(課題) 繰り返しはVBAでどうするか(課題) 1からd行まで以下繰り返し (ならばはIF文で判別、t=t+xのような常套手段 課題) (あとは変数に代入するやり方 課題、ともいえないものだが) B列のについて、前のコードの1,0を変数に保持する 次ぎの行で今のコードと直前のコードと比較し 違っていて0なら、連の終りなので、合計変数を件数変数で割り平均とする。 そして合計と件数の変数を0にする 同じか初めてコードで1なら、合計変数にその行の計数を加えるのと件数の変数に1を加える。 この最終行まで繰り返し。 最終行になったら、直前の「1の連」の平均を出す。 ーー >値1 値2 は列A、列Bと書くものと思う。
お礼
早速のご回答ありがとうございます。 ご指摘の通り当方には未熟すぎてとても分かるような内容では ありませんでした。 少しずつがんばっていきます。
お礼
お早い回答ありがとうございます。 当方が思っておりました通りに動くプログラムになっております。 よくよくプログラムを見てみると、二日目の当方が理解できるプログラムではありませんでした・・・ 回答2の方のおっしゃるとおりもう少し経験を積んでからプログラムは組むべきなのだとわかりました。 これをきっかけにがんばってプログラムが組めるようになりたいです。 今回は、ありがとうございました。