ExcelVBA ~ 64bitのExcelにて、「DAOで」、特定のExcelファイルの、1つのセルの値を読み込む方法。
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
https://atsumitm.iobb.net/its/its-041.phpの図がすごく参考になります。
Google Chromeで、mhtml形式で保存、必須、です。(^^)
1つのセルだけなので、「ExecuteExcel4Macro」を使うほうがいいのかもしれませんが、
このコードをいろいろに作り替えれば、3セル分取得したい、とか、
何らかのオブジェクトを返す、とか、色々に加工できるとも思いますので、
その「ひながた」として、メモしておきます。
ADOではなくて、DAO、です。
マイクロソフトは結局、64bitでも、DAOも使えるようにしたんですね。
いつになるかわかりませんが、ADOでの方法も、追加出来たら追加していきたいと思います。
https://atsumitm.iobb.net/its/its-041.phpにもあるように、Accessでも使えると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
' ' Option Explicit '###################################################################################### '特定のExcelファイルの、1つのセルの値を、DAOで読み込む方法。その1 ' '※64bitのOfficeにてDAOを使う方法ですが、参照設定が必要で、 ' 『 Microsoft Office ××.0 Access Database Engine Object Library 』に ' チェックを入れておきます。 '※32bitの場合、参照設定でMicrosoft DAO 3.6 Object Library に ' チェックを入れておきます。 ' 'https://atsumitm.iobb.net/its/its-041.php の、 '「なお対象がAccessの場合、拡張子が「.mbd」の古いAccess(2007未満)の時は」を 'Ctrl+Fでページ内検索して参照のこと。表もあります。 ' '引数の「s_SrcWbNm」は読み込みたい先のExcelファイルのフルパスを指定します。 '引数の「s_SqlStr」は、その読み込みのSQL文を指定します。 'SQLの内容は、たとえば、、 '『 SELECT 列名 FROM [シート名$] WHERE 列名 = '検索値' 』みたいな形で '行けます。 ' '################################################################################ Function Read_ByDaoGetPasswd01(s_SrcWbNm As String, _ s_SqlStr As String) As String '※64bitのOfficeにてDAOを使う方法ですが、参照設定が必要で、 ' 『 Microsoft Office ××.0 Access Database Engine Object Library 』に ' チェックを入れておきます。 '※32bitの場合、参照設定でMicrosoft DAO 3.6 Object Library に ' チェックを入れておきます。 Dim o_Db01 As DAO.Database '読込対象のXLSファイル用のDAOオブジェクト用の変数 Dim o_RsWsSettei01 As DAO.Recordset '読込対象のシートのDAOオブジェクト用の変数 ' Dim s_SrcWbNm As String '今回引数に。読込対象のXLSファイルのフルパス格納用の変数 ' Dim s_SrcWsNm As String '今回、不要。 読込対象のシート名の格納用の変数 '' Dim StrData01 As String '今回、不要。 Debug.Print用 ' Dim s_SqlStr As String '今回引数に。 '読込対象としたいXLSファイルのフルパスを指定する ' s_SrcWbNm = "D:\DAOテスト.xls" ' s_SrcWbNm = "\\data1\TYDATA\売上管理\#OPENや接触や操作厳禁\各種設定01.xls" '読込対象としたいシートの名前を指定する ' s_SrcWsNm = "設定01$" '「Sheet1」をシステムテーブルとして読み込む。 '「$」を付けるとシステムテーブルになる。 'データベースファイル(s_SrcWbNm)を開く。ここではxlsファイル。(=DAOとしてのデータベースを定義) 'HDR=NO →1行目を読込む。(すべてのシートで) 'HDR=YES →1行目を読込まない。(すべてのシートで) 'IMEX=1→表示されているセル書式の値でデータを吸い込む。 ' ただし、https://support.microsoft.com/ja-jp/help/194124/prb-excel-values-returned-as-null-using-dao-openrecordset ' や http://blog.sorceryforce.net/?p=154 を参照 'Excel 8.0→「VBA Excel バージョン番号」でGoogle検索。 ' 8.0で2000でも2010でも動いた。 ' Set o_Db01 = OpenDatabase(s_SrcWbNm, False, False, "Excel 8.0;HDR=NO;IMEX=1") Set o_Db01 = OpenDatabase(s_SrcWbNm, False, False, "Excel 12.0;HDR=YES;IMEX=1") ' '読み込み対象のシートをレコードセット化する。 '' Set o_RsWsSettei01 = o_Db01.OpenRecordset(s_SrcWsNm) ' Set o_RsWsSettei01 = o_Db01.OpenRecordset("SELECT パスワード FROM [設定01$] WHERE 機能名 = '東邦ガスロゴ濃度設定'") Set o_RsWsSettei01 = o_Db01.OpenRecordset(s_SqlStr) ' Debug.Print o_RsWsSettei01.Fields(0) Let Read_ByDaoGetPasswd01 = o_RsWsSettei01.Fields(0) ' 'レコードセット化したシートの内容の読み込みテスト ' Do Until o_RsWsSettei01.EOF ' ' With o_RsWsSettei01 'A列・B列・C列のデータを取得 ' ' '「HDR=NO」=1行目を列名として読み込まない場合その1→列名を「Index番号」で表現して変数に吸い込む '' StrData01 = StrData01 & .Fields(0) & vbTab & .Fields(1) & vbTab & .Fields(2) & vbCrLf ' ' '「HDR=NO」=1行目を列名として読み込まない場合その2→列名を「システムテーブルとしての列名」で表現して変数に吸い込む '' StrData01 = StrData01 & .Fields("F1") & vbTab & .Fields("F2") & vbTab & .Fields("F3") & vbCrLf ' ' '「HDR=YES」=1行目を列名として読み込む場合→列名を1行目の「セルの列名」で表現して変数に吸い込む '' StrData01 = StrData01 & .Fields("リスト番号") & _ '' vbTab & .Fields("社員コード") & _ '' vbTab & .Fields("氏名") & _ '' vbTab & .Fields("リストに表示される値") & vbCrLf ' ' Debug.Print _ ' .Fields("連番") & "---" & _ ' .Fields("機能名") & "---" & _ ' .Fields("パスワード") & "---" & _ ' .Fields("設定項目名") & "---" & _ ' .Fields("値") ' ' ' .MoveNext '次のレコード(行)に移動 ' ' End With ' ' ' ' Loop ' Debug.Print StrData01 o_RsWsSettei01.Close o_Db01.Close Set o_RsWsSettei01 = Nothing Set o_Db01 = Nothing End Function '###################################################################################### '特定のExcelファイルの、1つのセルの値を、DAOで読み込む方法。その2 ' '※参照設定「不要」です。 ' でも、64bitのOfficeにて、DAOを使えるようにする方法です。 ' '『 Set オブジェクト変数名 = CreateObject("DAO.DBEngine.120") 』を使います。 '『 Microsoft Office 15.0 Access Database Engine Object Library 』を '参照設定したのと同じことになります。 ' '32bitのOfficeでは使えないかも? '32bitの場合、『 Set DBEngineのオブジェクト名 = CreateObject("DAO.DBEngine.36") かも? 'https://atsumitm.iobb.net/its/its-041.php の、 '「なお対象がAccessの場合、拡張子が「.mbd」の古いAccess(2007未満)の時は」を 'Ctrl+Fでページ内検索して参照のこと。表もあります。 ' 'ちなみに、64bitで 「CreateObject("DAO.DBEngine.36") 」を使うと、 '「クラスが登録されていません」のエラーになります。 ' '引数の「s_SrcWbFullPath」は読み込みたい先のExcelファイルのフルパスを指定します。 '引数の「s_SqlStr」は、その読み込みのSQL文を指定します。 'SQLの内容は、たとえば、、 '『 SELECT 列名 FROM [シート名$] WHERE 列名 = '検索値' 』みたいな形で '行けます。 '###################################################################################### Function Read_ByDaoGetPasswd02(s_SrcWbFullPath As String, _ s_SqlStr As String) As String Dim o_DbEngine As Object 'DAOそのもの用のオブジェクト変数 Dim o_Db01 As Object '読込対象のXLSファイル用のDAOオブジェクト用の変数 Dim o_RsWs01 As Object '読込対象のシートのDAOオブジェクト用の変数 Set o_DbEngine = CreateObject("DAO.DBEngine.120") Set o_Db01 = o_DbEngine.OpenDatabase(s_SrcWbFullPath, False, False, "Excel 12.0;HDR=YES;IMEX=1") '↑「Excel 12.0」は「Excel 8.0」でも大丈夫っぽいです。 ' Set o_RsWs01 = o_Db01.OpenRecordset("SELECT パスワード FROM [設定01$] WHERE 機能名 = 'ロゴ濃度設定'") Set o_RsWs01 = o_Db01.OpenRecordset(s_SqlStr) ' Debug.Print o_RsWs01.Fields(0) Let Read_ByDaoGetPasswd02 = o_RsWs01.Fields(0) o_RsWs01.Close o_Db01.Close Set o_RsWs01 = Nothing Set o_Db01 = Nothing Set o_DbEngine = Nothing End Function ' ' |