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

Form analysis 1 forms found in the DOM

GET /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.





原文


翻訳を改善する

--------------------------------------------------------------------------------