ADOでエクセルを読む際のフィールドアクセスエラー

このQ&Aのポイント
  • ADOを使用してExcelの中身を見ようとしていますが、フィールド名がないために序数でアクセスしようとしています。しかし、「要求された名前、または序数に対応する項目がコレクションで見つかりません」というエラーが発生してしまいます。
  • 列名を指定すればアクセスできるため、序数の指定以外は問題ありません。以下のプログラムで試していますが、解決策はありますか?
  • 開発環境はVC++.Net Office2000 SDK開発です。TESTHRxls関数でレコードセットを作成し、Open関数でExcelファイルを開いています。その後、フィールドの個数を取得し、序数を指定してフィールドにアクセスしています。
回答を見る
  • ベストアンサー

ADOでエクセルを読む時にフィールドを序数でアクセスしたい

開発環境はVC++.Net Office2000 SDK開発  お世話になります。 ExcelをADOを使い中身を見ようとしているのですが、 フィールド名が無いので序数でフィールドにアクセスしようとしていますが 「要求された名前、または序数に対応する項目がコレクションで見つかりません」 とエラーが出てしまいます。 GetItemに序数を入れているつもりなのですがうまく行きません。 ただ、列名を入れればアクセスできるので、序数の指定以外は問題ないと思っています。 プログラムは以下のようにしていますが、何か解決の糸口はありませんか? TESTHRxls(lpRecordset.CreateInstance(__uuidof(Recordset))); TESTHRxls(lpRecordset->Open(bsCommand,bsConn,adOpenDynamic,adLockPessimistic,adCmdText)); lpRecordset->MoveFirst();//先頭へ移動 while(!(lpRecordset->EndOfFile)){ vIndex=1; _bstr_t testValue = lpRecordset->Fields->Count; int testValue2 = lpRecordset->Fields->GetItem(vIndex)->Value; lpRecordset->MoveNext(); }//--while(!(lpRecordset->EndOfFile)){ lpRecordset->Close();

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

  • ベストアンサー
  • mssine
  • ベストアンサー率24% (38/156)
回答No.1

ご指定の環境での経験が無いので、自信ありませんが、 まず、testValueは2以上ですよね? int testValue2 = lpRecordset->Fields->GetItem(vIndex)->GetValue(); または int testValue2 = lpRecordset->Fields->Item[vIndex]->Value; を試してみてください

oo5goo
質問者

お礼

回答ありがとうございます。 いろいろ探した所、Microsoftのサポートの中にVC++でエクセルにアクセスする場合の文章があり、 そこでVC++の場合にはGetValue()でアクセスするとの記述があり それで成功しました。 ご指摘の int testValue2 = lpRecordset->Fields->GetItem(vIndex)->GetValue(); で値の取得ができました。 ありがとうございました。

関連するQ&A

  • アクセス2013MoveNextでエラーになります

    Me.Recordset.MoveFirst i = 1 While (Not Me.Recordset.EOF) Me.フィールド = i i = i + 1 Me.Recordset.MoveNext Wend >Me.Recordset.MoveNext ここで、アクセス2010ではエラーになりませんが、アクセス2013でエラーになります。 > i = i + 1 この箇所にブレークポイントを入れて1回1回ストップ、再実行させるとエラーになりません。 なぜでしょう?対処法がありましたらご教授を。

  • ACCESS ADOのMovePreviousについて

    毎度お世話になっております。 ACCESS2003を使用しています。 ACCESS ADOにて、レコードセットがeofになった後、 MovePreviousをし、MoveNextをし、 さらにもう一度MovePreviousをすると、 最終レコードの一つ前に戻ってしまいます。 テーブル1 フィールド1 フィールド2    1     あ    2     い    3     う    4     え    5     お コード Sub test()   Dim cn As New ADODB.Connection   Dim rs As New ADODB.Recordset   Set cn = CurrentProject.Connection   rs.Open "select * from テーブル1 order by フィールド1", cn, adOpenDynamic, adLockReadOnly   Do Until rs.EOF    rs.MoveNext   Loop   rs.MovePrevious   Debug.Print rs.Fields("フィールド1").Value   rs.MoveNext   rs.MovePrevious   Debug.Print rs.Fields("フィールド1").Value   rs.Close: Set rs = Nothing   cn.Close: Set cn = Nothing End Sub 一度目のdebug.printは5に、 二度目のdebug.printは4になります。 このような仕組みなのでしょうか。 ご教授お願いいたします。

  • ADOを使用してExcelファイルをオープンするも読めないデータがある

    下記ソースでADOを使用してExcelファイルをオープンするも読めないデータが発生します。 読めないデータは UNO -------------------- 11 <-OK 32 <-OK 1-1 <-NG (Nullになる) 2-3 <-NG (Nullになる) 3-2 <-NG (Nullになる) 等ハイフンが入ったものが読めません。 対策はあるでしょうか。 Set rst = New ADODB.Recordset '+++++++++++++++++++++++++++++++++++ rst.Source = "Select UNITNO From [一般$] WHERE 会社='" & Combo3.Text & "' AND 場所='" & Combo5.Text & "'" rst.ActiveConnection = cn rst.CursorType = adOpenDynamic rst.Open , , , , adCmdText '------ icheck = 0 Do While Not rst.EOF If IsNull(rst.Fields("UNO")) = False Then Combo7.AddItem rst.Fields("UNO") End If rst.MoveNext Loop '----- rst.Close

  • VBAでのフィールド追加処理

    AccessVBAにて既に定義されているテーブルにフィールドを追加する処理にて、'**の部分でエラー(同名のフィールドが既にあるエラー)が起きます。以下の記述をしています。 フィールド追加は2つのテーブルに対して実施しています。 Do While iC < rstH.Fields.Count For Each fldLoop In tdfM.Fields sName = rstH.Fields(iC).Value If sName = fldLoop.Name Then 'H_workにはフィールドを設定 tdf1.Fields.Append tdf1.CreateField(sName, dbText, 100) Else Set fd = tdfM.CreateField(sName, dbText, 100) '空文字列の許可=true fd.AllowZeroLength = True tdfM.Fields.Append fd '** tdfM.Fields.Refresh 'Test tdf1.Fields.Append tdf1.CreateField(sName, dbText, 100) End If iC = iC + 1 If iC = rstH.Fields.Count Then Exit For End If rstH.MoveFirst Next fldLoop Loop 既に設定されているフィールド名の場合は、If sName=fldloop・・・の部分を通るはずですが、何故か 想定と違った分岐をしてしまっています。原因が解りません。どなたか教えて下さい。

  • 重複チェック

    いま、重複チェックをしているのですが、MoveFirstで データをある分だけ調べていて、データが重複してなかったら、データを更新したいのですが、はじめにMoveFirst で、データを調べたので、カレント行が最終行にあると思うので、それを例えば、3行目のデータだったり、5行目のデータを変更したいのですが、よろしくお願いします。 重複チェック rs.MoveFirst   Do While Not rs.EOF    If Text2(0).Text <> rs.Fields(1) Then rs.MoveNext End If Loop rs.Fields(1) = Text2(0).Text

  • AccessのDAOでフィールド名を配列に格納して・・・

    Access2000のDAOで下記のようなコードで複写元テーブルから複写先テーブルにデータを追加するとします。 Set Rs1 = Db.OpenRecordset("複写元", dbOpenTable) Set Rs2 = Db.OpenRecordset("複写先", dbOpenTable) Do Until Rs1.EOF Rs2.AddNew Rs2!FL1 = Rs1!名前 Rs2!FL2= Rs1!性別 Rs2!FL3= Rs1!郵便番号 Rs2!FL4= Rs1!住所    ・    ・ Rs2! FL50= Rs1! 50番目 Rs2.Update Rs1.MoveNext Loop 複写元のフィールドが50フィールドもあると、いちいちRs1!名前とかRs1!性別とか記述するのが大変ですし、ものすごく長いコードになります。そこで、配列にしてやったらどうだろうかとこんなことをしてみましたがだめでした。 Dim I Dim FieldsName FieldsName=Array("名前","性別",・・・"50番目")            ・            ・ Do Until Rs1.EOF Rs2.AddNew For I=0 To 49 Rs2!フィールド(I) = Rs1!FieldsName(I) Next Rs2.Update Rs1.MoveNext Loop じゃあTebleDifのTd.Fields().Nameを使って・・・・やっぱり失敗しました。 For I=0 To 49 Rs2!フィールド(I) = Rs1!Td.Fields(I).Name Next やりたいこと分かっていただけますでしょうか?要するにフィールド名を配列の様なもので格納しておいて、レコードの追加時に50回ループさせてRS2のフィールドにいれたいのです。何か良い方法は無いでしょうか。

  • Access2000上でのCStrコマンドの記述に関する質問です

    いつもお世話になっております。 Access2000で、あるデータをCSVファイルに変換しようと思って、各方面のご意見により、VBAで下記の通り記述し、実行致しました。 変換するフィールドの数が少なければ問題なく実行できますが、そのフィールド数が34種類以上になれば、「行継続文字( _ )を使いすぎています」との警告と共にエラーが発生します(なお、今回実行したいのは34種類のフィールドです)。 「CStr(adoRs.Fields("フィールド1").Value) ~ (adoRs.Fields("フィールド34").Value) 」と、1行で記述する等、何か良い方法がないものかと悩んでおります。 もし、解決方法をご存じの方がおられれば、その方法を教えて頂きたく、宜しくお願い致します。 ’--(ご参考)---------------------------------------------------- Dim adoRs As New ADODB.Recordset Dim strsql As String Dim strFile As String strsql = "SELECT フィールド1,フィールド2, ・・・・フィールド34" & _ "FROM ○○ファイル ORDER BY フィールド1" adoRs.Open strsql, CurrentProject.Connection strFile = "C:\AAAデータファイル.CSV" Open strFile For Output Access Write As #1 Do Until adoRs.EOF Write #1, _ CStr(adoRs.Fields("フィールド1").Value), _ CStr(adoRs.Fields("フィールド2").Value), _               ・                ・                ・ CStr(adoRs.Fields("フィールド34").Value) adoRs.MoveNext Loop adoRs.Close Close #1 ’---------------------------------------------------------

  • VC++でSQLServerにUpdateした際の更新件数

    Updateした時の更新件数は取得できないでしょうか。 以下のPGMで取得したいと思っています。 ★1の場合:更新はするけど、件数は取得出来ない。 ★2は _CommandのExecuteメソッドサンプルに件数取得方法が載っていたのですが、落ちる(catchされる) 何か良い方法ご存知の方教えて下さい。 _ConnectionPtr pConn; //Connectionオブジェクト _CommandPtr pCmd; // Commandオブジェクト _variant_t vtNull; //variant_t型NULL tagVARIANT *tUp; //更新件数を取得? try { pConn.CreateInstance(__uuidof(Connection)); pCmd.CreateInstance(__uuidof(Command)); //DB接続 pConn->CursorLocation = adUseClient; _bstr_t strConn("Provider=sqloledb;Data Source=127.0.0.1;Initial Catalog=TESTDB;User Id=testID;Password=Pass;"); pConn->Open(strConn, "", "", adConnectUnspecified); vtNull.vt = VT_ERROR; vtNull.scode = DISP_E_PARAMNOTFOUND; int lRow=0; tagVARIANT *tUp; // 更新処理 pCmd->ActiveConnection = pConn; pCmd->CommandText = "UPDATE T_TABLE SET NUM='123' where ID=TTD"; ★1 pRs = pCmd->Execute(NULL, NULL, adCmdText ); ★2 pRs = pCmd->Execute(tUp, NULL, adCmdText ); catch (_com_raise_error &p) { //エラー処理 } pConn->Close(); //Connectionオブジェクト return 0;

  • ExcelからAccessへの書き込み(VBA)

    ExcelからAccessへデータを書き込もうとしていますが、うまくいきません。原因は、フィールド名にあるような気がしますが、どなたかアドバイス頂けないでしょうか?宜しくお願いいたします。 Accessのテーブルで、フィールド名を ログイン名、名前、年齢、血液型、住まい1、住まい2、仕事、確認日時 としエクセルから With RecSet .Open MySQL, Excite_DB, , adLockOptimistic .AddNew With .Fields .Item("ログイン名").Value = "test_LogIn" .Item("名前").Value = "山田" .Item("年齢").Value = "25" .Item("血液型").Value = "A" .Item("住まい1").Value = "東京都" .Item("住まい1").Value = "新宿区" .Item("仕事").Value = "会社員" .Item("確認日時").Value = DateValue("2007/05/04 12:20") + TimeValue("2007/05/04 12:25") End With .Update .Close End With と書き込もうかとしたところ、実行時エラー:3265 要求された名前、または、序数に対応する項目がコレクションに見つかりませんとでます。が発生します。 そこで、 For Each MyField In .Fields Debug.Print MyField.Name Next とフィールド名を取得したところ ログイン名、Expr1001、Expr1002、Expr1003、住まい1、Expr1004、Expr1005、確認日時 となります。 そこで、書込み時のフィールド名を、"Expr1001"とすると今度は、 実行時エラー:-2147217887 UpdateまたはCancelupdeteメゾッドには、対応するAddNewまたは、Editメゾッドが必要ですになります。 よろしくお願いいたします。 Accessでは、間違いなくフィールド名が設定されているのですが、

  • ODBCでMoveNextがうまく動作しないようなのですが

    まだVB歴1年ないので説明もうまくできないかも知れませんが どなたか教えていただければ助かります。 Dim cn as ADODB.Connection Dim rs as ADODB.Recordset Set cn = New ADODB.Connection cn.IsolationLevel = adXactRepeatabelRead cn.Open ***** Set rs = New ADODB.Recordset rs.CursorType = adOpenDynamic rs.LockType = asLockPessimistic rs.ActiveConnection = cn rs.Open ***** 上記のように設定したのち データ読み込み rs.MoveFirst Do until rs.EOF aaa = rs.Fields("ID").Value    中略 rs.MoveNext Loop ファイルクローズして他の処理したのち 再びファイルオープンして rs.MoveFirst For *** Set rs = cn.Execute("UPDATE テーブル名 SET ID = ***** ") 中略 rs.MoveNext Next *** ファイルクローズ 上記のMoveNextがおかしいと思うのですが 他のところかもしれませんが悩んでいます。 この内容でわかっていただけるか心配ですが よろしくお願いします。

専門家に質問してみよう