プロが教える店舗&オフィスのセキュリティ対策術

Sub b()

'オブジェクト変数の宣言
Dim rstTMP As ADODB.Recordset  ユーザ定義型宣言されていません。
                   とエラーになります。
Dim cmd As New ADODB.Command

'SQL接続
' 接続文とその他処理を記述
conStr = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Extended Properties=Excel 8.0;" & _
"Data Source=" & FileName


'接続
myCon.Open conStr
'SQLコマンド作成
With cmd
.CommandText = "Select * From テーブル名"
.CommandType = adCmdText
End With
'SQL文実行/レコードセット取得
Set rstTMP = cmd.Execute

End Sub

やりたいこと
1.エクセルのデータ Ver.2016 ファイル bookdata1
抽出先ファイル bookdata2

とにかく接続して抽出したい
抽出したい
助けてください。
上記のこーどはいろんなサイト・このサイトに質問などしてやっています。
コードは標準モジュールに書いています。

質問者からの補足コメント

  • うーん・・・

    いいえ、SQLとVBAに同じ内容書いたので一つ削除になりました。
    もう分けございません。
      strSQL = ""
      strSQL = strSQL & " SELECT S.支店番号, M2.支店名, S.顧客番号, M1.顧客名, M1.住所, S.売上合計"
      strSQL = strSQL & " FROM"
      strSQL = strSQL & " ((SELECT D.顧客番号, D.支店番号, SUM(D.売上) AS 売上合計"

    S.支店番号  S.   ←これはなにを表しているのか
    M2.支店名  M2.  ←これはなにを表しているのか
    D.支店番号  D.  ←これはなにを表しているのか

    理解できません。

    No.3の回答に寄せられた補足コメントです。 補足日時:2017/11/29 17:50
  • どう思う?

    http://excel-ubara.com/excelvba5/EXCEL114.html
    サイトはここからです。
    なんとなくわかりました。
    エクセルで範囲で囲んで
    名前をつけるということですか

    No.4の回答に寄せられた補足コメントです。 補足日時:2017/11/29 18:34
  • へこむわー

    疑問があります
    エクセルの範囲で名前を
    つけてSとかAとかできますが
    M2は無理でした。セルのアドレスに
    なるからでしょう

    M2.支店名  M2. 
    そうなるとM2はなんなんでしょぅか

    No.5の回答に寄せられた補足コメントです。 補足日時:2017/11/29 19:01

A 回答 (7件)

書くのであれば、



'オブジェクト変数の宣言
Dim cmd As New ADODB.Command
Dim rstTMP As ADODB.Recordset

順番的にはこれかなと思いますし、『参照設定』はされているのですよね?
それと後々を考えれば New ADODB.Recordset が良いかも?
・・・・使用する前に『Set ステートメントで New をしないとならない』

https://oshiete.goo.ne.jp/qa/10056033.html
では接続は出来たようですから。

http://infith.com/system/excel/excle_ado_vba/
こちらではユーザーフォームのリストボックスに書き出す方法が書かれてます。

>"Select * From テーブル名"
”テーブル名”とはそのように文字を打ち込んでいる訳ではないですよね?
上記リンク先にあるように『どこのSheetなのか?』を

"SELECT * FROM [Sheet1$];"

と指定しなければなりません。
あと ";" を最後につけておいて。

リストボックスとかが苦手であれば、

Dim i As Integer
を宣言し、
'テーブルを読み込む
Do Until adoRS.EOF
'検索対象の住所(A列)をリストボックス(lstName)に追加
lstName.AddItem adoRS.Fields(0).Value
adoRS.MoveNext
Loop



'テーブルを読み込む
i = 1
Do Until adoRS.EOF
'検索対象の1列目をA列に書き出す。
Cells(i , 1).Value = adoRS.Fields(0).Value
i = i + 1
adoRS.MoveNext
Loop

のようにしてみる。

あとブックを開かなくてはって部分はSheetの指定が不明確だったからかな?と
思うんですよね。

あとでちょっと検証する時間があればやってみますが、うちのは古いので
そのままでは参考になるかどうか。
    • good
    • 0
この回答へのお礼

接続の方法は理解できましたが
そこから先がだめでした。
あーなんとかならないもんですね
ここまでお付き合いいただきありがとうございました
あきらめたわけではないが
簡単にSELECT *FROM TABLE
WHERE = A
とかでできると思っていましたが
簡単なのもできない悔しいです。

お礼日時:2017/11/29 21:06

No.1です。



Excelファイルに接続(ADO)
http://excelwork.info/excel/excelado/

こちらが質問者さんのやりたい事を一通り書いているかもですね。
    • good
    • 0

No.2です。



最新の質問を取り消したと言う事は解決に至ったのでしょうか?
この回答への補足あり
    • good
    • 0

No.3の補足に対して。



どこから出てきたのかわかりませんが、それらはテーブル名ですよ。
ただし純粋にそのままのテーブル名を記載すると大変な時には、

FROM tenpo s
とかで、『tenpo を s に置き換える』事が出来ます。

多分データベース(Accessなど)のサイトを見ての事でしょう。
1つのデータベースに接続してもその中には複数のテーブルが存在しているなら、テーブル名は省略したいですし。
この回答への補足あり
    • good
    • 0

No.4です。



>複数のテーブルが存在しているなら、テーブル名は省略したいですし。

ちょっと語弊になってしまいますかね。
省略ではなく短縮ですね。
完全にテーブル名を記載しなかったとしたら、どこのテーブルのフィールド名(S.支店番号 なら 支店番号)なのか、
わからなくなってしまいますし。
この回答への補足あり
    • good
    • 0

No.4の補足に対して。



これは3つのSheetを関連づけさせ抽出したい内容を求める物ですけど、普通にデータベースを扱い始めた人でも、
難易度はあると思いますよ。
SQL文の解析と理解は大変にはなりそうですけど。

私はAccessに接続したから違ったのかな?

FROM ((SELECT D.顧客番号, D.支店番号, SUM(D.売上) AS 売上合計 FROM [データ$] AS D GROUP BY D.顧客番号, D.支店番号) AS S
LEFT JOIN [支店マスタ$] AS M2
FROM [データ$] AS D

特に S の場合はサブクエリにより作成されたテーブルを表しているようですね。
私にはちょっと直ぐに理解できる内容ではなさそうですが。

Excelで範囲を囲んでって言うよりSheet名を短縮させないと、
>[支店マスタ$]
これとかを何回も書くの大変ですよね。
あとは各シートの1行目をフィールド名にしているのでしょう。

SQL文に限って言うならテーブル名:[支店マスタ$] を 支店マスタ に置き換えれば、質問だけならAccessのカテとかでも出来ると思いますよ。
受けた回答からテーブル名を直す事を忘れなければですけど。
    • good
    • 0

No.5です。



検証はしてませんけどADOで接続しているExcelBookにセルの概念はないと思いますので、M2が使えないって事はないはずです。
サイト管理者がテストしてあげているコードですしね。
サイトのコードをそのままコピペしましたよね?(それとも自身のBookに組み込んでる?)

実際は M2 でも M でも他と被ったり予約語(関数名とか)と同じでなければ、何を使っても半角英数字なら(頭文字は英字になるかも?)
問題ないと思いますよ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!