ここから本文です

大至急 データベース抽出

ryo********さん

2018/11/901:25:12

大至急 データベース抽出

エクセル2010です
下記やりたいことについてVBAおよび関数での組み方ご教授願えますでしょうか?

やりたい事:
A1セルから100行ほどの8桁数字がデータベースとして並んでいます。

B1セルに3を入力するとB2から下にデータベースの上から3番目まで表示です。

C1セルに2を入力すると4番目と5番目をC2セルから下に表示 この時抽出済みのデータは選びません

D1以降も同様です

つまり一行目に好きな数字を入れると データベースからその数字の数だけ表示されるというものです。

注意点は一度抽出されたデータは抽出対象外です。

よろしくお願いします。

閲覧数:
85
回答数:
3
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

mek********さん

2018/11/915:17:10

一応、重複チェック処理を含めた修正版
として再提示します。
A列で、異なる行位置にあっても、
同じ値を持つセルは、
個数指定しても、
表示されないという意味です。

動作チェックは、
何回かはしましたが、
エラ-処理等は、
不十分ですので、
気づいた点がありましたら、
ご自身で、修正記述をなさってください。


繰り返しにはなりますが、
当方の私見です。
A列が数値列だという場合と、
A列が文字列だという場合で、
デ-タの扱いが違ってくるとも思います。
数値列の場合、特に実験デ-タというときに、
近傍セルで同じ数値が並ぶ、
あるいは離れたセルで同じ数値が出現する、
ということもあろうかと…
その場合、重複という範疇では扱えないのでは、
とも思うのです。
まあ、文字列の場合、氏名などのデータとして、
同姓同名であれば、それを重複とみなし、
デ-タを扱う側の基準で捨てる、ということは
やぶさかではありませんが・・・

このような、処理の場合、
重複の削除というのは、
本来、ご自身で、
A列にある状態で、済ませておく。
または、
別のシ-トに重複削除済みのデ-タとして転記、
してからのほうが、
混乱しないのではないでしょうか。


▽ 前回までの記述部分 ▽

VBAでの例
シ-トのチェンジイベント(B列以降の一行目で入力された
数値を、個数としてA列から抽出)

但し、

"注意点は一度抽出されたデータは抽出対象外"

という希望の点ですが、
A列から、デ-タ個数指定で抽出する際、
重複をチェックするということでしょうか?

抽出される当該列での重複なのか、
B列から当該列まで通した、重複ということなのか、
確認したい点です。

提示しましたコ-ドでは、
たとえば、
[B1]に10と入力された際は、
A1~A10までの値を、[B2]以降に抽出します。
続いて、
[C1]に5と入力された際は、
A11~A15までの値を、[C2]以降に抽出します。
ここで、
B列に抽出された、
A2とA6が同値の場合とか、
また、
C列に抽出された、
A12が、B列のA2とA6が同値の場合も、
あるかもしれません。
この場合、重複していると考えるのか、
いや、行番が違っている値だから、
異なった値として考えるのか、
はっきりとさせてほしい点なのです。


各一行目に入力していくということですが、
B⇒C⇒D…
のように順番に従う入力では、処理しますが、
空欄になるような入力B⇒D⇒G…
には、
対応しておりません。

さらに、B⇒C⇒D⇒E⇒C
のように列を戻るような入力をされた際は、
D列以降は、
整合性のため、クリアするようにしてあります。
また、
一度入力した値をクリア(内容の削除)した場合も、
当該列以降は、クリアされます。
0やマイナスの値の入力も、
当該列以降、クリアされます。



' シ-トのチェンジイベントなのでシ-トモジュ-ルへ

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim EndR1 As Long, EndR2 As Long
Dim i As Long, Cnt As Long
Dim Sm As Long, Pre As Long

On Error GoTo Erskip

If Target.Row > 1 Or Target.Column < 2 Then Exit Sub
If Target.Offset(0, -1).Value = "" Then Exit Sub

Application.EnableEvents = False
Application.ScreenUpdating = False

EndR1 = Me.Cells(Rows.Count, 1).End(xlUp).Row

With Target

If IsNumeric(.Value) = True And .Value <> "" And .Value <> 0 Then
If .Address = "$B$1" And .Value > 0 _
And .Value <= EndR1 Then
Me.Range(Cells(2, 2), Cells(Rows.Count, 2)).ClearContents
Me.Range(Cells(1, .Column + 1), Cells(Rows.Count, Columns.Count)).ClearContents
i = 1
Cnt = 1
Do While Cnt <= .Value
If WorksheetFunction.CountIf(Me.Range(Cells(1, 1), Cells(i, 1)), Cells(i, 1)) < 2 Then
Me.Cells(Cnt + 1, 2) = Me.Cells(i, 1)
Cnt = Cnt + 1
i = i + 1
Else
i = i + 1
End If
Loop
ElseIf .Value > 0 Then
Sm = WorksheetFunction.Sum(Me.Range(Cells(1, 2), Cells(1, .Column)))
EndR2 = Me.Cells(1, .Column - 1).End(xlDown).Row
Pre = Me.Range(Cells(1, 1), Cells(EndR1, 1)).Find(Me.Cells(EndR2, .Column - 1), LookAt:=xlWhole).Row
Me.Range(Cells(2, .Column), Cells(Rows.Count, .Column)).ClearContents
Me.Range(Cells(1, .Column + 1), Cells(Rows.Count, Columns.Count)).ClearContents
If Sm <= EndR1 Then
Cnt = 1
Do While Cnt <= .Value
If WorksheetFunction.CountIf(Me.Range(Cells(1, 1), Cells(Pre + 1, 1)), Cells(Pre + 1, 1)) < 2 Then
Me.Cells(Cnt + 1, .Column) = Me.Cells(Pre + 1, 1)
Cnt = Cnt + 1
Pre = Pre + 1
Else
Pre = Pre + 1
End If
Loop
End If
End If
ElseIf .Value = "" Or .Value <= 0 Then
Me.Range(Cells(2, .Column), Cells(Rows.Count, .Column)).ClearContents
Me.Range(Cells(1, .Column + 1), Cells(Rows.Count, Columns.Count)).ClearContents
End If

End With

Application.ScreenUpdating = True
Application.EnableEvents = True

Exit Sub

Erskip:
Application.EnableEvents = True

End Sub

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

mac********さん

2018/11/915:58:03

A1セルは項目名(または空白セル)でA2セル以下にデータが入力されているなら、以下の数式で列ごとに分割した該当データを表示できます。

=IFERROR(INDEX(OFFSET($A$2,SUM(A$1:$A$1),0,B$1,1),ROW(1:1)),"")

A1セルは項目名(または空白セル)でA2セル以下にデータが入力されているなら、以下の数式で列ごとに分割した該当デー...

not********さん

2018/11/908:18:32

>データベースの上から3番目まで表示

の「上から3番目」とは、A1~A3のことですか?
それとも、数字の大きい方から3番目という意味ですか?

また、データベースとは整理されるべきものですが、
大きい順に並んでいますか?

もし並べ変わっている、または並べ替えていいなら、
最初の質問はどちらでも同じ処理ということになりますね。


とりあえず、
(データベース部分が並べ替わっていることも含めて)上から順に
表示すればいい、という場合を答えます。

B2に入力する関数:
=IF($B$1>=ROW()-1,INDEX($A:$A,ROW()-1),"")

これをB列で入る可能性のあるだけ下にコピペする。


C2に入力する関数:
=IF(C$1>=ROW()-1,INDEX($A:$A,SUM($B$1:B$1)+ROW()-1),"")

これをC列およびD列・E列・・・と入る可能性のあるだけ下・横にコピペする。


これで、B1・C1・D1に数字を入れると
その数だけ上から順に表示されるようになります。


ただし、「上から〇番目」が「セルの上から〇番目」ではないし、
A列を並べ替えてもいけないなら、別の関数を考える必要があります。

無駄になるかもしれないので、いったんここまでを回答とします。

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる