SyntaxHighlighter

ラベル Excel の投稿を表示しています。 すべての投稿を表示
ラベル Excel の投稿を表示しています。 すべての投稿を表示

2020-08-05

Excelに外部データベースを自動取り入れする方法

ここで使用する技は、次の使用状況を前提に考えた:

- 参照するキーはExcel上もともとある資料
- 外部データベース(今回はSQL Serverを例にする)には、すでに必要な資料を整理してある(つまり、DB内のTableのJOIN等は、Viewなどの形で、すでに整理してある)

使用する技の中身を明かすと、次のように分解する:
1. 必要なパラメータをそれぞれTableにする(Queryを掛けるときには必要)
2. それぞれのパラメータをクエリに変換。(後ほど詳しく説明)
3. 本当にデータをクエリし、必要のパラメータフィルタはひとまず「定数」で設定。
4. 上記定数のパラメータをそれぞれクエリに入れ替え。

それでは、ステップ分けて説明する。

パラメータをテーブルに設定

例として、MicrosoftのNorthwindデータベースをSqlServerのLocalDBに構築した前提で進む。目標としては[Order Details Extended]というViewの中で、OrderIDが同一するものを抽出する。

では、まずは[OrderID]をTableに設定する。A1のセルにOrderIDと入力し、例えの内容として、"10254"をA2に入力する。

A1のセルをクリックして、[挿入] - [テーブル]をクリックして、該当範囲をテーブルに変換する。ショートカットは[Ctrl-T]を押しても同じようなものが出る。注意すべきのは、「先頭行をテーブルの見出しとして使用する」にチェックを入れること。Excelの設計上、必ず一番上のマスにタイトルを入れるので、自分でタイトルを入れないと、Excelが勝手にタイトルを付けておくようになってしまう。

以上で、パラメータをテーブルに変換する手順が終わる。

パラメータをクエリに変換

次に、それぞれのパラメータテーブルをクエリに変換していく。
テーブルの一部をクリックして、[データ] - (取得と変換) - [テーブルから]をクリックする。とすると、Power Queryエディターが出てくる。

先ずはタイトルの部分を注目。ここでは「数値」としてマスの内容を認識しているはず。どっちにしよう、SQLクエリを掛けるのに、「文字」タイプが一番ベスト。ゆえに、ここは一度文字へ変換しておく。また、テーブルが複数欄になってしまった場合、ここで一度整理整頓を行う。一つのパラメータは一つの欄だけにすることが大事。

そして、1欄目のところに右クリックして、「ドリルダウン」をクリックする。とすると、ちょっと変な形になるが、使用上支障はないので、無視する。右側にプロパティが出るので、ここで名前QueryOrderIDとする。

そのままの形で、ホーム - 閉じて次に読み込む (閉じて読み込むの裏にある)をクリックする。読み込み先が聞かれてくるが、「接続の作成のみ」として読み込み。

上記の繰り返して、すべてのパラメータをクエリへ変換しておく。

一度本クエリを行う

データ新しいクエリデータベースからSqlServerデータベースからをクリック、接続のダイアログを出す。サーバーは (localdb)\MSSQLLocalDB で、データベースは Northwind となる。

実際に接続するときには、毎回接続情報を聞いてくるが、そこは各自に解決してください…

今回接続したいテーブル(実はView)は前述の「Order Details Extended」、そして下の「編集」をクリックする。

それぞれパラメータを掛けたいところに、タイトルの右にあるドリルダウンボタンをクリックし、フィルタを掛ける。今回の案では、10254とフィルタする。

終了したときは、同じホーム ⇒ 閉じて次に読み込む として、同じ表のA4セルに読み込む。

クエリのパラメータを入れ替える

鬼門が来た。前のステップで作成した本クエリのところをクリックして、編集を掛ける。編集を行いやすいように、表示 - レイアウト - 数式バー にチェックを入れる。

とすると、数式バーに「[OrderID] = 10254」のような文字が書いてある。10254のところをOrderIDと書き換える。

同じように、掛けたいパラメータのところをそれぞれ対応するクエリ名に入れ替えて置く。

完成したら、閉じて読み込む

以上で、完成。

おわりに

SQLクエリを変更可能なパラメータで行うには上記のやり方で可能だが、実際に操作してみてはやはり面倒くさいし、いろいろセキュリティ上の問題で、ネットでこれらの方法を展開していないのは理由が分かる気がする。自分でもやってみて「VBAにした方が楽だなぁ」と思ったりする。なにかいい方法があれば教えてください。




2014-08-28

Excel小技巧: 製作可參照其他工作表的下拉式選單

最近重頭學習Excel的一些技巧, 有些非常實用, 做一下筆記.
有些地方我會放一些專門用語, 由於手頭上沒有中文Office, 只能用笨拙的翻譯.
為了避免用語分歧, 我會在下面適當的插入英文註解.


以前在製作下拉式選單的時候, 只會笨笨的選擇同一張工作表裡面的列表值
這有一些缺點, 包括了

  1. 列表內的選項數量變更時, 必須自己去重新設定下拉式選單的範圍, 否則下拉式選單會跑出許多空白.
  2. 選項列表以及值列表必須在同一張工作表中. 這讓整個版面很難控制.
以下介紹兩個小技巧, 他們分別解決上面兩個問題.

第一個, 適當使用定名範圍(Named Range)
在選單列 插入>名稱>定義 對話框中, 我們可以自行定義一些關鍵字來供自己使用.
在這裡, 適當的使用OFFSET與COUNTA, 我們可以設定一個可動式的定名範圍

舉例來說, 在工作表Sheet1中的列A的A1放了標題, A2~A10放了列表內容.
我們可以在定義範圍(Defined Range)的定義欄中放入下面的定義式來定義一個可動範圍

=OFFSET(Sheet1!$A$1,0,1,COUNTA(Sheet1!$A:$A)-1,1)

這樣的話, 就算是我們在A11上加入了一個新選擇項, 它也會自動含入定義範圍中.

第二個, 在下拉式選單(儲存格輸入規則, Input Role)設定時,
選擇「清單」, 並在範圍的部分直接指定上面的定名範圍(Named Range),
這時候, 定名範圍的內容不一定要是在該工作表中.
也就是說, 你可以在Sheet2中呼叫Sheet1中的定名範圍

換句話說, 輸入用的工作表與選項定義的工作表可以分割開來.
終極的選項, 他們甚至可以不在同一個工作簿中!!

ps. 以後再來補說明圖...

人気の投稿