hro-blog.blogspot.com
Open in
urlscan Pro
2404:6800:4004:826::2001
Public Scan
URL:
http://hro-blog.blogspot.com/2018/03/excel-vba-recordset.html
Submission: On December 13 via manual from JP — Scanned from JP
Submission: On December 13 via manual from JP — Scanned from JP
Form analysis
1 forms found in the DOMGET /search
<form action="/search" id="searchform" method="get"><input id="s" name="q" size="20" style="border: value=;" type="text"><input id="searchsubmit" type="submit" value="検索"></form>
Text Content
徒然草 つれづれなるまゝに、日ぐらし硯に向かひて、 心にうつりゆくよしなしごとをそこはかとなく書き付くれば、 あやしうこそ物狂ほしけれ。 2018年3月10日土曜日 EXCEL VBA で、RECORDSET を使いまわしする みなさん、こんにちは。 今回も先日に続き EXCEL VBA についてです。 シートのデータを RecordSet に取り込んで利用されている方も多いかと思います。 Dim dbRes As ADODB.Recordset Set dbRes = New ADODB.Recordset dbRes.Open SQLstr, ShtConn, adOpenKeyset, adLockOptimistic '何かRecordSetを操作する処理を行う dbRes.MoveFirst Do Until dbRes.EOF dbRes.MoveNext Loop dbRes.Close こんな感じでしょうか。 RecordSet を Close する前に希望の処理を記述します。 この場合、dbRes.MoveNext です。 しかし Close した後では RecordSet は使用できなくなります。 Dim dbRes As ADODB.Recordset Set dbRes = New ADODB.Recordset dbRes.Open SQLstr, ShtConn, adOpenKeyset, adLockOptimistic dbRes.Close '何かRecordSetを操作する処理を行う dbRes.MoveFirst Do Until dbRes.EOF dbRes.MoveNext Loop > 実行時エラー'3704': > オブジェクトが閉じている場合は、操作は許可されません。 閉じる前に全ての処理を記述できればよいのですが、そうもいきません。 最悪、Close しないで処理を続けても動くとは思いますが、なんか気持ち悪いですね。 それにRecodeSet は任意のタイミングで操作したい。 Dim cloneRs As ADODB.Recordset Set cloneRs = dbRes.clone として dbRes を cloneRs にコピーをして cloneRs を使いまわそうと思っても、オリジナルの dbRes を Close すると cloneRs まで同じタイミングで破棄されるので結局意味がありません。 2次元配列かRecordSetを作成してレコードごとに書き出していくしかないようです。 どうせなら RecordSet に書き出すようにしてみます。 (cloneRsを変数宣言していますが実際は引数で与えます) Dim cloneRs As ADODB.Recordset Dim fld As ADODB.Field Set cloneRs = New ADODB.Recordset For Each fld In dbRes.Fields cloneRs.Fields.Append fld.Name, fld.Type, fld.DefinedSize, fld.Attributes Next cloneRs.Open Do Until dbRes.EOF cloneRs.AddNew For Each fld In dbRes.Fields cloneRs.Fields(fld.Name).Value = fld.Value Next cloneRs.Update dbRes.MoveNext Loop これで、dbRes を Close しても、cloneRs は、使用ができます。 下記が、コードとなります。 cnStr は、起動時並びにファイルを「名前を付 けて保存」した際に、再読み込みできるよう別プロシージャにしました。 Option Explicit Public cnStr As String Sub GetCnStr() '接続文字列の作成 Dim PathStr As String PathStr = ThisWorkbook.Path & "\" & ThisWorkbook.Name cnStr = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" cnStr = cnStr + PathStr cnStr = cnStr + "; ReadOnly=False;Extended Properties= "Excel 8.0; HDR=YES;"" End Sub Sub GetData(cloneRs As ADODB.Recordset, sheetName As String) 'シートデータを取得しRecordSetに変換 Dim SQLstr As String Dim ColName As String ColName = Sheets(sheetName).Range("A1").Value SQLstr = "SELECT * FROM [" & sheetName & "$] WHERE " & ColName & " IS NOT NULL" Dim ShtConn As ADODB.Connection Set ShtConn = New ADODB.Connection ShtConn.ConnectionString = cnStr ShtConn.Open Dim dbRes As ADODB.Recordset Set dbRes = New ADODB.Recordset dbRes.Open SQLstr, ShtConn, adOpenKeyset, adLockOptimistic If dbRes.RecordCount = 0 Then GoTo Label1 End If dbRes.MoveFirst Dim fld As ADODB.Field Set cloneRs = New ADODB.Recordset For Each fld In dbRes.Fields cloneRs.Fields.Append fld.Name, fld.Type, fld.DefinedSize, fld.Attributes Next cloneRs.Open Do Until dbRes.EOF cloneRs.AddNew For Each fld In dbRes.Fields cloneRs.Fields(fld.Name).Value = fld.Value Next cloneRs.Update dbRes.MoveNext Loop Label1: dbRes.Close Set dbRes = Nothing ShtConn.Close End Sub こうしておけば、RecordSetを宣言していろいろなRecordSetを取り出せます。 ではでは~☆ミ 投稿者 hro 時刻: 22:40 メールで送信BlogThis!Twitter で共有するFacebook で共有するPinterest に共有 ラベル: Excel 2 件のコメント: 1. Unknown2019年12月21日 10:23 突然の投稿失礼します。 私は、生業としてVBプログラマをしておるんですが つい最近、エクセルのシートデータがレコードセットに 取りこめることを知り、目からうろこで開発をしております。 そこで使用していて疑問が出てしまっていろいろなサイトを 探し回ってこのサイトにたどり着いた次第です。 質問というのは、エクセルのシートをレコードセットに 取り込んだ際に、ある特定のセルから先の情報がレコードセットに 取り込むことができないということです。 取り込み先のシートは、A列からDW列まで127列シートで それを、シートとコネクトして取り込む方法で行っています。 ですが、取り込んだ後ウォッチで中身を見るとItem(10)以降が 全てNull値になってしまって値が取り込めないのです。 原因がわからず悩んでしまって、どうにかならないかと思って 不躾ではと思いましたが投稿させていただきました。 お教授いただけると幸いです。 返信削除 返信 hro2020年8月12日 0:07 Unknownさん、こんにちは。 既に半年以上経過されているので解決済ではないかと思いますが・・・・・。 セルの書式が変になっていませんか? 値のクリアではなく列自体を削除してみて、データをテキストで貼り付けてみて動作を検証してみては如何でしょうか。 また、127列のフィールド数とのことですので、何かの仕様制限に引っかかっているかも知れません。 20列くらいの仮データを作って、徐々に列数を増やしてみて動作をみてみるのは如何でしょうか。 今思いつくのはそんなところです。 ではでは~☆ミ 削除 返信 返信 返信 コメントを追加 もっと読み込む... 次の投稿 前の投稿 ホーム 徒然草検索 言語設定 言語を選択 ▼ 徒然草のフィードを購読する RSSリーダーで購読する 自己紹介 hro こんにちは! へっぽこバサー hroです。 みなさん、よろしく~☆ 詳細プロフィールを表示 ブログ アーカイブ * ▼ 2018 (6) * ► 4月 (2) * ▼ 3月 (4) * 3月のバス釣り、管釣りで楽しむ * 2018年 初バス 水戸南フィッシングエリア * EXCEL VBA で、RecordSet を使いまわしする * ExcelのVBA 「定義されている設定に違反する」のエラー * ► 2017 (9) * ► 12月 (3) * ► 5月 (3) * ► 4月 (1) * ► 2月 (2) * ► 2016 (65) * ► 11月 (4) * ► 10月 (6) * ► 9月 (7) * ► 8月 (1) * ► 7月 (3) * ► 6月 (6) * ► 5月 (9) * ► 4月 (7) * ► 3月 (4) * ► 2月 (8) * ► 1月 (10) * ► 2015 (53) * ► 12月 (4) * ► 11月 (9) * ► 10月 (3) * ► 9月 (4) * ► 8月 (4) * ► 7月 (4) * ► 6月 (5) * ► 5月 (11) * ► 4月 (8) * ► 1月 (1) * ► 2014 (22) * ► 12月 (4) * ► 11月 (8) * ► 10月 (8) * ► 9月 (2) ラベル * Android (5) * Blog (15) * debian (13) * DVD (2) * Excel (7) * Freeware (20) * Hardware (12) * HTML (4) * iPhone (3) * Linux (14) * Mail (11) * Network (13) * Office (5) * PHP (2) * virus (5) * Wi-Fi・無線LAN (3) * Windows (44) * ニュース・時事問題 (10) * ネットショッピング (8) * フィッシング (44) * ライフ (4) * 雑学 (1) * 小遣いサイト (1) * 旅行・レジャー (15) スポンサードリンク 楽天グループお勧め商品 徒然草 お勧め記事 BEST5 * DELL Inspiron 15 5000 メモリー増設手順 みなさん、こんにちは。 DELL Inspiron 15 5000 のメモリを本日増設してみました。 結構大変でしたので、これから増設を検討されている方の参考になればと思い投稿いたします。 表側です。 裏返すとこんな感じです。 ネジがけっこう沢山つ... * ext3ファイルシステムをWindows10で読み書き みなさん、こんにちは。 Linuxのext3ファイルシステムで作成したUSBメモリを、Windowsでも参照できたら便利だと思いませんか? きっと便利なハズ。 ということでWindowsでも読み書きできるようにします。 Ext2Fsdというフリーウェアを使用すれば... * EXCELが二重起動する(空のEXCELが起動する) みなさん、こんにちは EXCELを終了した時、空のEXCELが残っていることがありませんか? 私の環境ではこんな症状は出ていなかったのですが、結構な人からこの症状の報告がありました。 最初はダブルクリックか何かで二重起動でもしてしまったのかと思ったのですが、... * DELL Inspiron 15 5000 のSSDを換装 みなさん、こんにちは。 先日、DELL Inspiron 15 5000 のSSDを換装いたしました。 結構前だったので、記憶が定かなうちに記録に残しておきたいと思います。 もともと購入時にSSDにカスタマイズして購入したのですが、容量が256GBだったため空き容量が... * EXCEL VBA で、RecordSet を使いまわしする みなさん、こんにちは。 今回も先日に続き EXCEL VBA についてです。 シートのデータを RecordSet に取り込んで利用されている方も多いかと思います。 Dim dbRes As ADODB.Recordset Set dbRes = New ADO... 「シンプル」テーマ. Powered by Blogger. 原文 翻訳を改善する --------------------------------------------------------------------------------