はじめまして、早速ですみませんがよろしくお願いします。
VB6.0ではできていたのですがVB2005だとうまくいきません。
プログラムはボタンとテキストボックスがありテキストボックスに
入れた内容をみて指定したエクセルのシートから検索して特定の列の
結果を返すというものです。
コードは以下になります。
Dim cn As ADODB.Connection
cn = New ADODB.Connection
Dim rs As ADODB.Recordset
Dim SQL As String
Dim KURO As String
Dim KURO1 As String
Dim KURO2 As String
With cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=C:\test.xls;" & _
"Extended Properties=Excel 8.0;PersistSecurityInfo=False"
.Open()
End With
rs = New ADODB.Recordset
SQL = "SELECT * FROM [TEST$]"
rs.Open(SQL, cn, ADODB.CursorTypeEnum.adOpenStatic)
KURO1 = TextBox1.Text
KURO = "品名=" & "'" & KURO1 & "'"
rs.Find(KURO, 0, ADODB.SearchDirectionEnum.adSearchForward)
If rs.EOF Then
MessageBox.Show("見つかりませんでした")
Else
KURO2 = rs("NCNO")
MessageBox.Show(KURO2)
End If
rs.Close()
cn.Close()
rs = Nothing
cn = Nothing
以上です。
エラー内容としましては実行させ検索にかかるような文字をいれボタンを押すとKURO2 = rs("NCNO")のところで引っかかります。
検索に引っかからなかったときの("見つかりませんでした")はでるのですが・・・。
よろしくお願いします。
推測:
VB.NETでは対応できない Or VB2005のバグ
VB2005のバグであれば、VB2008に更新し、
VB.NET非対応コードであれば、
コード変更
おそらく、コード変更だと思います
ビルド正常終了しますか?
>>VB2005のバグであれば、VB2008に更新し
VB2008への更新はやっぱりキツイですよね・・・
何というエラーが出るんです?
インポートモードで実行してみてください。
〜;Extended Properties=Excel 8.0;〜 ではなく、
〜;Extended Properties="Excel 8.0;IMEX=1;"〜 という感じで。
それと、Nothing を代入する前に、Marshal.ReleaseComObject の呼び出しを
行うようにしてください。そもそも、このような場合の Nothing 代入は、
(VB6などの場合とは違って)オブジェクトの即時解放を意味しないため、
あまり意味がありません。
キャストで失敗していませんか?
> KURO2 = rs("NCNO")
KURO2 = rs("NCNO").Value
とか。
Marshal.ReleaseComObject はお忘れなく。
> KURO2 = rs("NCNO").Value
Valueを使うよりは、
KURO2 = rs.Collect("NCNO")
の構文をお薦めします。
Collect の場合は、直接、フィールドの値を操作する事ができますが、
rs("NCNO").Value の構文の場合、Recordset オブジェクトから
Fields コレクション
Field オブジェクト
Value プロパティ
の 3 段階のアクセスが発生してしまうためです。
(Field オブジェクトを変数にキャッシュした場合は、Collect よりも効率が良いのですが)
なお、Recordset や Connection は COM オブジェクトであるため、
Marshal.ReleaseComObject の対象となります。
また、Fields や Field については、msado15.dll (から生成される Interop.ADODB.DLL) を
参照設定したときは、Marshal.ReleaseComObject の対象となりますが、
PIA である ADODB.DLL を参照設定した時は、Fields や Field は
マネージであるため、Marshal.ReleaseComObject の対象外となります。
ツイート | ![]() |