質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

91.02%

  • SQL

    2011questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • VBA

    1415questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1219questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • マクロ

    177questions

    定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

VBAコレクションの中身それぞれに接頭辞(prefix)を付けたい

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 189

chanrina0920

score 10

前提・実現したいこと

コレクションに入っている文字列に対してそれぞれ同じ接頭辞をつけた新しいコレクションを2つ作成したいです。

<イメージ>
コレクションの中身
顧客ID、顧客番号、パスワード...

Aコレクションの中身
A.顧客ID、A.顧客番号、A.パスワード

Bコレクションの中身
B.顧客ID、B.顧客番号、B.パスワード

該当のソースコード

SQLを作成するのに現在はcolumnNamesコレクションに文字列が入っています。

VBA

Option Explicit

' 定数宣言
Const テーブル一覧シート名 As String = "テーブル一覧"
Const カラム一覧シート名 As String = "カラム一覧"
Const テーブル一覧シート_テーブル列 As Long = 2
Const カラム一覧シート_テーブル列 As Long = 2
Const カラム一覧シート_カラム列 As Long = 6
Const IS_HEADER As Boolean = True
' IS_HEADERは、各シートの1行目がヘッダ情報である場合(=SQL文の生成が不要な場合)に True 

' SQL文を生成
Public Sub CreateSql()

    ' 変数宣言
    Dim tableSheet As Worksheet
    Dim columnSheet As Worksheet
    Dim rng As Range
    Dim r As Long
    Dim r2 As Long
    Dim tableName As String
    Dim columnNames As Collection
    Dim columnName As Variant
    Dim sql As String

    ' テーブル一覧シート と カラム一覧シートを取得
    With ThisWorkbook
        Set tableSheet = .Worksheets(テーブル一覧シート名)
        Set columnSheet = .Worksheets(カラム一覧シート名)
    End With

    ' 全テーブル走査
    Set rng = tableSheet.Columns(テーブル一覧シート_テーブル列)
    For r = IIf(IS_HEADER, 3, 1) To rng.Cells(rng.Cells.Count).End(xlUp).Row
        ' テーブル名取得
        tableName = tableSheet.Cells(r, テーブル一覧シート_テーブル列).Text

        ' 全カラム取得
        Set rng = columnSheet.Columns(カラム一覧シート_テーブル列)
        Set columnNames = New Collection
        For r2 = IIf(IS_HEADER, 3, 1) To rng.Cells(rng.Cells.Count).End(xlUp).Row
            If columnSheet.Cells(r2, カラム一覧シート_テーブル列).Text = tableName Then
                columnNames.Add columnSheet.Cells(r2, カラム一覧シート_カラム列).Text
            End If
        Next

        'コレクションに入っているカラム名の前にA.とB.をそれぞれ追加(select対象部分の作成)

        ' SQL文生成
        sql = ""
        sql = "SELECT"
        For Each columnName In columnNames
            sql = sql & IIf(sql = "SELECT", " ", ",") & CStr(columnName)
        Next
        sql = sql & " FROM " & tableName & ";" '文字列連結してsql作成

        ' 結果出力
        Debug.Print sql

    Next

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

単純にループで回すしかないような気がします。

Dim columnNames As Collection
Dim columnNamesA As Collection
Dim columnNamesB As Collection
Dim columnName As Variant

Set columnNames = New Collection
Set columnNamesA = New Collection
Set columnNamesB = New Collection

~省略~

' A.のコレクションを作成
For Each columnName In columnNames
    columnNamesA.Add "A." & columnName
Next
' B.のコレクションを作成
For Each columnName In columnNames
    columnNamesB.Add "B." & columnName
Next

もっともただ単にSQL文に付加したいだけであるなら、コレクションに付加せずともSQL文生成の箇所に付加すれば良いような気がしますが。

' SQL文生成
sql = ""
sql = "SELECT"
For Each columnName In columnNames
    sql = sql & IIf(sql = "SELECT", " ", ",") & "A." & CStr(columnName)
Next
sql = sql & " FROM " & tableName & ";" '文字列連結してsql作成

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/12 17:46

    ありがとうございます!ループでなくとも簡単にできるのですね。助かりました。

    キャンセル

0

回答ではありません。

やろうとされていることが、エクセルでデータベースにアクセスする為のEUCのようなものであれば、
BIツールなどがありますけど。

excelに近いところであれば、Microsoft Power BIなどがあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

SQLの作成処理を簡潔にできると思いますので参考まで。
※前提:columnNamesを Scripting.Dictionary型 に変更

'後で[A.]等の処理の為に最初のカンマを付加
SQL = "SELECT" & " ," & Join(columnNames.Keys, ",") & " FROM " & tableName & ";"
sqlA = Replace(SQL, ",", ",A.")
sqlB = Replace(SQL, ",", ",B.")
sqlA = Replace(sqlA, ",", "", Count:=1) ’最初のカンマが不要なので除去
sqlB = Replace(sqlB, ",", "", Count:=1)


もしくは

Cols = "," & Join(columnNames.Keys, ",")
ColA = Replace(Replace(Cols, ",", ",A."), ",", "", Count:=1)
ColB = Replace(Replace(Cols, ",", ",B."), ",", "", Count:=1)
SQL = "SELECT" & " " & ColA & "," & ColB & " FROM " & tableName & ";"

 
    

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • SQL

    2011questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • VBA

    1415questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1219questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • マクロ

    177questions

    定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。