dポイントプレゼントキャンペーン実施中!

ドラえもん 2012-10-29(月) 10:30

ホームページで公開されていたVBAを流用して、EXCELからデータベースの更新、削除をしようとしています。
データベースの更新に関してはうまく動作するのですが、データ削除を実施すると、
440)データをフェッチ中にエラーが発生しました。ORA-01722数値が無効です。
というエラーが発生してしまいます。

01722のエラー内容をホームページ並びに、本サイトで検索したのですが、
データの型が違うという内容で、類似の内容が無い状況でした。
型が違うという内容に対して、何をどうしたらよいかが分かりません。
コーディングのミスを指摘いただきたく
よろしくお願いいたします。
VBAまったくの初心者です。

下記は、マクロの構成です。
(1)B3からR***の領域にデータベースからダウンロードしたデータが表示される。
 ***は列数でデータベースの項目数で変化する
(2)B2からR2には項目名称が表示されている。
(3)編集用の領域はT2からAJ2に(2)と同じ項目名を表示する。
(4)編集用のデータ領域はT3からAJ20まで。

※ID並びにパスワードは実際のものから変更しています。
 ORACLE9.0 EXCEL2003
-------------------------------------------------------------
'「データの削除」ボタン押下後の処理
' oo4o使用時
Private Sub btnDeleteDataoo4o_Click()
On Error GoTo ERR_HANDLER
'oo4o用のオブジェクト変数の宣言
Dim OraSession As Object 'セッション
Dim OraDatabase As Object 'データベース
Dim rs As Object 'データセット(レコードセット)
Dim rownum As Long
Dim colnum As Integer
Dim sSQL As String

'削除対象のみを抽出するSQL文の作成
sSQL = "select * from M_TOOL_MEISAI where LINECD=" & ActiveSheet.Cells(3, 20)
For rownum = 4 To 20
If ActiveSheet.Cells(rownum, 20) = "" Then
Exit For
End If
sSQL = sSQL & " OR LINECD=" & ActiveSheet.Cells(rownum, 20)
Next

'oo4oセッションオブジェクトの生成
Set OraSession = CreateObject("OracleInProcServer.XOraSession")
'oo4oデータベースオブジェクトの生成(DBへUserID:○、パスワード:×で接続)
Set OraDatabase = OraSession.OpenDatabase(ActiveSheet.Cells(26, 1), "○/×", 0&)
'oo4oデータセット(レコードセット)の生成(削除対象データのみを返すレコードセットの生成)
Set rs = OraDatabase.CreateDynaset(sSQL, 0&)

'レコードセット内の全レコードの削除
Do Until rs.EOF
rs.Delete
rs.MoveNext
Loop
'オブジェクトのクローズ
rs.Close

'データ表示の更新
btnGetDataoo4o_Click

QUIT_OPER:
'オブジェクト変数用に確保したメモリの開放
Set rs = Nothing
Set OraDatabase = Nothing
Set OraSession = Nothing
Exit Sub
ERR_HANDLER: 'エラー処理
'エラー番号とエラー内容の表示
MsgBox Err.Number & ")" & Err.Description
Err.Clear
GoTo QUIT_OPER
End Sub

-------------------------------------------------------------------------------
以上がエラーが発生するVBA
下記は、更新処理で正しく動作するVBA
-------------------------------------------------------------------------------

'「データの更新」ボタン押下後の処理
' oo4o使用時
Private Sub btnUpdateDataoo4o_Click()
On Error GoTo ERR_HANDLER
'oo4o用のオブジェクト変数の宣言
Dim OraSession As Object 'セッション
Dim OraDatabase As Object 'データベース
Dim rs As Object 'データセット(レコードセット)
Dim rownum As Long
Dim colnum As Integer

'oo4oセッションオブジェクトの生成
Set OraSession = CreateObject("OracleInProcServer.XOraSession")
'oo4oデータベースオブジェクトの生成(DBへUserID:○、パスワード:×で接続)
Set OraDatabase = OraSession.OpenDatabase(ActiveSheet.Cells(26, 1), "○/×", 0&)
'oo4oデータセット(レコードセット)の生成(全データを返すレコードセットの生成)
Set rs = OraDatabase.CreateDynaset("select * from M_TOOL_MEISAI", 0&)

'データの更新
For rownum = 3 To 20
If ActiveSheet.Cells(rownum, 20) = "" Then
Exit For
End If
'更新対象データの検索
rs.Findfirst ("LINECD=" & ActiveSheet.Cells(rownum, 20))
'編集モードに設定
rs.Edit
For colnum = 1 To rs.Fields.Count - 1
Select Case rs(colnum).Type
Case 10
rs(colnum).Value = ActiveSheet.Cells(rownum, colnum + 20)
Case 8
rs(colnum).Value = CDate(ActiveSheet.Cells(rownum, colnum + 20))
Case Else
rs(colnum).Value = ActiveSheet.Cells(rownum, colnum + 20)
End Select
Next
rs.Update
Next
'オブジェクトのクローズ
rs.Close

'データ表示の更新
btnGetDataADO_Click

QUIT_OPER:
'オブジェクト変数用に確保したメモリの開放
Set rs = Nothing
Set OraDatabase = Nothing
Set OraSession = Nothing
Exit Sub
ERR_HANDLER: 'エラー処理
'エラー番号とエラー内容の表示
MsgBox Err.Number & ")" & Err.Description
Err.Clear
GoTo QUIT_OPER
End Sub

A 回答 (1件)

LINECDの型は数値型なんですよね?



エラー発生時の、sSQLの中身はどうなっていますか?
実行直前にブレークポイントを張って、値を確認するなり、
Debug.Printでイミディエイトウィンドウに出力するなりして確認してみて下さい。

"LINECD = OR"みたいに、=の右辺に値が無かったり、
"LINECD = '001 OR"みたいに、=の右辺に数値以外の文字があったりしませんか?

たぶん、Cells(3, 20)~Cells(20, 20)に空のセルがあったり、数値以外が入ったりしているんじゃないかと思います。

この回答への補足

LINECDの型は数値です。
sSQLの中身に関して、値の確認方法を勉強します。

Cells(3,20)~Cells(20.20)に数値以外は存在します。
しかしながら、更新処理はエラーが出ないのです。

まずは、sSQLの値を見てみます。

補足日時:2012/10/29 17:07
    • good
    • 0
この回答へのお礼

いろいろ調べたのですが、よく分かりませんでした。
いつまでも受付状態にしておくのは失礼なので、いったん受付終了にします。
もう少し勉強したいと思います。

お礼日時:2012/11/08 10:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す