• ベストアンサー

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個ぐらいの数値です。 (特に速さにはこだわってないので少し遅くても良いです) 上記のような質問なのですが、何分始めたばかりでさっぱり分りません。どなたか教えてください。よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

以下でどうでしょうか? 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

yoshio4401
質問者

お礼

お早い回答ありがとうございます。 当方が思っておりました通りに動くプログラムになっております。 よくよくプログラムを見てみると、二日目の当方が理解できるプログラムではありませんでした・・・ 回答2の方のおっしゃるとおりもう少し経験を積んでからプログラムは組むべきなのだとわかりました。 これをきっかけにがんばってプログラムが組めるようになりたいです。 今回は、ありがとうございました。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

#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)
回答No.3

こんにちは。 質問がよく分からないのですが、 値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/17068)
回答No.2

課題が先にありき、なのでしょうが >昨日から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と書くものと思う。

yoshio4401
質問者

お礼

早速のご回答ありがとうございます。 ご指摘の通り当方には未熟すぎてとても分かるような内容では ありませんでした。 少しずつがんばっていきます。

関連するQ&A

  • Excel VBA マクロ 繰り返し処理について

    初めて、ご質問させて頂きます。excel2003で、VBAによる連続繰り返し処理をしたいのですが、プログラムの知識が全くありませんので、どなたかご教授頂けませんでしょうか。 VBAによる連続繰り返し処理の内容は、excelの1つの列に上から順番に、IPアドレスを4つずつ同じ値で、入力したいのです。 例:10.30.118.1、10.30.118.1、10.30.118.1、10.30.118.1、10.30.118.2、10.30.118.2、10.30.118.2、10.30.118.2、10.30.118.3、10.30.118.3、10.30.118.3、10.30.118.3、、、 上記の例の様に、1つの列上で上のセルから順番に、4つずつ同じ値を順番に、4000行程度入力したいのですが、手で入力するのは、大変時間がかかる為、自動で入力させたいと思っています。 恐らくfor文を使うのでしょうが、その構文がわかりません。 初心者で大変申し訳ないのですが、どなたかご教授下さい。

  • EXCEL VBA

    はじめまして。ExcelのVBAについて質問させて頂きます。 - A-B-C            1 0 あ        2 0 い        3 1 う           4 1 え           5 1 お   上記のようなデータに対して、A列の値が1の場合、B列の値をC列へコピー して、B列をゼロにする。A列の値が0の場合は、そのまま。 (結果) - A-B-C            1 0 あ        2 0 い        3 1 0  う           4 1 0 え           5 1 0 お   といったようにVBAを作成したいのですが、なにぶん初心者なもので、 どのように記述すればよいのかわかりません。 よろしくお願いいたします。

  • 大きなデータのVBAを使った処理方法をおしえてください

    1MB以上のCSVファイル数値測定データ(65000個以上)があります。ある程度狭い範囲の値の数値が不規則に連続していてグラフにすると横に波のようにいくつもの山と谷が連続するかんじです。この数値郡に下限値を自由に変えられるようして設定し下限ラインから上に出た山毎の最大値を拾い出す。というものをVBAで作りたいのですが、どうすればうまく作れるでしょうか? また、データが大きいとエクセルではなくVB単体で作るべきなのでしょうか?

  • EXCELのグラフの値とは異なる値をグラフに入れたい

    お世話になります。 ただいまEXCELでデータの作成をしているのですが、 グラフの値とは異なる数値をグラフに入れたいと考えています。 グラフの設定で手入力してもいいのですが、データ数も多く、EXCELのセルにある値を使うので、VBAなどを使って何とかしたいと考えています。 VBAについては初心者なのですが、助けてください。 どうぞよろしくお願いします。

  • EXCEL2010のAVERAGE関数について

    こんばんは。 EXCEL2010ですが、同じデーターを使ってワークシートでAVERAGE関数を使って求めた平均値とVBAでApplication.Averageで求めた平均値が違います。 扱っているデーターは少数点以下桁数が20桁数の数値です。 小数点第8位まではあっているのですが、その後は違います。 例 0.00000138786111098443 0.00000137878257235606 0.00000138192909756498 普通にセルにAVERAGE関数を使って平均値を出すと 0.00000138285759363516 VBAでApplication.Avarageを使って平均値を出すと 0.00000138489510427471 (変数のデーター型はDoubleを使用) これは誤差範囲になるのでしょうか? またそれが誤差であれば、どちらが真の値になるのでしょうか? ご教授頂きたくよろしくお願いします。 <追伸> なぜVBAで平均値を求めるかというと、 平均する数の値が固定ではなくCASE毎に変動するVBAを作っています。 上記のVBAを完成し答え合わせした所、違う結果になってしまいました。 いろいろ変数のデータ型を変えたりしたのですが、解決しませんでした。

  • エクセル上のVBA

    当方、VBAまるっきり初心者です(触りはじめて3日くらい)。 エクセルはある程度理解しているつもりですが… バージョンはエクセル2000です。 他シートのセルのひとつに入力すれば、 別シートのセルがそれを参照したうえで 値として表示出来るようにならないでしょうか。  今のところ、以下のような状況です。 step01 sheet1のセルA1に任意の数値(整数限定です)を入力。 step02 sheet2のセルA1に、sheet1のセルA1の数値を用いて     MOD関数で余りを出す。 step03 sheet2のセルB2に以下のVBAによって     step02の余りを値として表示。      Private Sub Worksheet_Change(ByVal Target As Range)        Range("b2").Value = Range("a1")      End Sub  これだとsheet1の数字を変えても、 sheetの切替後sheet2のセルB2に 表示される値が変わってくれません。  最初の入力(step01の入力)をおこなえば sheet2のセルB2まで値が変わってくれるような方法を 教えていただけないでしょうか。  拙い説明で申し訳ありませんが、よろしくお願いします。

  • エクセルシートの塗りつぶしをVBAでやるには?

    エクセルのセル塗りつぶしについて(VBA) いつもお世話になっています。 エクセルシートで、任意のセルに数値を入力したとき、入力したセルから右側に向けて、その数値分、自動で塗りつぶすようにしたいのですが、どのようにすれば良いのでしょうか? 色は何でも構いません。 画像添付します。

  • excel VBAについて質問します

    excel VBAについて質問します A列のセルには単なる数値や「44+30」のようなデータが入っているものがある。 ' + の記号があったら、セルの先頭に = を追加して計算させて答えを表示しなさい。 'マクロ実行後、A列には、数値だけが表示されることとする。 マクロ実行前   ⇒  マクロ実行後 22   --------------- 22 44+30 --------------- 77 35 -------------------- 35 22+11 --------------- 33 こういった感じにしたいんですがなかなか上手く行きません。

  • 初心者です!エクセルVBAで

    初心者です!エクセルVBAでアクセスのデーターを修正したいのですが。 初心者です!エクセルVBAでアクセスのデーターを修正したいのですが。 データーがテキスト型を空にするには rs!Field1 = "" でいけるのですが 数値型だとエラーが出てしまいます。 フィールドを空文字にしたいのですが・・・

  • エクセルVBAの記述について

    OSはWin98、エクセル2000です。 次の処理をVBAで処理したいのですがうまく作動しま せん。 ご教授願います。 セルA1から下に向かって1から20までランダムに数 値が入ってます。 同じ数値は無く、数値も3行(セルA3)で終わる場合 も有ります。 この場合セルC1から下に向かって順にA1&A2、A 1&A3と記述したいのですが・・・ 例) A1に5、A2に7、A3に15、A4に10でしたら C1に57、C2に515、C3に510、C4に715 C5に710、以下・・・と記述 よろしくお願いします。m(_ _)m

専門家に質問してみよう