• ベストアンサー

下記のようにA列にランダムで出現する数字に対して、B列でその出現間隔を

下記のようにA列にランダムで出現する数字に対して、B列でその出現間隔を計算する関数ってありますでしょうか?A列の数字が何千行となるため、単純な減算?等ではなく関数でやりたいのですが・・・。 (例) A列 B列  0  0  3  0  0  0  7  4  0  0 10  3  0  0  色々検討しているのですが、うまく行かずに悩んでいます。誰か教えて頂けないでしょうか?。

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

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.5

質問の意図が良く判りませんが、要するに、A列に0以外の数値がある時、その直前(上方向)の数値がある行から何行離れているかを表示できれば良いのででしょうか? #7行目の前は3行目に0以外の数値があるので、4と表示 それでしたら、B2に↓の式を入れ、下方向にコピーしてください。B1ではなく、B2です。 =IF(A2=0,"",IF(SUMPRODUCT(MAX(ROW(A$1:A1)*(A$1:A1<>0)))=0,"",ROW()-SUMPRODUCT(MAX(ROW(A$1:A1)*(A$1:A1<>0)))))

tasuuy
質問者

お礼

うまく行きました!助かりました!ありがとうございました♪。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

  • layy
  • ベストアンサー率23% (292/1222)
回答No.7

0の判定とカウントの数式がわかり、使い始めた方でも解けそうな話で、策もいろいろあります。難しい事でもないので、これならどう?って競うのも回答としておかしいように思います。 いろいろ試して問題となっていた点を引き出すべきです。ここの回答を使い結果が出てよかったー、で終わるような展開にしないで下さい。何がどううまくいかなかったかの問題に対して答えは出てますか。こちらを質問提示すべきです。 何を悩んでいたのか不思議です。 もし、何千行もあって数式いれるのが大変=関数にしたいという見解なら、そこも数式と関数の使い分けの考え方を聞く方が良いです。 0かどうか判定、1つ前行も0なら+1、A3みたいに0でないならそこから1、こんな数式から作ってみましたか?。

tasuuy
質問者

お礼

大変参考になりました、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • maron--5
  • ベストアンサー率36% (321/877)
回答No.6

◆関数による方法です B2=IF(AND(A2>0,COUNTIF($A$2:A2,">0")>1),ROW()-MATCH(1,INDEX(0/($A$1:A1>0),)),"") ★下にコピー

tasuuy
質問者

お礼

大変参考になりました、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

こんにちは! 一例です。 ↓の画像のように作業用の列(B列)を設けています。 単純に連番を表示させているだけです。 B2セルに =IF(A2="","",ROW(A1)) C2セルに =IF(OR(A2=0,COUNTIF($A$2:A2,"<>0")<2),"",INDEX($B$2:B2,LARGE(IF($A$2:A2<>0,ROW($A$1:A1)),1))-INDEX($B$2:B2,LARGE(IF($A$2:A2<>0,ROW($A$1:A1)),2))) これは配列数式になってしまいますので、この画面からコピー&ペーストしただけではエラーになると思います。 C2セルに貼り付け後、F2キーを押す、またはC2セルをダブルクリック、または数式バー内で一度クリックします。 編集可能になりますので、Shift+Ctrlキーを押しながらEnterキーで確定します。 そして、B2・C2セルを範囲指定し、C2セルのフィルハンドルでダブルクリックすると 画像のような感じになります。 以上、参考になれば良いのですが 他に良い方法があれば読み流してくださいね。m(__)m

tasuuy
質問者

お礼

大変参考になりました、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.3

関数では厳しいのでマクロにしてみました。 (1)シートタブ上で右クリック→コードの表示→右画面に以下のコードを貼り付けでマクロ実行して下さい。 <サンプル> Sub test() k = 1 For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 1) = "" Then Exit Sub If Cells(i, 1) > 0 Then If k > 1 Then Cells(i, 2) = i - k End If k = i End If Next End Sub

tasuuy
質問者

お礼

大変参考になりました、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

質問には、データをならべて、その法則性を、読者や回答者に考えろ、でなく、質問者が文章でやりたいことを表現すべきだ。質問者の思考力をきたえ、正確性に意図を掴んでもらうことと、質問者の礼儀と思う。 ーー (1)こういう問題は関数では難しいのだ。理由は非空白(や0)の出現行が不定であるためである。 VBAでやると簡単なロジック(考え)で出来る。理由はプログラムでは直前の非空白行番号数を、変数という仕組みで、覚えて伝えられる(使える)からだ。 しかしVBAが経験無いだろうから (2)関数では 例データ(質問では0になっいるが、下記では空白行に変えた例にしている。少し式を変えれば、0の場合に変更可能だろう。) 行番号  A列  B列  C列 1 データ 作業列 間隔 2 3 4 5 1 5 5 6 7 8 12 8 3 9 10 11 12 1 12 4 13 14 15 2 15 3 16 3 16 1 17 18 19 20 21 2 21 5 C2には=IF(B2<>"",ROW(),"") と入れて下方向に式複写。 D2には=IF(B2<>"",ROW()-MAX($C$1:C1),"") 式を下方向に複写。 結果 上記D列 ーー 上例で、最初非空白出現の第5行のみD列で正しい4が5になるが、式を複雑にして修正も可能だがそのままにしておく。 作業列C列を使わない式で回答に出るかもしれないが、複雑になりそう。作業列を使うことで考え方が簡単になるので使った方法を示した。

tasuuy
質問者

お礼

大変参考になりました、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • DIooggooID
  • ベストアンサー率27% (1730/6405)
回答No.1

こちらのような、マクロは いかがでしょうか? Sub Macro1() Dim count1 As Integer ' Range("A1").Select Do Until ActiveCell.Value = "" If ActiveCell.Value <> 0 Then ActiveCell.Offset(1, 0).Select count1 = 1 Exit Do End If ActiveCell.Offset(1, 0).Select Loop Do Until ActiveCell.Value = "" If ActiveCell.Value <> 0 Then ActiveCell.Offset(0, 1).Select ActiveCell.Value = count1 ActiveCell.Offset(0, -1).Select count1 = 0 End If ActiveCell.Offset(1, 0).Select count1 = count1 + 1 Loop End Sub

tasuuy
質問者

お礼

大変参考になりました、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ランダムに数字の入った列から、ほしい行を見つけ出す関数

    A列とB列に、それぞれランダムに1と2という数字が入っていて、 「A列が2で、B列が1」となっている行だけを知りたい場合、 どうすればいいでしょうか? エクセルかロータスで、それを導き出す式がわかる方、ぜひ教えてください。 表計算ソフト超初心者です。よろしくお願いします。

  • 1)A列 A4からA55まで、数字のデータが入ってるセルと、入ってない

    1)A列 A4からA55まで、数字のデータが入ってるセルと、入ってないセルがあります。 2)B列もA列同様、B4からB55まで、数字のデータが入ってるセルと、入ってないセルがあります。(データの入ってる行は、A列で入っていれば、B列の同じ行に入っています) 3)A列とB列のデータの入っている行を順番に4から55行まで、掛け算をして(例えば、A5*B5)、その4から55行まで合計を、H2に入っている、ほかの合計の数値で、割り算をする計算式をK2のセルに、一つにまとめて入れ、計算結果を表示したいのです。 検索で参考例を探したのですが、見当たらなかったので宜しくお願いいたします。

  • ランダムな数字の平均値を出したい

    B列とE列とG列にランダムに数字が入っています。 A列にはア、イ、ウ、エ、オとカテゴリーの文字列が入っています。 このうちある条件をみたす(例えばA列にウと入っている)行のB列とE列とG列の数字の平均値をとりたいのですが、 どうすればよいでしょうか? ifaverage関数を使おうと思いましたが、対象列が複数あり、対象列の間の列には 今回の計算の対象にはしたくない数字が入っているので、範囲指定で平均値をとることができません。 =sumif()/countif()でaverageifと同じ効果を出そうとしましたが、 数字には0があったり、セルにブランクが含まれていたりするので、やはりうまくいかないような気がします。 アドバイスお願いします。

  • ランダムな数字の掛け算

    こんなこと出来るのか教えてください。例えばA列のセルに5000行位の数字データがあるとします。そのデータをB列の同じ行に1.001~1.1の範囲でランダムな数字の掛け算にしたいのです。 何かよい方法があればお教えください。よろしくお願いします。

  • A列とB列の値の差から、ほしい行を見つけ出す関数

    お世話になります。 A列とB列に、それぞれランダムに数字が入っていて、 「A列とB列の値の差が、±5.1 以上」である行だけを知りたい場合、 どうすればいいでしょうか? (セルの値は整数だけではなくて、小数点5桁以上の場合もあります。) エクセルかロータスで、それを導き出す関数の式がわかる方、ぜひ教えてください。 表計算ソフト超初心者です。よろしくお願いします。

  • A列とB列の数字が一致しているか調べたい

    エクセルで、A列・B列の数字が一致しているか調べる方法(関数?)を教えてください。 もし一致していなければ(A列にあってB列にない、もしくはその逆)、 何らかの手段で一致していない数字をわかるようにしたいのですが 可能でしょうか? A列 B列 ------------------ 1   6 2   5 3   4 4   7 5   9 6   6

  • エクセルの質問。同じ数字なら違う列の数字を返す

    エクセルについて質問です。 A列は数字が入力されていて、B列はある数字があります。C列にB列と同じような数字を入力していきます。入力したC列の数字が、B列の中にあれば、入力した行にA列の数字をD列に返すことは出来ますか?下記に例を記載します。 A     B     C       D 0   20110210   2010811       1   20110214   20101025   2   20110215   2011111    7 3   20110216   2011322  4   20110217   2011516   6   20110221   2011325   7   2011111    20101220   8   20050223   2011128   宜しくお願いします。

  • ExcelでA列の期間だけB列に1を表示する

    A列の数字の期間だけB列に1を記述する関数をご存知でしたら教えて下さい。 AB 21 01 00 00 31 01 01 00 00 上の関数が組めたら下記のような期間がかぶっている日の計算を したいのです。 AB 21 32 01 12 31 01 01 どなたかわかる方おりましたら教えて下さい。 株式市場の分析をしています。

  • B列にA列の数字をかけた数字を出したい

    B列の各行に3(or2or1)を入力をしたらA列の数字に0.3(2なら0.2,1なら0.1) をかけて小数点第一以下は切り捨てをするマクロを組みたいのですができません。 例  A5に4581と入力されていてB5に3と入力をしたらB5が1374と変換される ようにしたいです;どのようなマクロを組めばよいでしょうか。。。 環境はWINDOWSVISTAのEXCEL2007ですm(__)m

  • A列かB列に数字が入っているセルを対称にして計算したい。

    A列とB列に数字が入っています。 A列とB列どちらともはいっていることも、入っていないこともないです。 必ずどちらかに数字が入っています。 C列で、 =100*「A列かB列数字が入っている方」 の関数が知りたいのですが。。。 よろしくお願いします。

専門家に質問してみよう