Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 8.1 Pro : Excel 2007)
SQL文の実行エラー
投稿日時: 20/02/18 18:56:59
投稿者: FILETUBE

こんばんは。
  SQL文の実行でお聞きします。
 
    Dim cn As Object
    Dim rs As Object
    Dim strSQL As String
      
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    cn.Provider = "Microsoft.ACE.OLEDB.12.0"
    cn.Properties("Extended Properties") = "Excel 12.0;HDR=YES;IMEX=1"
    cn.Open "C:\test\2019.xlsx"
   
    strSQL = " SELECT SCD,HIDUKE FROM [sheet2$A2:B100] "
    rs.Open strSQL, cn
 
  上記を実行すると
 
   rs.Open strSQL, cnのところで、
  実行時エラー -2147217904 1つ以上の必要なパラメータの値が設定されていません
  
  のエラーになります。
 
  どのような事が原因になるのでしょうか。
  わかる方おられましたら教えて頂けないでしょうか・
 
  宜しくお願いします。

回答
投稿日時: 20/02/18 19:33:34
投稿者: takesi

rs.Open strSQL, cn, adOpenStatic, adLockReadOnly

かな?
 
http://home.att.ne.jp/zeta/gen/excel/c04p01.htm
見てきました。

投稿日時: 20/02/18 21:32:02
投稿者: FILETUBE

回答ありがとうございます。
先ほど、SELECT * と修正してみたら実行できました。
しかし、SCD、HIDUKEの項目名は間違いないのですが。
エラーになるのは、どうしてなのでしょうか。

回答
投稿日時: 20/02/18 22:57:46
投稿者: たらのり

こんばんは
 
酒気帯びのいい加減なレスですが,1行目がヘッダなら,
以下のように変更するとどうですか?
 

strSQL = " SELECT SCD,HIDUKE FROM [sheet2$A2:B100] " 
↓("A2" を "A1")
strSQL = " SELECT SCD,HIDUKE FROM [sheet2$A1:B100] " 

投稿日時: 20/02/19 07:04:30
投稿者: FILETUBE

回答ありがとうございます。
早速、試してみたいと思います。

投稿日時: 20/02/19 18:16:00
投稿者: FILETUBE

 たらのりさん、ありがとうございました。
おかげさまで解決しました。
 
今一度お聞きしたいのですが、
1行目に見出しが入っていない場合はどうなるのでしょうか?

回答
投稿日時: 20/02/19 21:35:49
投稿者: たらのり

こんばんは
 
# 今日はシラフですw
 
うろ覚えですが(手元に動作環境がありません),ヘッダ行がない場合は
プロパティを以下のようにして実行します。
 

   cn.Properties("Extended Properties") = "Excel 12.0;HDR=YES;IMEX=1" 
(HDR=YES → HDR=NO)
   cn.Properties("Extended Properties") = "Excel 12.0;HDR=NO;IMEX=1" 

 
そうすると,結果セットのフィールド名には最左列から順に F1,F2 …… が
自動的に付与されるのだと思います。
 
ただ,SQL文字列中に
 
  SELECT F1, F2 FROM […]

 
のように,この自動に割り付けられたフィールド名を記述できるかは
分かりません。
 
違っていたらスミマセン(何年も扱っていないので)。
とりあえず,最初の問題は解決できてよかったです。

投稿日時: 20/02/19 22:25:52
投稿者: FILETUBE

回答ありがとうございます。
私の説明不足で申し訳ありません。
 
AからW列までデータがあり
B、C、H列のみ1行目に見出しが入っているにです。
しかし、その見出しが入っていない列の
データもSELECTして取得したいのです。
 

回答
投稿日時: 20/02/19 23:46:48
投稿者: たらのり

こんばんは
 
早合点でしたねw
 
見出しがないフィールドが,それも複数あるとすれば,
もはや名前でフィールドを識別することができないので(多分),
見出しがないデータとして扱ったほうがよいかもしれませんね。
 
以下のような記述が可能かどうかは分かりませんが:
 

SELECT
    F1  AS SCD
  , F2  AS HIDUKE
  , F3  AS FOO
  FROM  [Sheet2$A2:B];

とか(フィールドに別名を付けています)。
 
# 先程の説明のとおり,動作無保証
 

回答
投稿日時: 20/02/20 00:06:37
投稿者: MMYS

見出しなしならIndexで。
 

strSQL = " SELECT * FROM [sheet2$]"
rs.Open strSQL, cn

Do Until rs.EOF
  For i = 0 To rs.Fields.Count - 1
    Debug.Print rs.Fields(i).Value,
  Next
  rs.MoveNext
  Debug.Print
Loop

ちなみに私なら
Executeメソッド
CopyFromRecordsetメソッド
でADOから取得します。
 

投稿日時: 20/02/20 06:31:26
投稿者: FILETUBE

回答ありがとうございます。
 
SELECT SCD、項目名、SUM(項目名) FROM Sheet GROUP BY SCD、項目名
 
としたいのです。
 
その時の項目名をどのように指定するかなのです。
取引先から送られてくるデータで、できるればそのまま使いたいのです。
 
 

回答
投稿日時: 20/02/20 11:16:29
投稿者: WinArrow
投稿者のウェブサイトに移動

横から失礼します。
> strSQL = " SELECT SCD,HIDUKE FROM [sheet2$A2:B100]
は、A列とB列を指定したいるので
A1に「SCD」、B1に「HIDUKE」
が入っていないと、掲示のようなエラーがでます。
手っ取り早く対応するには、
事前に、元ファイルを複写して、項目名をセットしたら、いかがでしょう。
手作業でも、マクロの中でもどちらでも構わないと思います。

投稿日時: 20/02/20 21:02:58
投稿者: FILETUBE

皆さま、何度も回答ありがとうございました。
やはり項目名をセットした方が、するしかないでしょうか。
 
そうしようかと思います。
またよろしくお願いします。