• ベストアンサー

VBAでSQLのテーブル実名と別名を同じセルに出力

以前、VBAで[文字列を各セルに出力]という質問をさせていただいた者です。 現在SQLの結合条件を各セルに出力ということをやっています。 そこでは、結合条件の文字列を一文字ずつ見ていき、スペースごとに区切るという処理をしています。 そこで、各セルに出力していったのですが、テーブルに別名が付いていた時、そこにスペースがあるため、一つとして見られてしまい、同じセルには出力できません。 現在は以下の通りです。 論理 |     |  |      | 演算子|テーブル名|条件|テーブル名 | ――――――――――――――――――――    |EMP    | I |EMP | EMP_1 ON |EMP.DEPTNO | = |EMP_1.DEPTNO| これを 論理 |     |  |      | 演算子|テーブル名|条件|テーブル名 | ――――――――――――――――――――    |EMP    | I |EMP EMP_1 | ON |EMP.DEPTNO | = |EMP_1.DEPTNO| という風にしたいのです。 どなたかご教授ください。

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

  • ベストアンサー
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.3

Sub SplitSQL() '今回はセレクト文のみで考えます。 '複合条件の場合で()付きのものは対象にしません。( A OR B ) AND Cのような条件 Dim strSQL As String Dim strWork As String Dim field() As String Dim alias() As String Dim tables() As String Dim work() As String Dim i As Integer 'strSQL = "SELECT A.TABLEA AliasA, B.TABLEB AliasB, C AS AliasC FROM TABLEA,TABLEB WHERE AliasA = AliasB" 'strSQL = "SELECT A.TABLEA AliasA, B.TABLEB AliasB, C FROM TABLEA,TABLEB WHERE AliasA = AliasB" '大文字小文字の区別をしないで1文字目から文字が含まれるかをチェック If InStr(1, strSQL, "SELECT", vbTextCompare) = 0 Or InStr(1, strSQL, "FROM", vbTextCompare) = 0 Then Exit Sub End If 'FROMの前まで取り出す strWork = Left(strSQL, InStr(1, strSQL, "FROM", vbTextCompare) - 1) 'SELECT文を取り除く strWork = Right(strWork, Len(strWork) - (InStr(1, strSQL, "SELECT", vbTextCompare) + Len("select") - 1)) 'カンマ区切りでfieldに格納する field = Split(strWork, ",") 'これでfieldの中には別名の配列が完成 '以下はおまけ ReDim tables(UBound(field)) ReDim alias(UBound(field)) For i = 0 To UBound(field) field(i) = Trim(field(i)) '別名とテーブル名の対応する配列を作る work = Split(field(i), " ") 'A.TABLEA AliasA またはC AS AliasCなので、1配列目にテーブル名、配列の末尾に別名が来る。 tables(i) = work(0) '別名が存在する場合は格納、存在しない場合はvbnullstring If UBound(work) <> 0 Then alias(i) = work(UBound(work)) End If Next i For i = 0 To UBound(tables) MsgBox ("テーブル名=" & tables(i) & "別名=" & alias(i)) Next i End Sub こんなイメージでしょうか? がんばってくださいね。

volving
質問者

お礼

ありがとうございます! AKARI0418さんのを基に完成形を組んでいきたいと思います。 大変勉強になりました!

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

その他の回答 (2)

  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.2

回答1さんの指摘にもありますが、実際のテーブル名とエイリアスの区別を現在の状態では区別することができない状態にあります。 私の意見ですが、実際のテーブル名とエイリアスを区別できる情報を取得して行えばよいと思います。 たとえば、実際にデータベースにアクセスし、スキーマ情報を取得して、テーブル名とエイリアスを区別する方法や固定値で改めて持つとか、エクセルの別シートに登録させるなどやり方はさまざまあると思います。 一番簡単なのは、エイリアスをつける時は必ずASをつけなければいけないというルールを作ることでしょうか。 ほかにはテーブル名や項目はカンマ区切りになっているはずですので、FROM区が出現するまでの間に出現するカンマの個数を取得すれば、テーブルの個数がわかりますし、カンマまでをひとつのテーブル名とすれば、1つのセルに出力することも可能です。

volving
質問者

お礼

お礼が遅くなってしまい申し訳ありません。 そうですよね、実名と別名の区別を付けることができればいいのかなとも思ったのですが、あれだけで、区別しなければいけないのです。 なので、どうしたもんかと。。。

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

先ず、テーブルが出てくる範囲を考えます。だいたい"FROM"から "WHERE"までの間と考えられますので、この部分を切り出します。 次に、この部分列内部にサブクエリがあると困るので、"("~")"を 除去します。(正規表現オブジェクトを使うと簡単) その後、テーブル間の区切り","(カンマ)でSplitし、更に各配列 要素に対し、空白でSplitします。2回目のSplitでできた最初の 要素がテーブル名、2番目が別名のはずです。 尚、サブクエリには別名が付いているはずで、この場合は本体が除去 されていますので、2回目のSplitの後、最初の要素が空文字に なります。これは除外してください。 ところで、SQL実行対象のDBシステムは何ですか?サブクエリの 記述方が微妙に違うので、要注意です。

volving
質問者

お礼

お礼が遅くなってしまい申し訳ありません! DBシステムは今のところ、オラクルとUDBとSQLサーバーです。 最初にやった時は、Splitを使ったのですが、結合条件が複数あった場合うまくいかなかったので、一文字ずつ読み込む方を選んだのです。 Splitを使わずにEMPとEMP_1をEMP EMP_1という風にする方法ってないんでしょうか??

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

関連するQ&A

  • VBAで文字列を各セルに出力

    はじめまして。 業務でVBAを使うことになり、勉強中なのですが、 動的な文字列をスペースごとに区切り、各セルに出力する方法がわかりません。 どなたかご教授ください。 str = "EMPNO = 1111 AND DEPTNO = 4444" という文字列を 演算子 フィールド 条件 比較値 ------------------     EMPNO  | = | 1111 AND | DEPTNO  | = | 4444 となるようにしたいのです。

  • 結合されたセルの一覧出力 VBA

    お世話になります。 結合されたファイルの一覧を出力したいと思っています。 (できれば、変数に出力したいです) 表があり、ばらばらな範囲で結合されています。 結合した部分には、日付が入っています。 日付が入っている列は、B列とH列で、 その中で「AA」「BB」と入力されている結合セル以外の 結合セル範囲?行?を取得したいと思っております。 B列とH列の結合セル行が同じではありません。 B列は、B5:B13、B18:B25、B30:37 (それ以外のセルは結合してあっても、「AA,BB]と書いてある H列は、H6:H13,H18:H25、H30::H35,H36:H40(上と同じ) ということになっております。 できれば、 1.セル結合範囲を検索(行数取得?) 2.セルの内容が日付かどうか確認 3.日付なら、セル行数を取得 ということがしたいです。 日付の形式は、3/1などのように入っています。 このフォームが結構変わるため、 結合しているセルの中身が日付かどうかを確認し、 日付なら行数取得→色んなプログラムでその行数を使用 したいと思っています。 分かりにくい部分が多いかと思いますが、 回答お願い致します。

  • テーブル内のセル間にスペースを空けたい

    tableタグとtr、tdを使って2行2列の表を作っています。 (1)それぞれのセルとセルの間にスペースを空けたいです。 (2)セルの中の文字の開始位置を1文字分程空けたいです。 CSSでの指定でも構いません。 tdやpにmarginを指定したり、cellpadingなど色々試しましたがうまく行きません。 どうかご教授をお願いします。

    • ベストアンサー
    • HTML
  • VBAで複数列セルに入力されている文字を一行に

    こんにちは。VBAにて下記イメージの複数列セルに入力されている文字を一行に変換しメモに出力すると同時に出力された一行の文字列をコピーした状態にしたいです。セルに記載された文字は「,」カンマで区切った状態で範囲はA3セルからA50位となります。また、セルが結合されていたり空白が存在したり様々です。大変申し訳御座いませんがご教授宜しくお願いします。 あああ → あああ,いいい,ううう,えええ,おおお・・・ いいい ううう  えええ おおお ・ ・ ・

  • 表の結合に関する質問

    EMP表 EMPNO ENAME JOBNO SAL DEPTNO ----- ------ ------ ----- ------ 1000 ADAMS 100 1000 10 1010 MILLER 200 1200 10 1020 SCOTT 100 800 30 DEPT表 DEPTNO DNAME EMPNO ----- ------ ------ 10 PERSONNEL 1000 20 ACCOUNT 30 DESIGN 上記表に対して、 [SQLコマンド] select e.empno , e.ename , dname , m.ename from emp e join dept d using(deptno) left outer join emp m on d.empno = m.empno; のSQL文を打つと、 EMPNO ENAME DNAME ENAME ----- ------ ------ ----- 1000 ADAMS PERSONNEL ADAMS 1010 MILLER PERSONNEL ADAMS 1020 SCOTT DESIGN と表示されますが、これが表示される過程がわからないです。 emp表とdep表をdeptno列で結合 from emp e join dept d using(deptno) この結合により EMPNO ENAME DNAME ・・・・・・ ----- ------ ------ ----- 1000 ADAMS PERSONNEL ・・・・・・ 1010 MILLER PERSONNEL ・・・・・・ 1020 SCOTT DESIGN ・・・・・・ となります。この部分は分かりますが、 次の、この表とemp表をempnoで結合 left outer join emp m on d.empno = m.empno; した際に、 EMPNO ENAME DNAME ENAME ----- ------ ------ ----- 1000 ADAMS PERSONNEL ADAMS 1010 MILLER PERSONNEL ADAMS 1020 SCOTT DESIGN となりますが、ENAME(4番目の列)で ADAMSと表示される過程が見えてきません。 この部分の過程について、ご教授の程お願い致します。

  • (MS-Excel)複数の条件にマッチする複数のセルを配列?で出力させ

    (MS-Excel)複数の条件にマッチする複数のセルを配列?で出力させたい。 たとえば、条件1=A列で値が数値であるセルと、条件2=条件1でマッチしたセルと同じ行でC列で値が「その他」という文字列であるセルを検索させます。 そして、A列でマッチしたセルの値をE列に出力させて、C列でマッチしたセルの値をF列に出力させたい、というような感じです。 VLOOKUP関数などで、{配列}を使うなどすれば可能だと思って試行錯誤したけどダメでした。 なお、データベース関数のように条件セルなど作業セルが必要な方法は使いたくないです。 よろしく、お願いします。

  • Excel VBAでセルの整列

    Excel VBAでセルの整列 現在、VBAを勉強中の者です。 最近、勉強を始めたばかりですが、この前何とかVBAを用いてセルの塗り潰しが出来る様になりました。 そこで、今度は色が塗り潰されたセルを添付した画像のように整列したいと考えていますが、どんな風にすれば良いのか見当がつきません。 誰か、教えてください。 やりたい事は、A列に結合されているセルがいくつか存在していて、B列を挟んでC列にA列に関連する文字が入力されています。 そして、C列には予めセルが塗り潰されている箇所がありますが、今回、C列において塗り潰されているセルのみを、結合されているセルの最終行に移動させたいのです。

  • エクセル セルの空白削除

    エクセルをしようしていて、添付ファイルのように ディレクトリ名とファイル名を結合したものを別セルに出力したのですが、 その際に結合したセルの文字列の後ろにスペースが入るのですが、 削除する方法はないでしょうか? SUBSTITUTE関数を使用してみたのですが、表示はできるのですが テキストで見てみると、空白が入った状態になっていて うまいこと削除できません。 他にスペースを削除する方法があれば教えて頂きたいです。 よろしくお願いします。

  • エクセル2003 VBAで セル内を 一発呼び出し

    エクセル2003 オートフィルタではなく VBAで セル内を 一発呼び出ししたいので。  よろしく お願いします。 表 列A~E(結合2行) :商品名と内容   列H~K(結合2行) 住所氏名電話番号を記載してます。 1年分を オートフィルターで  氏名 や 商品名で 探すのは 結構 時間がかかります。 同じものが ほぼ少ないため。。。 そこで  たまに 同じ氏名  同じような 品を 検索する セルを 2個ほど作って  そこへ セル1へ 商品名を入力すると  該当する 行のみ 表示される。 セル2に 名前をを入力すると  該当する 行のみ 表示される。 また、セルを赤色に塗った部分の結合行(2~3行)を 赤色に塗りつぶした行のみ 表示も できれば うれしいです。 コマンドボタン等を使ってもいいので お願いします。 そんな VBAを 作っていただけませんでしょうか^^; お手数おかけしますが どなたか よろしく お願いします。 

  • エクセルVBAでセル結合

    いつもお世話になっています。 エクセル2003でVBAを使って下記をしたいのでその、VBA構文を教えて下さい。 特定の列のあるセルに文字が入っています。 (文字が入っている列は固定ですが、行番号はデータによって変わります。例えば、Aデータの場合は「J30」、Bデータの場合は、「J55」だったりします。) この文字が入っているセルをVBAで検索し、検索したセルを右隣のセルと結合します。(先ほどのAデータの場合、J30:Z30に結合します。) 更に、文字が入っているセルが2以上の複数の場合があります。(先ほどのAデータの場合、「J30」と「J40」と「J45」という感じです。文字が入っているセルの数はデータにより異なります。) 結合が終わり、このシートのデータがあるところだけに罫線を引きます。(このシートのデータというのは、前述の文字とそれ以外は、「数字」と「・」です。 ややこしいですが、よろしくお願いします。

コピーが白紙です。MFC-935CDN
このQ&Aのポイント
  • コピーが何も印字できない。ヘッドクリーニングを5回以上しました。Wi-Fiには繋げていません。本機のみのコピーで白紙です。インクは全色交換しました。
  • 質問者はブラザー製品のMFC-935CDNでコピーが白紙になる問題に遭遇しています。ヘッドクリーニングやインク交換を試しましたが問題は解決しておらず、Wi-Fiにも接続していません。お使いの環境や接続方法、関連するソフト・アプリ、電話回線の情報を教えてください。
  • ブラザー製品のMFC-935CDNでコピーが白紙になり、ヘッドクリーニングとインク交換を試しましたが改善されていません。Wi-Fiには接続せず、本機のみのコピーです。お使いの環境や接続方法、関連するソフト・アプリ、電話回線の情報をお知らせください。
回答を見る