プロが教える店舗&オフィスのセキュリティ対策術

お世話になります^ ^

みなさんとても親切な方で、大変恐縮ですm(_ _)m

10000以上のデータがあるのですが、、
あるセルからあるセルまでの間隔の数値を、
自動的に求める方法はありますでしょうか??

数値はHセルに入力しています。
例えば、数値1と2と、
他の数値とのセル間隔を数字で求められたらと思っています。

 例)セルH1 2
   セルH2 8
   セルH3 6
   セルH4 15
   セルH5 1
   セルH6 1

となる場合、
1と2以外のセル間を数字で求めると、
0→3→0となります。

このように求められる方法はありますでしょうか?

稚拙な文章のため、
意味がわからない!などありましたら、
ご指摘ください。

よろしくお願い致しますm(_ _)m

A 回答 (17件中1~10件)

>あるセルからあるセルまでの間隔の数値を



これはなんでしょう?
セルの升目の数を数えるのですか?

1行目に1が入力されていて、5行目に2が入力されていたら
間隔はいくつになるのでしょう?

>1と2以外のセル間を数字で求めると、
>0→3→0となります。

この場合の1と2というのは、セルH1とセルH5の事ですか?
0→3→0がわかりません。^^;

読解力がなくてすいません。

この回答への補足

早速のご回答ありがとうございます^ ^

いやぁ~
説明が稚拙で大変申し訳ありません。。
いつもおまえは説明がよくわからんといわれます。


>1行目に1が入力されていて、5行目に2が入力されていたら
>間隔はいくつになるのでしょう?

 この間隔は、3になります。
 1行目と5行目の間のセルをカウントします。
 その間のセルは、2行目、3行目、4行目となり、
 3となります。


>この場合の1と2というのは、セルH1とセルH5の事ですか?
>0→3→0がわかりません。^^;

 わかりにくくてすみません。。
 この場合の1と2というのは、
 セルH1、セルH5、セルH6のことになります。

 0→3→0は、
 セルH1は2(該当数字)です。
 初めから該当数字が出たため、
 セル間の間隔がないことになります。
 ですので、0となります。

 そして次の該当数字の1か2までの間隔は?
 ということになりますと、
 次の該当数字は、セルH5の1となります。
 その間隔はセルH2とセルH3とセルH4の3つですので、
 3になります。
  
 さらに次の該当数字の1か2までの間隔は?
 ということになりますと、
 次の該当数字は、セルH6の1となります。
 セルH5で該当数字1が出ていますので、
 セルH5とセルH6の間にセルがありませんので、
 0となります。


まだまだわかりにくい点があると存じます。。
その際は、何なりとお申し付け下さい!

よろしくお願い致します。

補足日時:2008/07/25 14:40
    • good
    • 0

という事は、I列に対象となる数値があったら行番号を表示させれば


あとは計算できますよね。

I1セルに
=IF(OR(H1=1,H1=2),ROW(),"")
と記入してデーター分下方にコピーします。

I列にH列の数値が、1か2だった場合に、その該当の行番号が
表示されます。

以降は、引き算の設定ですから間のセル数を数えるなら、
さらに1引くって事になりますね。

この回答への補足

ご回答ありがとうございます!!
バッチリできました!


>以降は、引き算の設定ですから間のセル数を数えるなら、
>さらに1引くって事になりますね。

 さらに1引くためには、
 数式になにを書き足せばよいでしょうか?

 
10000以上のデータがあるのですが、、
ご教授いただきました方法ですと、
少し問題が生じてしまいました。。

該当数字の1か2が、
セルH20にあったためセル間が20ということで表示されました。
ここまではバッチリなのですが、、

次のセル間のセルカウント数が、
前回のセル間の値に加算されていってしまうのです。。

 例)セルH20に該当数字があり、間隔数20と表示。
   セルH30に該当数字があり、間隔数30と表示。

このように加算されてしまい、
セルH20とセルH30の間隔が10ではなく、
30と表示されてしまいます。。

これを解決する方法はありますでしょうか??

何度もお手数をおけして恐縮ですm(_ _)m

補足日時:2008/07/25 16:32
    • good
    • 0

さらに「1」引く為には単純に数式の最後に


「-1」を付け足すだけです。

先ほどの関数は、「1」か「2」があった場合のそのセルの行数
ですから、そこから計算しないといけませんよ。

単純にセル番地の行数番号を返しているだけです。

間のセル数を数えるなら、
さらにJ列に次の関数をセットします。

最初は行(J1)は参照が難しいのでセットしません。
関数を入れるのは、「J2」セルです。間違えないで下さいね。

=IF(I2="","",I2-(MAX($I$1:I1)+1))

これで行番号表示されたI列の隣のJ列にセル数を数えた数値が
表示されます。

この回答への補足

またまたご回答ありがとうございます!!

-1の件は完璧にできたのですが、、

=IF(I2="","",I2-(MAX($I$1:I1)+1))がうまくいきません。。

おっしゃられるとおり、
J1セルではなく、J2セルにそのまま
=IF(I2="","",I2-(MAX($I$1:I1)+1))
をコピーペしたのですが、
何も起こりません^ ^;

WindowsXPでエクセル2003SPを使っていますが、
何かバージョンなどの関係があるのでしょうか?

補足日時:2008/07/25 17:30
    • good
    • 0

>J1セルではなく、J2セルにそのまま


>=IF(I2="","",I2-(MAX($I$1:I1)+1))
>をコピーペしたのですが、
>何も起こりません^ ^;

ごめんなさい言葉足らずでした。
この数式をそのままデーターがあるだけ下方にコピーです。^^;

J2に該当する1・2の数値が無ければJ2にだけ貼り付けても
何も変化しませんね^^;

この回答への補足

ご回答ありがとうございます!

言葉足らずなんてとんでもないです。
わたくしが初心者すぎるだけですので。。

>この数式をそのままデーターがあるだけ下方にコピーです。^^;

とのことですが、
つまりJセルの行すべて(J1~J10000以上のセル)に、
ご教授いただいた数式をコピペするということでしょうか?

それでしたら先ほどやってみましたが、
何も起こりませんでした。。

補足日時:2008/07/25 17:52
    • good
    • 0

Iの列には


=IF(OR(H1=1,H1=2),ROW(),"")
という数式が入っていて、1と2のある行には
それぞれ行番号が表示されてますよね。

で、そのことを踏まえて
=IF(I2="","",I2-(MAX($I$1:I1)+1))
という数式を今度はJ2から下方へコピーです。

この二列、二つの数式で完成です。

この回答への補足

いつもご回答ありがとうございます!!

やっとできました^ ^b

最後の質問なのですが、
J列で取得した、1と2のセル間の数字を、
例えばK列にまとめて表示できますでしょうか?

J列にはセル間の数字が表示されていますが、
空白が長く続きますし、
なにしろデータ量が10000万以上と膨大ですので、
見やすくひとつの列に空白なしで並べられたら、、
と思っております。

いつもお時間をさいていただきまして、
ありがとうございますm(_ _)m

補足日時:2008/07/25 19:21
    • good
    • 0

珍しいい型の問題で、それだけに十分説明してもらわ無いとわからない。


例の数も少なすぎる。
ーー
VBAでやれば、下記のように簡単な問題ではないのかな。
まずA列にデータがあるとして、
(1)A列の2を1に置換する。
(2)シートでALT+F11キー
ALTキーを押したままでIキー、そしてMきーを押す。標準モジュールというのが出る。そこへ下記をコピペする。
Sub test01()
d = Range("a65536").End(xlUp).Row 'A列最下行を捉える
k = 1
m = 1
For i = 1 To d
If Cells(i, "A") = 1 Then 'A列の1を探す
gyo = i
'MsgBox gyou - m
Cells(k, "C") = gyo - m 'C列に表示
k = k + 1
m = gyo + 1
End If
Next i
End Sub
ーー
(3)F5キーをおす。実行される
(4)結果(C列)
A列      C列
10
83
60
15
1
1
====
何分質問の問題点を誤解していたらすみません、無視してください。
    • good
    • 0

ごめんなさい。

バレーの練習に行ってました。^^;

K列での行詰めですね。

K1セルに
=IF(ISERROR(INDEX($J$1:$J$10000,SMALL($I$1:$I$10000,ROW(J1)))),"",INDEX($J$1:$J$10000,SMALL($I$1:$I$10000,ROW(J1))))
を記入して下方にコピーです。

ただし、範囲の終わりが不明なので、範囲参照の中に「$I$1:$I$10000」と「$J$1:$J$10000」が二つづつありますので
正しい行数に直してください。
最終行の行数に「10000」を書き換えてくれればいいです。^^

この回答への補足

ご回答ありがとうございます^ ^

先日はお世話になりましたm(_ _)m

バレーですか!
いいですね~
お疲れ様です!

ご教授していただいたとおりにやってみたのですが、、
何も起こりません。。

まず、K1セルに
IF(ISERROR(INDEX($J$1:$J$10000,SMALL($I$1:$I$10000,ROW(J1)))),"",INDEX($J$1:$J$10000,SMALL($I$1:$I$10000,ROW(J1))))
をコピーしてエンターを押しました。

そしてK1セルをコピーして、
ためしにK2からK3000までペーストしましたが、
何も起こりませんでした。。

何か手順が間違っていましたでしょうか?

補足日時:2008/07/26 14:19
    • good
    • 0

>詰めて表示



J2=SMALL($I:$I,ROW())-SMALL($I:$I,ROW()-1)-1

これを下にコピーでOKです。
エラーを回避するなら、

J2=IF(COUNT($I:$I)<ROW(),"",SMALL($I:$I,ROW())-SMALL($I:$I,ROW()-1)-1)
    • good
    • 0

こんにちは。



No.5までは表示されたのですよね。
さて、数式の解説をしながら検証してみますか。

この数式はエラー処理をしているので、IFの後にISERRORを入れて
あります。
ISERRORの中に書かれた関数がエラーだったら空白を返します。
その部分が、
ISERROR(INDEX($J$1:$J$10000,SMALL($I$1:$I$10000,ROW(J1))))
です。

本来なら、
INDEX($J$1:$J$10000,SMALL($I$1:$I$10000,ROW(J1))))
だけで機能するのですが、行詰めした以降のセルにはエラーが
表示されるのでエラー回避してます。

セル数を数えた数値が0・2・0・3・5・4と6個しかなければ
上から6行目以降はすべてエラー表示されますからね。

では先にSMALLです。
この関数は、指定された範囲の中で小さい順に●番目の
数字を返します。
●番目と言うのは、任意に指定できます。
Iの列には、検索に当たった行数が表示されていますから、
上から下に数字が段々大きくなります。
この数値の中でJ列に小さい方から順番に拾って行こうというのが
狙いです。

そこで●番目の設定ですが、「ROW(J1)」と指定しています。
参照の形が相対参照というコピーする事で参照先が変化する
形をとってますので、下にコピーして行けば、J2 J3と変化します。
ROWは行番号を返す関数ですから、列番号に関係なく
J1=1 J2=2 J30=30という数字を返します。
つまり、提示した基本の数式では、1番目に小さい数字を拾うと
言う事になります。

そしてその上の「INDEX」は範囲の中で行数で指定された場所の
値を拾います。
つまり、SMALLで小さい方からと拾った数値はそのまま行番号なので
その数値を範囲の中で当てはめれば、J列のセル数を数えた数値が
返されるはずです。

何も起こらないって事はエラー回避が働いている可能性がありますから
一度、
=INDEX(J:J,SMALL(J:J,ROW(J1))))
この関数をだけをJ1セルに入力して下にコピーして見て下さい。

その結果を教えて下さい。

この回答への補足

いつもご回答ありがとうございます^ ^


ご教授いただきました処理を行った結果を、
報告いたします。

J1セルに入力して下にコピーして見ましたところ、
入力した数式にエラーが発生しましたという物が出て、
修正を適応しますか?という問にはいと回答しました。

すると、数式を計算できませんという警告が出てきました。
その後J列にはすべて数字の0が表示されていました。


ためしにK1セルに入力して下にコピーして見ましたところ、、
同じような警告文が出ました。
その後K列には#VALUEと表示されました。


度々お世話になりますm(_ _)m

補足日時:2008/07/26 18:02
    • good
    • 0

あっ、ごめんなさい。

K列でしたね。

No.5まで出来ているなら、次はK列に行詰めですから
J列ではなく、K列に入力して頂く事になります。

それでもエラーが表示されたなら、このエラーは
引数や演算子に使われている種類のアンマッチを示しますので
一旦数式を二つに分けてどこにエラーがあるか見てみます。

K列に入れる数式を
=SMALL($I$1:$I$10000,ROW(J1))
として下にコピーしてください。

問題が無ければ、I列の数値が行詰めされて表示されるはずです。

この操作が出来ていれば、次はL列に
=INDEX($J$1:$J$10000,K1)
と入力してみてください。

この二段階の操作をまとめて書いたのが先ほどの数式です。

PS:ちなみにエクセルのバージョンは何でしょう? 2003?

この回答への補足

いつもご回答ありがとうございます^ ^

そして返事が遅れてしまい、
大変申し訳ありません。。
ちょっと出かけていました。


ご教授いただきましたとおり、
K列に入れる数式を
=SMALL($I$1:$I$10000,ROW(J1))
として下にコピーしたのですが、、

#VALUE
と数式をコピーしたK列のセルすべてに
表示されてしまいました。。

エクセルのバージョンは、
おっしゃるとおり2003であります。

補足日時:2008/07/27 20:22
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています