アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんばんは。

色々調べたのですが、ExcelVBAでAccessのクエリをだインポートするやり方がわかりません。
↓下記のやり方でクエリを指定すると、SELECTなどの指定がないといわれます。
http://dqn.sakusakutto.jp/2008/05/vbaaccessexcel …

下記のやり方で
http://www.asahi-net.or.jp/~ef2o-inue/kihon/sub0 …
→『ADOでデータを取得する。』で上手くいきそうなのですが、
テーブルのインポートはできても抽出部分が入れられません。

AccessのSQL文コピーし、strSQL="SELECT"の部分に
貼り付け、""でくくり、""部分は、''に置き換え、最後の;を消しました。

SQL部分にSELECT~としたのですが、1行に収まらず、自動改行がかかってしまい、1行目の最終に"が自動でついてしまい、
HAVING以降のAND((T_受付表.分類2)) In('優','普','')などの抽出条件がエラーになってしまいます。
VBAの通常改行 _も入れてみたのですが、えらーになってしまいます。

『 DAOでフィールドを個々に指定して読み込む』
で再度SQLを指定してやってみたところ、SELECT部分のみにすると、選択条件の入っていない、テーブルのデータインポートは上手くいくのですが、どうしても条件がいれられません。

どうしたらよいのでしょうか。
チラッと探したところ、クエリはインポートできないなどのご意見があったのですが、実際のところどのようにしたら良いのでしょうか。

宜しくお願い致します。

A 回答 (2件)

Excel VBAでのSQL文を提示してみてください。


ついでにその周りの関係するコードも提示されると回答が得られやすいと思います。

この回答への補足

↓このコードでテーブルを指定すると出来るのですが、クエリを指定するとなぜか出来ないのです。
Sub get_data()

Dim myPath As String
Dim myProvider As String
Dim mySrc As String

myPath = "C:\~\サンプル.mdb"
myProvider = "Provider=Microsoft.Jet.OLEDB.4.0;"
mySrc = "Data Source=" & myPath & ";"

Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset

cn.Open myProvider & mySrc
rs.Open "テーブル名またはクエリ名", cn

Range("a1").CopyFromRecordset rs

End Sub

そして、下記のやり方で項目名や名前を短くしてSQL文を短くして出来たのですが、いったいstrSQL = ""の間の改行はどのようにしたら良いのでしょうか。私の場合は途中で改行すると末尾に自動で""がついてしまいます。
それともうひとつやりたいことは、アクセスならパラメーターでその月のデータの抽出をさせるところを、Excelのインプットボックスでその月を入力させて抽出したいのですが、どうしたらよいでしょうか。
宜しくお願い致します。

http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub0 …
*******************************************************************************
' ADOでAccessデータベースからデータをシート上に展開する
'
' 作成者:井上治 URL:http://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'*******************************************************************************
Option Explicit
Const cnsADO_CONNECT1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
Const cnsADO_CONNECT2 = "\DB\SAMPLE.mdb;"

'*******************************************************************************
' ADOでフィールドを個々に指定して読み込む
'*******************************************************************************
Sub TEST5()
' 参照設定「Microsoft Active Data Object 2.x Library」
Dim dbCon As New ADODB.Connection
Dim dbRes As New ADODB.Recordset
Dim dbCols As ADODB.Fields
Dim strSQL As String
Dim GYO As Long

' 画面描画更新停止
Call GP_StopSCUPD
Worksheets("Sheet1").Activate
' 接続を確立する
dbCon.Open cnsADO_CONNECT1 & ThisWorkbook.Path & cnsADO_CONNECT2
' テーブル名,条件を指定してレコードセットを取得する
strSQL = "PARAMETERS 売上げ月 Value;SELECT T_受払表.売上げ月, T_受払表.業務ID, Left([業務ID],5) AS manth業務ID, T_受払表.業務名, T_受払表.業種, T_部門名.部門名, T_受払表.分類1, T_受払表.分類2, T_受払表.チーム名, T_受払表.売上げ, T_受払表.原価, T_受払表.工数, T_受払表.委託作業費, T_受払表.仕入れ金, T_受払表.当月原価_振替, T_受払表.当月原価_労務費, T_受払表.当月原価_直接経費, T_受払表.不一致 FROM T_受払表 INNER JOIN T_部門名 ON T_受払表.部門コード = T_部門名.部門コード WHERE (((T_受払表.業務名)='製品') AND ((T_受払表.分類2) In ('長','年','')))"
dbRes.Open strSQL, dbCon, adOpenKeyset, adLockReadOnly
GYO = 1
Rows("2:65536").ClearContents
' 先頭レコードからEOFまで繰り返す
dbRes.MoveFirst ' ←この行はなくても問題なし

Do Until dbRes.EOF
' 行の変数を加算し必要項目を選択してセルにセット
GYO = GYO + 1
Set dbCols = dbRes.Fields

'↓ここは本番では変えました。
Cells(GYO, 1).Value = dbCols("西暦年").Value
Cells(GYO, 2).Value = dbCols("開催順SEQ").Value
Cells(GYO, 3).Value = dbCols("決勝開催日").Value
Cells(GYO, 4).Value = dbCols("GP名").Value
Cells(GYO, 5).Value = dbCols("開催地").Value
' 次のレコードに移る
dbRes.MoveNext
Loop
' レコードセット、データベースを閉じる
dbRes.Close
Set dbRes = Nothing
dbCon.Close
Set dbCon = Nothing
' 画面描画更新復帰
Call GP_StartSCUPD
End Sub

補足日時:2009/11/14 22:36
    • good
    • 0

sql文が原因のようですね。


パラメーター文は何のためでしょうか?
抽出条件ならwhere文に(T_受払表.売上げ月=売上げ月)が無いので意味がないと思います。

VBAで行う場合は別にInput文やフォーム、セルなどに入力させておきそれを使って
sql文に where T_受払表.売上げ月=" & 売上げ月 & ";"  '数字型の場合
where T_受払表.売上げ月='" & 売上げ月 & "';"   '文字型の場合
などとするほうが普通の方法のようです。

こういう場合問題を見つける手順として
SQL文を単純にして問題ないか調べる
そこで問題があれば、そこを修正する、なければSQL文のデバッグをする。

SQL文についてはaccessでダミーでクエリーを作りその表示をSQLにしてそこにここで作ったSQL文を貼り付けて保存。(この時点でエラーが出るかもしれない)
そのSQLを実行してみるという方法でSQL文のデバッグができます。


>クエリはインポートできないなどのご意見
問題なくできます。
「クエリーの結果をレコードセットで受ける」わけですから
その後レコードセットをセルに転記する。
    • good
    • 0
この回答へのお礼

教えていただいた問題を見つける方法で、
手順をおってやってみたところ、
inputboxからの変数の引継ぎが上手くいってないことがわかり
パラメータの代わりに使用することが出来ました。

また、この記述が問題解決の大きな鍵になりました。
where T_受払表.売上げ月=" & 売上げ月 & ";"  '数字型の場合
where T_受払表.売上げ月='" & 売上げ月 & "';"   '文字型の場合

2ヶ月位なやんでいた問題だったので、すっきりしました。
ありがとうございました。

お礼日時:2009/11/30 21:57

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