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

このQ&Aのポイント
  • ADOを使用してExcelファイルをオープンする際に、読めないデータが発生する問題があります。
  • 具体的には、ハイフンが含まれたデータ(例: 1-1, 2-3, 3-2)がNullになってしまいます。
  • この問題に対して、どのように対策を行えば良いのでしょうか?
回答を見る
  • ベストアンサー

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

  • obone
  • お礼率51% (111/215)

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

  • ベストアンサー
noname#259269
noname#259269
回答No.1

コネクションオブジェクトに Extended Properties パラメータを指定し、そこに IMEX=1 を追加します。意味は Google でどうぞ。 Extended Properties の指定の仕方は、 http://msdn.microsoft.com/ja-jp/library/dd148538.aspx このページを "Extended Properties" で検索してみてください。

obone
質問者

お礼

下記でうまくなりました。 ありがとうございました。 Set cn = New ADODB.Connection cn.Provider = "Microsoft.Jet.OLEDB.4.0" cn.Properties("Extended Properties").Value = "Excel 8.0;IMEX=1" cn.Properties("Data Source") = App.Path & "\仕様.xls" cn.Open

関連するQ&A

  • ADOを使用してExcelファイルをオープンし、内部結合したい。

    エクセルに2つのシートがあります。 シート名"男性用","女性用" それぞれのシートに"名前"の列があります。 この2つのシートを内部結合して検索したいのですが 可能でしょうか ----------------------シート1個の場合 Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Provider = "Microsoft.Jet.OLEDB.4.0" cn.Properties("Extended Properties") = "Excel 8.0" cn.Properties("Data Source") = App.Path & "\test.xls" cn.Open Dim cmd As ADODB.Command Set rst = New ADODB.Recordset rst.Source = "Select * From [男性用$]" rst.ActiveConnection = cn rst.CursorType = adOpenDynamic rst.Open , , , , adCmdText '------------------------------ これで取り出せますがシート2つを内部結合させたいばあい rst.Source = "Select * From [男性用$]" はどう変えたらいいでしょうか excelでなければ select * from 男性用 inner join 女性用 on 男性用.名前=女性用.名前 となると思いますが。

  • VB6.0でエクセルを扱うプログラムについて

    こんにちは。VB初級者です。宜しくお願いします。 現在、VB6.0でエクセルの表を操作するようなプログラムを作っています。下に書いたプログラム(わかりにくいとは思いますが、ご教授お願いします。)で値の更新は出来たようなのですが、実際に表を開こうとすると”不正な処理が行われました”というエラーメッセージが出て開くことが出来ません。ADOオブジェクトでエクセルを扱うのがちょっとおかしい(?)のかもしれませんが、今回はEXCELオブジェクトは使わないという方針です。 自分ではどこが間違っているかわかりませんでしたので教えて頂ければと思います。宜しくお願い致します。 Private Sub Command1_Click() Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Provider = "Microsoft.Jet.OLEDB.4.0" cn.Properties("Extended Properties") = "Excel 8.0" cn.Properties("Data Source") = "C:\VB\株価管理\株価.xls" cn.Open Dim cmd As ADODB.Command Dim mySQL As String mySQL = "update [株価$] set 高値 =10000 where 高値 = 7" Set cmd = New ADODB.Command cmd.ActiveConnection = cn cmd.CommandText = mySQL cmd.Execute Set rst = New ADODB.Recordset rst.Source = "Select * From [株価$]" rst.ActiveConnection = cn rst.CursorType = adOpenDynamic rst.Open , , , , adCmdText Do While Not rst.EOF Debug.Print rst.Fields("高値") rst.MoveNext Loop rst.Close cn.Close Set rst = Nothing Set cn = Nothing Set cmd = Nothing End Sub

  • VBAからaccessへの接続で、RecordsetのCursorTypeが勝手に変更される

    エクセルVBAからaccessへの接続で、RecordsetのCursorTypeが勝手に変更されてしまいます。 Dim rst As New ADODB.Recordset rst.CursorType = adOpenStatic と「adOpenStatic」に設定したいのですが、 Set rst = con.Execute(sql_str, , adCmdText) のようにクエリを実行した直後にCursorTypeを調べると、「adOpenForwardOnly」に変わってしまっています。 (設定直後に調べると、ちゃんとadOpenStaticになっています) 「CursorType」を何に設定しても、Execute直後に「adOpenForwardOnly」になってしまっていまうようです。 CursorTypeをadOpenStaticにして、RecordCountを使いたいのですが、、、 CursorTypeが変わってしまう原因をお知りの方は、教えていただけるとありがたいです。 Dim rst As New ADODB.Recordset Dim con As New ADODB.Connection con.Open "Provider=Microsoft.jet.OLEDB.4.0;" & "Data Source=" & ThisWorkbook.Path & "\" & mdb_file & ";" rst.CursorType = adOpenStatic rst.LockType = adLockReadOnly MsgBox "前 = " & rst.CursorType Set rst = con.Execute(sql_str, , adCmdText) MsgBox "後 = " & rst.CursorType

  • ADOを使用してExcelファイルをオープンした場合にリソースが解放されない

    こんにちは。 いつもお世話になっております。 Excelがインストールされていない環境でExcelファイルの中身を参照するために ADOを使用した処理を実装しています。 以下のようなコードで動作しましたが、一度処理を実行後に続けて処理を実行した場合に ファイルアクセスのエラー(ConnectionのOpen時)が発生してしまいます。 (実行時エラー'2147418113 (8000ffff)'「致命的なエラーです。」) EXEを終了し、再度処理を実行するとうまく動作します。 おそらくExcelファイルのインスタンスが解放できていないという類のエラーであると思いますが、原因が分かりません。 (EXE起動後の2回目の処理で必ず発生するわけではなく、3回目の場合があるのも謎です。) 何か分かりましたらご教示下さい。 --------------------------------------------------------------------------------- inputFileName = App.Path + "\test.xls" outPutFileName = App.Path + "\test.csv" On Error GoTo errorHdr Set cn = New ADODB.Connection With cn .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=" + inputFileName + ";" + "Extended Properties=Excel 5.0;" .Open End With strSQL = "SELECT * FROM [sheet1$]" Set rs = New ADODB.Recordset rs.CursorLocation = adUseClient rs.Open strSQL, cn, adOpenDynamic, adLockReadOnly, adCmdText On Error GoTo 0 x = FreeFile Open outPutFileName For Output As #x Do Until rs.EOF buff = "" For col = 1 To rs.Fields.Count If col < rs.Fields.Count Then buff = buff & rs.Fields(col - 1).Value & "," Else buff = buff & rs.Fields(col - 1).Value End If Next If Len(buff) = rs.Fields.Count - 1 Then Exit Do End If Print #x, buff rs.MoveNext Loop Close #x rs.Close Set rs = Nothing cn.Close Set cn = Nothing MsgBox "完了しました。", vbInformation Exit Sub errorHdr: On Error GoTo 0 MsgBox "ファイルのオープンに失敗しました。", vbCritical If rs Is Nothing = False Then If rs.State = adStateOpen Then rs.Close End If Set rs = Nothing End If If cn.State = adStateOpen Then cn.Close End If Set cn = Nothing End Sub --------------------------------------------------------------------------------- <環境> Windows 2000(SP4), VB6.0(S6) ※ExcelファイルはExcel 95で作成(2500行×15列程度)

  • SQL文のWHERE

    VB6.0 ACCESSで開発しています。 下記のように日付で検索をしているのですが 社員コードでも検索をしたいのですがうまくいきません。 rst.Source = "SELECT * FROM t_nyuryoku Where 日時 = '" & Text3.Text & "'の部分を rst.Source = "SELECT * FROM t_nyuryoku Where 日時 = '" & Text3.Text & "' AND 社員コード = '" & Label1.Caption & "' としたのですがうまく検索できません。 よくわかりません。 Dim cn As New ADODB.Connection Dim rst As ADODB.Recordset Set cn = New ADODB.Connection cn.ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\temp\db2.mdb" cn.Open Set rst = New ADODB.Recordset rst.Source = "SELECT * FROM t_nyuryoku Where 日時 = '" & Text3.Text & "' rst.ActiveConnection = cn rst.CursorType = adOpenStatic rst.LockType = adLockOptimistic rst.Open

  • EXCEL ADO接続についておしえてください!

    コネクションを一つ、レコードセットを3つ開いて、エクセルのデータを取り込むというコードを書いたのですが、’このコンテキストで操作は許可されていません’というエラーが出てしまいます。 どなたか解決策わかる方いらっしゃいましたらお願いします。 コードは↓ Dim WS1 As New Worksheet Set WS1 = Sheets("入力") myCon.Open conSTR1 myRS.Open "流動中現品", conSTR1, adOpenDynamic, adLockPessimistic myRS1.Open "次待機現品", conSTR1, adOpenDynamic, adLockPessimistic myRS2.Open "次次待機現品", conSTR1, adOpenDynamic, adLockPessimistic For i = 0 To 71 myRS.Fields("ロットNo.") = WS1.Range("E3").Offset(i) myRS1.Fields("ロットNo.") = WS1.Range("K3").Offset(i) myRS2.Fields("ロットNo.") = WS1.Range("T3").Offset(i) myRS.Fields("製造No.") = WS1.Range("AA3").Offset(i) myRS.Fields("品種") = WS1.Range("G3").Offset(i) myRS1.Fields("品種") = WS1.Range("R3").Offset(i) myRS2.Fields("品種") = WS1.Range("CX3").Offset(i) If WS1.Range("H3").Offset(i) <> "" Then myRS.Fields("製品") = Round(WS1.Range("H3").Offset(i), 1) ElseIf WS1.Range("S3").Offset(i) <> "" Then myRS1.Fields("製品") = Round(WS1.Range("S3").Offset(i), 1) ElseIf WS1.Range("CY3").Offset(i) <> "" Then myRS2.Fields("製品") = Round(WS1.Range("CY3").Offset(i), 1) End If For a = 1 To 15 myRS.Fields(a & "現品目") = WS1.Range("AY3").Offset(i, a - 1) myRS1.Fields(a & "現品目") = WS1.Range("BO3").Offset(i, a - 1) myRS2.Fields(a & "現品目") = WS1.Range("CE3").Offset(i, a - 1) Next myRS.MoveNext Next myRS.Close: myRS1.Close  ←この部分でエラーがでます!! myCon.Close: Set myCon = Nothing End Sub

  • Excel VBAでXML形式のデータを扱いたい

    SQL ServerにXML形式のデータが"1つのカラムにロングテキスト(ntext)形式で格納"されています。 このデータをExcelのVBAで取得したのは良いのですが、XML文書からタグを指定して任意の値を取得する方法がわかりません。 とりあえず以下のように普通の取得をするまでは書いてみました。 --- Sub GetXMLDataFromSQLServ() Dim CNN As ADODB.Connection Dim RST As ADODB.Recordset Dim RecCt As Long Dim strCNN As String Dim strData1 As String Dim strData2 As String Dim xmlTest As MSXML2.DOMDocument 'Connection String strCNN = "driver={SQL Server}; server=appdemo; uid=userid; pwd=password; database=database" Set CNN = New Connection CNN.ConnectionTimeout = 30 CNN.Open strCNN 'レコードセットを開く Set RST = New ADODB.Recordset RST.CursorType = adOpenStatic RST.Open "SELECT * FROM G_JOB_CONTENT;", strCNN RST.MoveFirst 'シートに出力 Do Until RST.EOF ActiveCell.Value = RST.Fields("JOB_ID") ActiveCell.Offset(0, 1).Value = RST.Fields("XML") '---(1) RST.MoveNext ' ActiveCell.Offset(1, 0).Activate Loop 'レコードセットを閉じる Set RST = Nothing '接続を閉じる Set CNN = Nothing End Sub --- (1)の部分でXMLのタグを指定し、任意のデータを得たいと考えています。 参照設定などを見て、おそらくMSXML2オブジェクトを使うのかな、というところまでは想像ついたのですけど・・・。 どなたかご教示の程をお願いいたします。

    • ベストアンサー
    • XML
  • 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();

  • MDBをADO接続でINSERT・UPDATE・DELETE

    VB2005.NETの初級開発者です。 MDBをADO接続で開発を行いたいのですが 記述の方法がわかりませんので教えて下さい。 下記のようなサンプルはネット上でもよく見るのですが INSERT分で記述を行いたいのですが、サンプルが見つかりません よろしくお願いします。 後、CurrentProject.Connection.Execute strSQL, , adCmdTex このような記述をネット上で見るのですがstrSQLにInsert分を 記述すれば良いのですか、わからないので教えて下さい。 また、下記の記述の方がよいのですか? Dim ct As New Connection() Dim rt As New Recordset() ' 接続文字列を設定 ct.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\test.mdb" ' データベースに接続 ct.Open() ' テーブルを指定し、レコードセットをオープン With rt .CursorType = CursorTypeEnum.adOpenDynamic .LockType = LockTypeEnum.adLockOptimistic .Open("Insert_Tbl", ct, , , CommandTypeEnum.adCmdTable) End With ' データを追加 With rt .AddNew() .Fields("aaa").Value = TextBox1.Text .Fields("bbb").Value = TextBox2.Text .Update() End With

  • ExcelからAccess2013DBを更新する時

    Excel2013 vba-> Access2013 mdbファイル 問題点:以下のソースを実行すると、エラーが発生します。このエラーをなくしてアクセスデータベースのテーブルの情報の更新、新規追加、削除を行いたいです。 エラー内容:実行時エラー'3251' 現在のRecordsetは更新をサポートしていません。プロバイダーか、選択されたロックタイプの限界の可能性があります。 ソース: Sub 登録処理()   Dim Rst As adodb.Recordset   Dim SQL As String   Dim Rg As Range   Dim RgData As Range   Dim lngLastRow As Long   Dim RgDel As Range      On Error GoTo errH      Set RgData = mySh.Range("B2")   lngLastRow = RgData.End(xlDown).Row   Set RgData = mySh.Range(RgData, mySh.Range("AB" & lngLastRow))      SQL = "Select * from [会社管理テーブル]"   Call DBconection2   Set Rst = New adodb.Recordset   With Rst     .ActiveConnection = Cn     'SQL文でテーブル名と抽出条件を指定する     .Source = SQL     .CursorLocation = 3 ' クライアントサイドカーソルに変更     .Open        End With      Dim y As Long      Sheets("会社管理").Select      If Rst.EOF = False And Rst.BOF = False Then          For i = 1 To RgData.Rows.Count              If Cells(i + 1, 1).Value = "変更" Then         Rst.MoveFirst         Rst.Find "[施工会社ID]=" & RgData(i, 1).Value         If Rst.EOF Then                    Else           Rst.Fields("会社ID").Value = RgData(i, 2).Value           Rst.Fields("会社名").Value = RgData(i, 3).Value           Rst.Fields("フリガナ").Value = RgData(i, 4).Value              Rst.Update         End If         Cells(i + 1, 1).Value = ""       ElseIf Range(i, 1).Value = "削除" Then         Rst.MoveFirst                  Rst.Find "[会社ID]=" & RgData.Cells(i, 1).Value         If Rst.EOF Then                    Else           Rst.Delete         End If         Set RgDel = Rows(i + 1 & ":" & i + 1)         RgDel.Select         RgDel.Delete                ElseIf Range(i, 1).Value = "新規" Then         Rst.AddNew         Rst.Fields("会社ID").Value = RgData(i, 2).Value         Rst.Fields("会社名").Value = RgData(i, 3).Value         Rst.Fields("フリガナ").Value = RgData(i, 4).Value         Rst.Update         Cells(i + 1, 1).Value = ""       End If            Next i        End If exitH:      Rst.Close: Set Rst = Nothing   Call DBclose2   Exit Sub         errH:   MsgBox Err.Number & "(" & Err.Description & ")"   GoTo exitH    End Sub Sub DBconection2()   Set Cn = New adodb.Connection   Cn.Provider = "Microsoft.Jet.OLEDB.4.0"   Cn.Open modPublic.DBPATH    End Sub Function MakeDBconection() As adodb.Connection   Set Cn = New adodb.Connection   Cn.Provider = "Microsoft.Jet.OLEDB.4.0"   Cn.Open modPublic.DBPATH      Set MakeDBconection = Cn    End Function Sub DBclose2()   Cn.Close   Set Cn = Nothing End Sub Sub EraseContents(s_Rg As Range)   s_Rg.ClearContents    End Sub 誰か、解決方法がおわかりの方がいましたら、アドバイスをよろしくお願いします。

専門家に質問してみよう