adoRsでのアクセステーブルの列名ルールについて

このQ&Aのポイント
  • エクセルでアクセスのデータを読み込みに行い、一部の列名に数字を使用するとエラーが発生します。
  • 詳細なエラー理由は明確にはわかりませんが、数字を列名に使用しない方が安全です。
  • 数字を列名に使用したい場合は、他の表現方法を検討する必要があります。
回答を見る
  • ベストアンサー

adoRsで読み込むアクセステーブルの列名のルール

こんばんは。 お世話になります。 エクセルでアクセスのデータを読み込みに行き、 取得した結果をシートに出力しています。 このとき、一部の列は出力ができ、一部の列は出力しようとするとエラーになります。 以下のサンプルをご確認ください。 adoRs.Open strSQL, adoCn 'SQLを実行して対象をRecordSetへ ' Range("B12:AI1000").ClearContents '前のデータクリア Range("B12:AI1000").Clear '前のデータクリア i = 12 'スタート行 Do Until adoRs.EOF 'レコードセットが終了するまで処理を繰り返す Cells(i, 2) = adoRs!ID Cells(i, 3) = adoRs!item_no Cells(i, 4) = adoRs!color_no Cells(i, 5) = adoRs!item_name Cells(i, 6) = adoRs!FREE Cells(i, 7) = adoRs!3m Cells(i, 8) = adoRs!50_0-1m この例で行くと、Cells(i, 7)の部分でエラーになります。 列名に数字が入っていると、列名として適切に認識しないのでしょうか? Cells(i, 8)については列名に「_」まで入っているので、 エクセルのstrSQLへのSQLクエリのセットの改行時にも使われる記号ですし、 より悪いのかなとも思います。 列名に数字を入れるとダメなものでしょうか? また列名が数字の場合でもエラーにならない表現方法はあるのでしょうか? ご回答よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

こちらが公式発表 Access データベースでの作業時に使用すべきでない特殊文字 http://support.microsoft.com/kb/826763/ja こちらは少し古いですが経験に基づくもの http://ww3.tiki.ne.jp/~kaya/Ac_tips.html#Tips0_001 (昔も今も代わり映えしないですね) ですので、50_0-1m も 危ないです。 肝心のエラーメッセージの内容が欲しいところですが (再現出来たら教えてください) adoRS("3m") や adoRS![3m] だとどうでしょ?

ARIES10
質問者

お礼

おはようございます。 早速ありがとうございます! リンク1、参考になりました。正式は一読の必要アリですね。 リンク2、数字も避けた方が良さげなんですね、でも列名の最初に英字を入れたらイケるかもですね、理解しました。 のちほどエラー再現させて、補足欄にてご連絡させていただきます。

ARIES10
質問者

補足

エラーを再現させました。 そもそもコンパイルが通らないので VBAの実行時のエラーではないですが、 コンパイルエラー: 修正候補:ステートメントの最後 です。 そして、 adoRS("3m") や adoRS![3m] にすれば コンパイルも通り処理も完遂しました! 感動です。ありがとうございます。 そして、 Cells(i, 7) = adoRs!size3m としてもイケました。 大変助かりました。 ありがとうございました。

関連するQ&A

  • エクセルでのアクセスからのデータ抽出

    Web情報を参考にエクセルにて下記VBAコードを作りました。 Sub DB_Read() Dim adoCON As New ADODB.Connection Dim adoRS As New ADODB.Recordset Dim strSQL As String Dim odbdDB As Variant Dim wSheetName As Variant Dim i, j As Integer Dim GetName odbdDB = ActiveWorkbook.Path & "\test.accdb" adoCON.ConnectionString = "provider=Microsoft.ACE.OLEDB.12.0;" _ & "Data Source=" & odbdDB & "" adoCON.Open j = 4 Do Until j = 18 GetName = Range("B4").Value & "_" & Cells(16, j).Value strSQL = "SELECT 規格値,Max,Min,結果1,結果2,結果3 FROM T_測定結果 WHERE [測定項目]='" & GetName & "'" adoRS.Open strSQL, adoCON, adOpenDynamic wSheetName = ActiveSheet.Name i = 20 adoRS.MoveLast Do Until adoRS.EOF Or i = 25 With Worksheets(wSheetName) .Cells(17, j).Value = adoRS!規格値 .Cells(18, j).Value = adoRS!Max .Cells(19, j).Value = adoRS!Min .Cells(i, j).Value = adoRS!結果1 .Cells(i + 10, j).Value = adoRS!結果2 .Cells(i + 20, j).Value = adoRS!結果3 End With i = i + 1 adoRS.MovePrevious Loop j = j + 1 Loop adoRS.Close Set adoRS = Nothing adoCON.Close Set adoCON = Nothing End Sub VBAを走らせると1巡は走るのですが、「Do Until j = 18」の2巡目に入ると、「wSheetName = ActiveSheet.Name」のところで「実行時エラー3705 アプリケーション定義またはオブジェクトの定義エラー」と出てしまいます。 エラーの原因が分からないので、アドバイスを頂きたいです。

  • テーブルの列名をデータとして設定しておき取得する

    テーブルが2つあるとします。 テーブルAにはテーブルBの列名がデータとして登録されてます。 テーブルBには値が格納されてます。 テーブルA Key  field1  field2  field3 ------------------------------ 1   item2  item3  item5 2   item1  item2  item5 ------------------------------ テーブルB Key  item1  item2  item3  item4  item5 -------------------------------------------- 1    101   205    350   420   510 2    111   112    113   114   115 -------------------------------------------- ここでテーブルAとテーブルBへキーを指定して、 テーブルAのfield1~field3に登録されたすべての列名を元にテーブルBから値を取得したいです。 例として キー1を指定して取得すると 205,350,510 が取れます (item2,item3,item5の列名をテーブルAで指定した為) キー2を指定して取得すると 111,112,115 が取れます キーをパラメータとして与え、 できれば2つのテーブルを結合し、1回のSQLで取得する方法はありますでしょうか? (1回のSQLでなくても簡易であれば良いですが) よろしくお願い致します。

  • Accessの値をExcelに縦横入替出力したい

    以前 http://okwave.jp/qa/q8776430.html ここにて質問をさせて頂いたのですが、回答を頂いたことに感激し お恥ずかしい事に解決する前に先走って回答を締めきったものの どうしても解決できないので申し訳ないですが再度質問させて下さい。 質問:AccessからデータをExcelVBAでADOを使用して読み込み、 出力する前に縦横を入れ替えたいのですが その際に, adOpenstatic、adOpenKeyset などカーソルのタイプを変更しても recordcountが-1を返してしまうのですが、解決法を教えてください。 以下補足です。 -------------------------------------------------------------------- 現在、作業列を使って一旦AccessからデータをVBAでADOを使用して読み込み その後transpose関数で入れ替えているのですが 出力する前に縦横を入れ替えた状態にはできないのでしょうか? -------------------------------------------------------------------- という質問に対して、 Dim buf() As Variant Dim i As Long Dim j As Long   ・ 'ここにAccessファイルへのコネクションを設定   ・   ・ i = rs.Fields.Count j = rs.RecordCount ReDim mbuf(i - 1, j - 1) buf = rs.GetRows Range(Cells(1, 1), Cells(i, j)) = buf ------------------------------------------------------------- という回答を頂き パス(省略) Sub AcRecordCount() Dim tmpFldCnt As Variant Dim tmpRecCnt As Variant Dim buf() As Variant Call DBconnect(True) (省略) strSQLgenyu = _ "SELECT * " & _ "FROM TBL " & _ "WHERE コード = " & Range("J1") & _ "Or コード = " & Range("J2") 'J1、J2に一致したwhereフィールドの列を、fromテーブル名から全て(*)を出力 adoRs.Open strSQLgenyu, adoCn, adOpenKeyset 'SQLを実行して、対象をadoRsへ MsgBox (adoRs.RecordCount)  '-1が返ってくる tmpFldCnt = adoRs.Fields.Count tmpRecCnt = adoRs.RecordCount ReDim buf(tmpFldCnt - 1, tmpRecCnt - 1) 'インデックスが有効範囲にありませんとでる(恐らくrecordcountが原因) buf = adoRs.GetRows Range(Cells(131, 11), Cells(tmpFldCnt, tmpRecCnt)) = buf Range("EA11:JJ105").ClearContents 'セル内を削除 Range("EA11").CopyFromRecordset adoRs '出力 End Sub と、書いたのですが、-1が返ってきてしまいます。 原因は何なのでしょうか?

  • VBA データセットした後にその一部をLOCK

    こんばんは。 お世話になります。 エクセルVBAにてアクセスからデータを取得し、その一部をロックしたいです。 (取得方法には色々あるかと思います。 経験が浅いためどう表現すれば適切か自信がありませんが 「ADOコネクションオブジェクトとADOレコードセットオブジェクトにて実施しています。」) 【VBAの仕様の説明】 「読込」ボタンを押すと、B12~AA1000のエリアのデータを一掃して、 そこに条件によりレコード数が変わりますが、アクセスのデータをセットしています。 その後、これらの出力されたレコードについてエクセル上にて値を書き換えたのちに 「更新」ボタンを押すと、アクセスに更新に行くというものです。 このときB,C,D,E列については、更新処理時に重要なものであり、F列以降と異なり 書き換えてはいけないものです。 【実現したいこと】 このエクセルを開いてから閉じるまでの間、いつでもB12~E1000は手入力不可にしたいです。 ただし、エクセルを開いていきなりロックをしてしまうと、「読込」を押したときに アクセスのデータを出力するときにエラーになってしまいますので 読込ボタンを押した後はB12~E1000のロックを外したいです。 これが難しいようであれば、エクセルを開いてから「読込」を押すまでの間は ロックをかけなくてもよいです。 ある程度ググったので シートを保護する & 特定のセルのLOCKをfalseにする を適切なタイミングで 実施するのだとは理解していますが、実装しようとすると 「RangeクラスのLockedプロパティを設定できません」というエラーが出てしまって 詰まってしまっています。 よろしくお願いいたします。 ↓↓↓↓ソースです。↓↓↓↓ Private adoCn As Object 'ADOコネクションオブジェクト Private adoRs As Object 'ADOレコードセットオブジェクト Private strSQL As String 'SQL文 Private Const DBpath As String = "C:\zaiko.accdb" '接続するファイル(2007~)のフルパス '---------ファイルが開けない場合のエラーを追加 Private file_error As String '--------- Sub DBconnect(flg As Boolean) 'DB接続プロシージャ '---------ファイルが開けない場合のエラーを追加 On Error GoTo Err_Handler 'エラーが起きたら"Err_Handler"へ file_error = 0 'エラーが起きない正常な間はエラーをオフにする。 '--------- Set adoCn = CreateObject("ADODB.Connection") 'ADOコネクションオブジェクトを作成 If flg = True Then Set adoRs = CreateObject("ADODB.Recordset") 'ADOレコードセットオブジェクトを作成 'adoCn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DBpath & ";" 'Accessファイル(~2003)を開く adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & DBpath & ";" 'Accessファイル(2007~)を開く '---------ファイルが開けない場合のエラーを追加 Exit Sub '正常ならここで終了 Err_Handler: 'エラーが起きたらここへ飛ぶ MsgBox "「C:\」フォルダの下にエクセルとアクセスファイルを置いてください。" file_error = 1 '--------- End Sub Sub DBcut_off(flg As Boolean) 'DB切断プロシージャ If flg = True Then adoRs.Close 'レコードセットのクローズ adoCn.Close 'コネクションのクローズ Set adoRs = Nothing 'オブジェクトの破棄 Set adoCn = Nothing End Sub Sub DBread() '読み込み Dim shouhinbangou As String, dy As String, txt As String Call DBconnect(True) 'DB接続 If file_error = 1 Then file_eroor = 0 '初期化してから Exit Sub '処理終了 End If With UserForm1 .show 'ユーザーフォーム表示 If .TextBox1 = "" Then '商品番号欄が空欄の場合 shouhinbangou = "" Else '商品番号欄が記入済 shouhinbangou = "WHERE item_no LIKE '%" & .TextBox1 & "%' " '~を含む End If End With strSQL = _ "SELECT * " & _ "FROM zaiko_table " & _ shouhinbangou adoRs.Open strSQL, adoCn 'SQLを実行して対象をRecordSetへ Range("B12:Z1000").ClearContents '前のデータクリア Range("B12:Z1000").Font.ColorIndex = xlAutomatic 'フォント色を初期化 Range("B12:AA1000").Borders.LineStyle = xlLineStyleNone Application.EnableEvents = False 'イベントオフ(ワークシートチェンジが反応しないように) i = 12 'スタート行 Do Until adoRs.EOF 'レコードセットが終了するまで処理を繰り返す Cells(i, 2) = adoRs!ID Cells(i, 3) = adoRs!item_no Cells(i, 4) = adoRs!color_no Cells(i, 5) = adoRs!item_name Cells(i, 6) = adoRs!~~~ ~中略~ Cells(i, 26) = adoRs!~~~ i = i + 1 '行をカウントアップする adoRs.MoveNext '次のレコードに移動する Loop '下から数える With Range("B12") .Resize(Cells(Rows.Count, .Column).End(xlUp).Row - .Row + 1, 26).Borders.LineStyle = xlContinuous End With Application.EnableEvents = True 'イベントオン Call DBcut_off(True) 'DB切断 End Sub

  • Accessから値を抽出しようとするとフリーズする

    Excelからマクロを用いてAccessファイルからデータを拾おうとしています。 方法は、Access内のテーブルを参照して検索対象の値1がフィールド内にあれば、その行の値2を抽出してくるといったものです。 検索対象の数は可変です。 そこでコードを書いてみたところ 抽出件数が2件以上なら正常に動作するのですが 1件、0件だと動作せず、フリーズしてしまいます。 何が原因で、どう書き直せばよいのでしょうか? 以下、コードです。 Private Sub OKButton_Click() '選択し、OKボタンを押した時 Dim p As Long Dim cnt As Long Range(Cells(45, 4), Cells(114, 6)).ClearContents 'D45~E115のセルを削除(二回目使用時にデータが残ってる為) cnt = ListView1.ListItems.Count '今まで選択してリストビューに追加された対象数を出し、変数へ。 For p = 1 To cnt Cells(44 + p, 4).Value = ListView1.ListItems.Item(p) Cells(44 + p, 5).Value = ListView1.ListItems.Item(p).SubItems(1) Cells(44 + p, 6).Value = ListView1.ListItems.Item(p).SubItems(2) Next p 'リストビューに追加された対象を、D45~E115に書き込み Dim Sql As String Dim i As Long Dim j As Long Dim k As Long Dim m As Long Dim n As Long Call DBconnect(True) Sql = _ "select Aコード,Bコード " & _ "from テーブル" '--- adoRsにSELECT文を入れ、絞り込む adoRs.Open Sql, adoCn, adOpenKeyset ' --- j:選択した対象の数を取得 k:Access内の選択した対象のデータ数を取得 n:列数 j = Worksheets("選択").Range("F45").End(xlDown).Row k = adoRs.Fields.Count n = 1 '--- Aコードが一致する行を選択シートの下部分へ書き込み。 ' --- 45 to jの45は、選択シートの選択した対象をセルに出力した場所が45行目の為。 ' --- cell(j+n,6)は、選択対象数を起点にBコード(値2)一つ毎に数を足していく、6はF列 Do Until adoRs.EOF For i = 45 To j If Worksheets("選択").Cells(i, 6).Value = adoRs!Aコード Then For m = 1 To k Worksheets("選択").Cells(j + n, 6) = adoRs.Fields!Bコード Next m n = n + 1 End If Next i adoRs.MoveNext Loop '後始末 adoRs.Close: Set adoRs = Nothing adoCn.Close: Set adoCn = Nothing

  • xls:CopyFromRecordset罫線描写

    こんにちは。 お世話になります。 エクセルからアクセスを読み込みに行き、取得結果をエクセル内に表示しています。 ※アクセスを開いてエクセルに出力するのではないです。 このとき、スタートセルを指定して Range("B12").CopyFromRecordset adoRs という感じで読み取ったデータを出力していますが、 この出力前に明細にしている部分を消しています。 Range("B12:AI1000").Clear '前のデータクリア ※ClearContentsではダメな理由があります。 このとき、CopyFromRecordset にて出力が行われたセルのみ、 セルのまわりを四角く罫線で囲むということをしたいです。 明細っぽくしたいので。 罫線はこのように引くと思うのですが Range("A1:C3").Borders.LineStyle = xlContinuous このA1:C3の部分を今回B12から始まり、列はAIまで、 行数は条件により変動するため固定ではない状態で、 どのようにすれば取得できるのかが知りたいです。 よろしくお願いいたします。 office2010、windows7です。

  • 可変の検索条件件数でAccessデータを抽出

    http://okwave.jp/qa/q8790348.html ここで質問をさせて頂いたのですが 私の質問方法が下手で、違う意味合いになっていましたので再度投稿させてください。 ■ やりたい事 ADOを用いて、Accessのテーブル内のフィールドに「指定の数値」がある場合 その行を全てExcelに抽出したい ■ 特徴 「指定の数値」は複数あり、なおかつ可変。  → VBAで作成したコンボボックス(Accessから読込)にて選択し、F45から下に好きな個数だけ追加 ■ つまづき点 「指定の数値」全てを検索対象に(OR検索)して SQLのSelect文で取得しようとしてもやり方が分からない ■ 現在のコード '宣言 Private adoCn As Object Private adoRs As Object Private strSQL As String Private Const DBpath = "\Access.mde" Sub DBconnect(flg As Boolean) 'DB呼出 Set adoCn = CreateObject("ADODB.Connection") If flg = True Then Set adoRs = CreateObject("ADODB.Recordset") adoCn.Open "Provider=Microsoft.jet.OLEDB.4.0;Data Source=" & DBpath & ";" End Sub Sub 対象() Dim tmpFldCnt As Variant Dim tmpRecCnt As Integer Dim buf() As Variant Call DBconnect(True) m = Worksheets("選択").Range("B47") Dim i As Long Dim j As Long i = 45 j = 44 + Worksheets("選択").Range("B47") 'B47:コンボボックスで選んだ個数分の数値 On Error GoTo err_hander adoCn.BeginTrans 'トランザクション処理開始 strSQL = _ "select * from TBL where コード = [選択$F" & i & ":F" & j & "]" 'F45より下に取得した値が入っていく adoRs.Open strSQL, adoCn, adOpenKeyset 'SQLを実行して、対象をadoRsへ tmpFldCnt = adoRs.Fields.Count tmpRecCnt = adoRs.RecordCount Range("M28:DG31").ClearContents ReDim buf(tmpFldCnt - 1, tmpRecCnt - 1) buf = adoRs.GetRows Range(Cells(28, 13), Cells(28 + tmpFldCnt - 1, 13 + tmpRecCnt - 1)) = buf adoCn.CommitTrans 'トランザクション終了 Call DBcut_off(True) 'DB切断呼び出し Exit Sub 色々と調べてみたものの、解決する気配がせず、どなたか知恵をお貸しください。

  • vbaで、postgresqlアクセス問題

    vbaで、postgresqlアクセス問題:      データベースに、データは ***0000, でも、vbaで、取得したのは ****.四つの0が自動に、削除されました。      例: postgresqlに、 40000 ⇒ vbaで、取得した: 4   vbaソース:  Option Explicit Sub subPgGetData() Dim adoCn As New ADODB.Connection On Error GoTo ErrLogin: With adoCn .Provider = "PostgreSQL OLE DB Provider" .Properties("Data Source") = Range("B1").Value .Properties("Location") = Range("B2").Value .Properties("User ID") = Range("B3").Value .Properties("Password") = Range("B4").Value .Open End With On Error GoTo 0 Dim adoRs As New ADODB.Recordset On Error GoTo ErrSql: adoRs.Open Range("B6").Value, adoCn, adOpenForwardOnly, adLockReadOnly On Error GoTo 0 Workbooks.Add Cells.CopyFromRecordset adoRs Cells.Columns.AutoFit adoRs.Close: Set adoRs = Nothing adoCn.Close: Set adoCn = Nothing Exit Sub ErrLogin: MsgBox "" & vbCrLf & Err.Number & vbCrLf & Err.Description Set adoCn = Nothing Exit Sub ErrSql: MsgBox "" & vbCrLf & Err.Number & vbCrLf & Err.Description Set adoRs = Nothing adoCn.Close: Set adoCn = Nothing Exit Sub End Sub わかる方はご指示ください。 よろしくお願いします。

  • [ACCESS/VBA]動的にSQL文をテーブルから抽出する方法?

    ボロボロです。知恵が足りずとても困っています。どなたか教えてください。 テーブル「T_SQL」の各レコードに、 クエリのSQL文(フィールド名=「strSQL」)と クエリ名(フィールド名=「QName」)と 通しNo.(フィールド名=「No」) をデータとして入力し、アクション等に応じて、「T_SQL」から 抽出したSQL文を、 マクロの「プロシージャの実行」の プロシージャ名 SetSQL("クエリー1",FindSQL(No)) により クエリ「クエリー1」に代入したいのです。 現在以下の通りに作りました。 'データベース定義 Public db As Database 'レコードセット定義 Public rs As Recordset Public Function SetSQL(QName As String, strSQL As String) CurrentDb.QueryDefs("QName").SQL = strSQL End Function Public Function FindSQL(No As String) Set db = CurrentDb() Set rs = db.OpenRecordset("T_SQL", dbopendynaset) strcriteria = "[No]='" & No & "'" rs.FindFirst strcriteria FindSQL = rs!strSQL rs.Close db.Close End Function これで実行すると、 「コンパイルエラー メソッドまたはデータメンバが 見つかりません」 というエラーメッセージが出ます。 ちょこちょこいろんなところを修正してみても、 このメッセージだけでなく他にもいろんな エラーメッセージが出ます。 冒頭に書いたような機能を可能にするには、 どのように記述すればよいのでしょうか?? ほんとにほんとに困っています。どなたか助けてください。

  • アクセスADOで更新クエリがエラーになる

    アクセスからYES/NO型をを含むテーブルをSQLサーバーへ移行したのですが アクセスから更新クエリを使ってYES/NO型のフィールドを全てFalseにしたいのですがエラーになってしまいます。 cn.Execute "UPDATE テーブル SET 返事 = False" このコードを アクセスからADOを使ってアクセスのテーブルに対して行えば問題なくできるのですが そのままSQLサーバーのテーブルに対して実行すると 「列名'False'が無効です」 となります。 そもそも列名は「False」ではなく「返事」です。 SQLサーバーでのデータ型は「bit」になっています。 何かわかる方御回答よろしくお願いします。

専門家に質問してみよう