🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら

Q&A

解決済

2回答

1200閲覧

テーブルを元にして別のテーブルに値を抽出するには

maruhachi

総合スコア26

1グッド

2クリップ

投稿2021/03/22 11:27

編集2021/03/23 00:37

テーブルとして設定している範囲があり(図のアクション部分)

これを元に、条件に応じて別のテーブルに値を切り出したいです。

イメージ説明

図の例だと、アクションテーブルのうち「コード」列が100未満であるもの、10以上であるもの それぞれでテーブルを作りたいです。

最終的にやりたいこと

入力規則のリストで選択肢として表示させたいです。

大元データテーブル=>切り出したテーブル=>1列のみの名前付き範囲=>入力規則のリスト
といった具合です。

そのためテーブルという手段は取れなくとも名前である範囲の1列を構造化参照で見れる、もしくはリストの選択肢として取得できる仕組みであれば良いです

試したこと

FILTER関数を1行目に記載してみたところ、SPILLエラーとなりテーブルとして設定した範囲には使用できないようでした。

AM-UN👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

radames1000

2021/03/23 00:35

11 CCCが「アクション_汎用」「アクション_専用」両方のテーブルにありますが、何か特別なルールがありますか?
maruhachi

2021/03/23 00:38

特別なルールというほどではありませんが… 同じコード値で複数のリストから参照させたかったためこうしています。
radames1000

2021/03/23 00:40

元の100未満と100以上に分けるルールに当てはまらないのでお尋ねしました。 100以上を10以上に訂正されたんですね。了解しました。
guest

回答2

0

ベストアンサー

私も今日存在を知ったところなので、まだ詳しくないのですが
power queryではどうでしょうか。名前が違ってたらすみません。。。

作り方ですが
元のデータを選択した状態で、挿入>テーブル でテーブルを作って
データ>テーブルから で新たなテーブルができます。
これでいけないでしょうか。

なお、これをマクロの記録をしながら実行したら
最後に作った新たなテーブルにSQLを投げる方法がわかります。

マクロの記録を参考に作ってみたVBAです。

VBA

1 Dim tLo As ListObject 2 Set tLo = ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _ 3 "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=""テーブル14"";Extended Properties=""""" _ 4 , Destination:=Range("$E$9")) 5 tLo.Name = "wwww" 6 tLo.QueryTable.CommandType = xlCmdSql 7 tLo.QueryTable.CommandText = Array("SELECT * FROM [テーブル14]") 8 tLo.QueryTable.Refresh BackgroundQuery:=False

これでテーブル:テーブル14をデータソースにしてE9の位置にSQLの結果が出力されます。
SQLを修正する処理を実行すれば、この出力は更新できます。

googleのスプレットシートのQuery関数みたいに使えそうな感じはしました。
ただここまでするならいらないかもですが

なお、私の環境2016での情報です。

投稿2021/03/22 20:23

編集2021/03/22 20:32
xail2222

総合スコア1508

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maruhachi

2021/03/23 00:41

ありがとうございます。 ご提示いただいた通り、PowerQueryでテーブルを元にフィルタした結果に別の名前を付与することができました。 1点、もとのテーブルの内容を更新しても、明示的に「テーブルデザイン」タブ=>「すべて更新」を実行しないと今回作成したテーブルを参照するテーブルの内容が更新されないようでした。 ここを自動で更新するのは難しいですかね…
xail2222

2021/03/23 00:46

今は確認出来る環境にないので想像でお答えします 一応、シートの変更イベントに処理を記載するれば、更新処理を記載出来るとは思います それ以外で自動更新する方法は、今の所知りません。 まぁ他にもっと良い方法があれば良いのですが
maruhachi

2021/03/23 00:57

そうですね、ひとまずはWorksheetのchangeイベントで拾うことにしました。 今は元テーブルのデータの更新契機がコントロールできる範囲内なのでなんとかなりそうです! 助かりました、ありがとうございます!!
guest

0

解決済みになっていますが、参考になればと思いあげてみます。

テーブルの構成は画像の通りです。
イメージ説明
A:B列がアクション
D:E列がアクション_汎用(100未満)
G:H列がアクション_専用(10以上)
それぞれ数式をいれて、Ctrl+Shift+Enterを押下してください。

D2

1=IFERROR(INDEX(アクション,SMALL(IF((アクション[コード]<100)*(アクション[コード]>0),ROW(アクション[コード])-1),ROW()-1),1),"")

E2

1=IFERROR(INDEX(アクション,SMALL(IF((アクション[コード]<100)*(アクション[コード]>0),ROW(アクション[コード])-1),ROW()-1),2),"")

G2

1=IFERROR(INDEX(アクション,SMALL(IF(アクション[コード]>=10,ROW(アクション[コード])-1),ROW()-1),1),"")

H2

1=IFERROR(INDEX(アクション,SMALL(IF(アクション[コード]>=10,ROW(アクション[コード])-1),ROW()-1),2),"")

あらかじめ各テーブルで行を多めに数式を入力しておけば、
アクションテーブルにデータが追加されても自動的に反映されます。

※注意点
・名前を付ける際にはOFFSETやCOUNTを使うことが必要になります。(列にすると空白も含まれるため)
・行数が多くなると重いです。

投稿2021/03/23 01:49

radames1000

総合スコア1925

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maruhachi

2021/03/23 04:38

別案ありがとうございます! そうですね、予め領域を確保する方式を取るとすればご提示いただいた方式が良さそうです。 普通の関数参照で済むので変に複雑にならなそうです。 覚えておきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問