- ベストアンサー
ADOでアクセスからエクセルシートの件数を取得する方法
- アクセスからエクセルシートの件数を取得したいのですが、-1が返ってきます。実際の行は、200行あります。 dbRes.RecordCountで-1が返ってくる原因とエクセルの該当のシートの最終行の取得の仕方を教えてください。
- アクセスからエクセルシートの件数を取得する方法を教えてください。実際の行は200行ありますが、dbRes.RecordCountで-1が返ってきます。
- ADOでアクセスからエクセルシートの件数を取得する際、dbRes.RecordCountで-1が返ってきます。実際の行は200行です。エクセルの該当のシートの最終行の取得の仕方を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
cn.CursorLocation = adUseClient を追加されて解決されたようですね。 以下は評価外の参考程度で レコードセットをオープンする際のカーソルの種類を adOpenDynamic から adOpenStatic もしくは adOpenKeyset に変更してみてはどうでしょうか。 また、Excel 側を更新できなかったと思うので、ロックの種類は adLockReadOnly としてはどうでしょうか。 以下、私の環境下 2007 での確認結果 (参考になるかどうか) Private Const sPath As String = "E:\Excel\qa\et1.xls" ' Excel フルパス Private Const sTbl As String = "TBL$" ' シート名 + $ Public Sub test1() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset On Error Resume Next cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sPath & ";" _ & "Extended Properties='Excel 8.0;HDR=Yes'" rs.Source = "SELECT * FROM [" & sTbl & "];" rs.Open , cn, adOpenForwardOnly, adLockReadOnly rs.MoveLast Debug.Print "1 Rec Count = " & rs.RecordCount Debug.Print "1 Last Pos = " & rs.AbsolutePosition rs.Close rs.Open , cn, adOpenStatic, adLockReadOnly rs.MoveLast Debug.Print "2 Rec Count = " & rs.RecordCount Debug.Print "2 Last Pos = " & rs.AbsolutePosition rs.Close rs.Open , cn, adOpenKeyset, adLockReadOnly rs.MoveLast Debug.Print "3 Rec Count = " & rs.RecordCount Debug.Print "3 Last Pos = " & rs.AbsolutePosition rs.Close rs.Open , cn, adOpenDynamic, adLockReadOnly rs.MoveLast Debug.Print "4 Rec Count = " & rs.RecordCount Debug.Print "4 Last Pos = " & rs.AbsolutePosition rs.Close cn.Close End Sub イミディエイトウィンドウへの出力結果は (-1 かどうかだけを見て頂ければ) 1 Rec Count = -1 1 Last Pos = -1 2 Rec Count = 12 2 Last Pos = 12 3 Rec Count = 12 3 Last Pos = 12 4 Rec Count = -1 4 Last Pos = -1 なお、Excel の参照の仕方を変えた以下でも結果は同じでした。 Public Sub test2() Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset On Error Resume Next Set cn = CurrentProject.Connection rs.Source = "SELECT * FROM [TBL$] IN 'E:\Excel\qa\et1.xls'[Excel 8.0;HDR=YES;];" rs.Open , cn, adOpenForwardOnly, adLockReadOnly rs.MoveLast Debug.Print "1 Rec Count = " & rs.RecordCount Debug.Print "1 Last Pos = " & rs.AbsolutePosition rs.Close ・・・・ ・・・・ 後の処理で転記をするのなら、この書き方の方が便利かも・・・ 他テーブルと結合できたと思うし・・・・( INNER JOIN とかとか ) ※ 他テーブルと結合したい場合、CursorLocation を変更してよいのか・・・ ・・・私にはわかりませんけど 例) テーブル「T1」に「ID」「名称」のフィールドがあり、 Excelシートにある「ID」とテーブル「T1」の「ID」を結んで、「名称」も表示したい rs.Source = "SELECT T1.名称, Q1.* FROM T1 INNER JOIN " _ & "(SELECT * FROM [TBL$] IN 'E:\Excel\qa\et1.xls'[Excel 8.0;HDR=YES;]) AS Q1 " _ & "ON T1.ID = Q1.ID;" > MsgBox rs.RecordCount > で取得される値は実際の行数-1なのですが、なぜでしょうか? > > 勝手に「フィールドはレコードに含めない」と認識されるのでしょうか? HDR=YES を指定すれば、1行目をフィールド名と解釈します。 なので、レコード数は 行数 - 1 になります。 HDR=NO を指定すれば、1行目もデータと解釈します。 なので、レコード数は行数と一致します。 また、フィールド名は「F1」「F2」・・・のように振られます。
その他の回答 (2)
- piroin654
- ベストアンサー率75% (692/917)
"Extended Properties='Excel 8.0;Header=Yes';" & _ のところを以下のようにしてください。 "Extended Properties='Excel 8.0;HDR=NO';" & _ Header=Yes を HDR=NO にしています。 一行目をフィールド名としている場合で、一行目をカウント しない場合は、 HDR=YES にします。一行目からデータの場合は HDR=NO にして、一行目からデータとして扱います。 なお、Headerでは認識しないようなのでHeaderもHDRに 変更しました。
お礼
ご回答ありがとうございます。
- piroin654
- ベストアンサー率75% (692/917)
レコードセットの取り方が間違っているのでは? 変数名が質問とは変わっていますが、以下では? Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.CursorLocation = adUseClient cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Extended Properties='Excel 8.0;Header=Yes';" & _ "Data Source=D:\My Documents\検索.xls" Set rs = cn.Execute("SELECT * FROM [Access接続用$]") MsgBox rs.RecordCount rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing Excelに接続してデータを取得する方法はいくつかありますが、 検索すればいくらでもあると思います。
お礼
ご教示いただいた通りにやってみたら出来ました。 だた一つ疑問なのは、 MsgBox rs.RecordCount で取得される値は実際の行数-1なのですが、なぜでしょうか? 勝手に「フィールドはレコードに含めない」と認識されるのでしょうか?
お礼
ご回答ありがとうございます。