セル値参照でデータベースから範囲抽出について困っています

このQ&Aのポイント
  • セル値を元にデータ抽出するためのVBAが正しく動作せず困っています。
  • V_JISKDATEの列には特定の日付データが入っていますが、月単位でデータをExcelに取り出したいと考えています。
  • 範囲指定をセルの値から参照して実行させたいのですが、正しく動作しないエラーが出ています。どう修正すればいいでしょうか?
回答を見る
  • ベストアンサー

セル値参照でデータベースから範囲抽出

セル値を元にデータ抽出する内容でVBAが正しく動作せず困っています。 V_JISKDATEの列に下記の様に文字列日付が入っています。 201210010830 (2012年10月1日8時30分というデータです) 月単位でデータをEXCELに取り出したいので、 下記の様に範囲指定を実施しました。 これに関しては正しく動作します。 Set rs = OraDatabase.CreateDynaset("select * from T_MANHOUR_DETAILS where V_JISKSTDATE> '201210' AND V_JISKSTDATE <'201211'", 0&) 次に範囲指定をセル値から参照して実行させたいので、 セル値を変数扱いで下記内容を追加しました。 A10に201210 A11に201211 が入っています。 下記、追加及び変更部 Dim ST As String Dim Ed As String ST = Range("A10") Ed = Range("A11")   … where V_JISKSTDATE > 'ST' AND V_JISKSTDATE < 'ED'", 0&) これだとだんまりで正しく動作しません。 変数部の'を取り下記の様にすると、   … where V_JISKSTDATE > ST AND V_JISKSTDATE < ED", 0&) 実行時エラー'440': オートメーションエラーです。 とのエラーが出ます。 文字を<>で比較するのが怪しい感じがするのですが…。 どこを直せばよいのか教えていただきたく。 下記は10月分が正しく抽出される全文です。 ---------------------------------------------------------- Private Sub btnGetDataoo4o_Click() 'oo4o用のオブジェクト変数の宣言 Dim OraSession As Object 'セッション Dim OraDatabase As Object 'データベース Dim rs As Object 'データセット(レコードセット) Dim rownum As Long Dim colnum As Integer 'セッションオブジェクトの生成 Set OraSession = CreateObject("OracleInProcServer.XOraSession") 'oo4oデータベースオブジェクトの生成(DBへUserID:ID、パスワード:PWで接続) Set OraDatabase = OraSession.OpenDatabase(ActiveSheet.Cells(26, 1), "ID/PW", 0&) 'oo4oデータセット(レコードセット)の生成(全データを返すレコードセットの生成) Set rs = OraDatabase.CreateDynaset("select * from T_MANHOUR_DETAILS where V_JISKSTDATE> '201210' AND V_JISKSTDATE <'201211'", 0&) 'すでに表示されている内容のクリア Call ClearDisp 'フィールド名の表示 For colnum = 0 To rs.Fields.Count - 1 ActiveSheet.Cells(2, colnum + 3) = rs(colnum).Name Next 'データの表示 rownum = 0 Do Until rs.EOF For colnum = 0 To rs.Fields.Count - 1 ActiveSheet.Cells(rownum + 3, colnum + 3) = rs(colnum).Value Next rs.MoveNext rownum = rownum + 1 Loop 'セル幅の自動調整 ' ActiveSheet.Columns("B:AU").EntireColumn.AutoFit 'オブジェクトのクローズ rs.Close '各種オブジェクトの開放 Set rs = Nothing Set OraDatabase = Nothing Set OraSession = Nothing End Sub ---------------------------------------------------------- EXCEL2003 ORACLE V9.0です

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

  • ベストアンサー
  • STICKY2006
  • ベストアンサー率29% (1536/5269)
回答No.1

こん竹輪。 未検証です。 可能性の提示だけ。 >>Set rs = OraDatabase.CreateDynaset("select * from T_MANHOUR_DETAILS where V_JISKSTDATE> '201210' AND V_JISKSTDATE <'201211'", 0&) Set rs = OraDatabase.CreateDynaset("select * from T_MANHOUR_DETAILS where V_JISKSTDATE > 'ST' AND V_JISKSTDATE < 'ED'", 0&) こゆことですよね。 Set rs = OraDatabase.CreateDynaset("select * from T_MANHOUR_DETAILS where V_JISKSTDATE > '" & ST & "' AND V_JISKSTDATE < '" & ED & "'", 0&) こゆことかな。 「""」で囲まれた箇所は文字列だから、'ST'と'ED'をそのまま受け取って、比較できず結果が出ない。 個人的には、SQL文を組む場合には Dim SQL_STR As String set SQL_STR = "select * from T_MANHOUR_DETAILS where V_JISKSTDATE > '" & ST & "' AND V_JISKSTDATE < '" & ED & "'" Set rs = OraDatabase.CreateDynaset(SQL_STR, 0&) こんな感じにしておく方が好きです。 デバック時に、「print SQL_STR」のようにしておけば、それが正しいSQL文になってるのか。が確認しやすいので。 もう一つは「データ型変換」 。。。今回は大丈夫そうだけど。。。 >>V_JISKDATEの列に下記の様に文字列日付が入っています。 >>201210010830 まぁ、多分、STRING系のデータ型ですよね。 Dim ST As String なので、まあ、今回は大丈夫そうですけど。。。 たまにやらかすのが、 Dim ST As int にした。とか。 201210 なので、まぁ、入るっちゃ入りますが 201210010830 にした場合とかは、まぁ、格納時にエラーになるかな。。。 castだかconvertだか、CintだかCstrだか。。。忘れましたが(おい データ型を気にして、明記しておく事が必要になったりする事もあるので、覚えておくといいかもです。

3620313
質問者

お礼

補足の 確認しましたが、エラー出ます。 は勘違いでした。 大変失礼しました。 異なる要因(データベース接続設定が消去されていました)でエラーが出ており、教えていただいた内容で正しく動作しました。 ありがとうございます。 SQL_STR = の部分が反転表示され、 コンパイルエラーオブジェクトが必要です。 とエラーが表示されます。 は、補足の通りですが、こちらに関しては勉強するということで、 いったん受付終了させていただきます。 本当に助かりました。

3620313
質問者

補足

確認しましたが、エラー出ます。 Set rs = OraDatabase.CreateDynaset("select * from T_MANHOUR_DETAILS where V_JISKSTDATE > '" & ST & "' AND V_JISKSTDATE < '" & ED & "'", 0&) 実施しました。 変わらず実行時エラー'440': オートメーションエラーでます。 Dim SQL_STR As String set SQL_STR = "select * from T_MANHOUR_DETAILS where V_JISKSTDATE > '" & ST & "' AND V_JISKSTDATE < '" & ED & "'" Set rs = OraDatabase.CreateDynaset(SQL_STR, 0&) 実施しました。 SQL_STR = の部分が反転表示され、 コンパイルエラーオブジェクトが必要です。 とエラーが表示されます。

関連するQ&A

  • データベース更新時間を短くしたい

    環境 EXCEL2003-Oracle Database 11g Release 2 Client(11.2.0.1.0) for Microsoft Windows(32-bit) excelマクロでデータベース更新時間を短くする方法を教えていただきたく。 オラクルのデータベースに作業時間の実績が登録されるAシステムがあります。 このAシステムはBシステムと連携しています。 Bシステムのチームコード変更は10/6までに対応される予定で、 それと連携してAシステム側もチームコード変更が必要になります。 Aシステム側の変更は、いろんなテーブルにチームコードが関連しているので、 暫定対策として、AからBにデータを渡すテーブルのみチームコードを変更しようとしています。 OSQLというツールで実績のチームコードを変更してもよいのですが、 編集で開いてしまうと、実績収集が停止してしまう為、実績を変更するexcelマクロを作成しました。 ところが、実際に動かしてみると、とても長い時間がかかってしまいます。(10分程度) 下記がマクロです。 マクロはいろんなサイトから寄せ集めたもので、私はマクロに関しては全くの初心者です。 なので、実際のコードでどこをどの様に変更したらよいかを教えていただきたく。 Private Sub man_Click() 'MANテーブルから登録されている実績をダウンロードする Sheets("man_koshin").Select Call ClearmanDisp 'oo4o用のオブジェクト変数の宣言 Dim OraSession As Object 'セッション Dim OraDatabase As Object 'データベース Dim rs As Object 'データセット(レコードセット) Dim rownum As Long Dim colnum As Integer Dim ID As String Dim ED As Long Dim SQL_STR As String Application.ScreenUpdating = False 'sheet2のA1セルを参照し、接続先を切り替える ID = Sheets("sheet2").Range("A1") 'セッションオブジェクトの生成 Set OraSession = CreateObject("OracleInProcServer.XOraSession") '接続環境 'oo4oデータベースオブジェクトの生成(DBへUserID:im、パスワード:intで接続) Set OraDatabase = OraSession.OpenDatabase(ID, "im/int", 0&) 'MANテーブルから2013.10以降の実績を取得する Set rs = OraDatabase.CreateDynaset("select * from MAN where DATE > '201310'", 0&) 'フィールド名の表示 For colnum = 0 To rs.Fields.Count - 1 ActiveSheet.Cells(1, colnum + 2) = rs(colnum).Name Next 'データの表示 rownum = 0 Do Until rs.EOF For colnum = 0 To rs.Fields.Count - 1 ActiveSheet.Cells(rownum + 2, colnum + 2) = rs(colnum).Value Next rs.MoveNext rownum = rownum + 1 Loop 'オブジェクトのクローズ rs.Close '各種オブジェクトの開放 Set rs = Nothing Set OraDatabase = Nothing Set OraSession = Nothing 'チームコードをAからBに変更。チーム名称の置換処理 Cells.Replace What:="A", Replacement:="B", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False '変更したチーム名称でMANテーブルを更新 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 ID As String Dim SQL_STR As String ID = Sheets("sheet2").Range("A1") 'oo4oセッションオブジェクトの生成 Set OraSession = CreateObject("OracleInProcServer.XOraSession") 'oo4oデータベースオブジェクトの生成(DBへUserID:ID、パスワード:intで接続) Set OraDatabase = OraSession.OpenDatabase(ID, "im/int", 0&) 'oo4oデータセット(レコードセット)の生成(全データを返すレコードセットの生成) Set rs = OraDatabase.CreateDynaset("select * from MAN", 0&) 'データの更新 For rownum = 2 To 20000 If ActiveSheet.Cells(rownum, 5) = "" Then Exit For End If '更新対象データの検索 rs.Findfirst ("TIME=" & ActiveSheet.Cells(rownum, 5)) '編集モードに設定 rs.Edit For colnum = 1 To rs.Fields.Count - 1 Select Case rs(colnum).Type Case 10 rs(colnum).Value = ActiveSheet.Cells(rownum, colnum + 2) Case 8 rs(colnum).Value = CDate(ActiveSheet.Cells(rownum, colnum + 2)) Case Else rs(colnum).Value = ActiveSheet.Cells(rownum, colnum + 2) End Select Next rs.update Next 'オブジェクトのクローズ rs.Close QUIT_OPER: 'オブジェクト変数用に確保したメモリの開放 Set rs = Nothing Set OraDatabase = Nothing Set OraSession = Nothing Exit Sub End Sub データの更新を20000件分としているのでこれが遅くなっている要因です。 1日700件くらい実績があがるので1ケ月で実働20000件あれば十分かと考えました。 チームコード変更は、まとめて月末に実施しようと思っていますが、 時間がかかるのであれば、週(20000件→5000件程度)あるいは日(20000件→800件程度)単位でやるしかないかと思っています。

  • EXCEL VBAでデータベース更新

    OFFICE2010 ORACLE 9.1 あるサーバ(A)にあるデータを(B)にコピーする方法を教えていただきたく。 サーバ(A)には、オーダ情報が毎日登録されます。 サーバ(B)は、ソフト開発用に用意されていたサーバで、 このサーバを利用して、EXCEL連携でデータ参照したいと思っています。 EXCEL VBAでサーバ(A)、サーバ(B)両方とも連携可能なので、 直接サーバ(A)を参照すればデータ自体は見られます。 しかし、他部門にツールとして渡すので、データベースを壊されたら困るので、 サーバ(B)を参照サーバとして利用したいというおもいです。 実施したいのは、 サーバ(A)のinfoというテーブルから サーバ(B)のinfoというテーブルへデータを更新する方法。 サーバ(A)とサ-バ(B)の差分を更新する方法もあるかと思いますが、 サーバ(A)は、レコード自体が更新されていくので、 サーバ(B)のinfoデーブルの内容を全て削除してから、 サーバ(A)のinfoテーブルの内容をコピー という方法を教えていただきたく。 参考に、下記はサーバ(A)のinfoテーブルから全レコードを取得するマクロです。 Private Sub receive_Click() Application.ScreenUpdating = False 'oo4o用のオブジェクト変数の宣言 Dim OraSession As Object 'セッション Dim OraDatabase As Object 'データベース Dim rs As Object 'データセット(レコードセット) Dim rownum As Long Dim colnum As Integer 'セッションオブジェクトの生成 Set OraSession = CreateObject("OracleInProcServer.XOraSession") 'oo4oデータベースオブジェクトの生成(サーバA) Set OraDatabase = OraSession.OpenDatabase("A", "name/password", 0&) 'oo4oデータセット(レコードセット)の生成(全データを返すレコードセットの生成) Set rs = OraDatabase.CreateDynaset("select * from info", 0&) 'すでに表示されている内容のクリア Call ClearDisp 'フィールド名の表示 For colnum = 0 To rs.Fields.Count - 1 ActiveSheet.Cells(2, colnum + 2) = rs(colnum).Name Next 'データの表示 rownum = 0 Do Until rs.EOF For colnum = 0 To rs.Fields.Count - 1 ActiveSheet.Cells(rownum + 3, colnum + 2) = rs(colnum).Value Next rs.MoveNext rownum = rownum + 1 Loop 'セル幅の自動調整 ActiveSheet.Columns("B:I").EntireColumn.AutoFit 'オブジェクトのクローズ rs.Close '各種オブジェクトの開放 Set rs = Nothing Set OraDatabase = Nothing Set OraSession = Nothing Application.ScreenUpdating = True End Sub B2からBI2までがタイトル B3からBI10000くらいまでデータがあります。 D2列がシリアル番号になっており、同じ番号は登録されません。 マクロ、全くの初心者です。 ベタのコードで教えていただきたく。 上記マクロは、ホームページに記載されていたものを分かる範囲で変更したものです。 サーバ(B)からのデータ取得はAがBになるだけです。 'oo4oデータベースオブジェクトの生成(サーバB) Set OraDatabase = OraSession.OpenDatabase("B", "name/password", 0&) ※A,Bは実際のサーバ名ではありません。

  • 01722 数値が無効です

    ドラえもん 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

  • データベースから取得した値を文字で表示する

    office2010 Oracle12C Oracle12CのデータベースからexcelへデータをもってくるマクロをWEB参照しながら作成しました。 しかしながら、配列構成でひっぱると、”文字列”で表示したい内容が”標準”の書式になってしまいます。 マクロは下記です。 Sub shutoku() 'ADO用のオブジェクト変数の宣言 Dim cn As New ADODB.Connection 'コネクション Dim rs As New ADODB.Recordset 'レコードセット Dim rownum As Long Dim colnum As Integer Dim jissekiArr() Application.ScreenUpdating = False 'クリア Worksheets("Sheet1").Cells.Clear 'dwhへ接続 cn.Open "Provider=OraOLEDB.Oracle;Data Source= dwh ;User ID=dwh;Password=dwh;", "dwh", "dwh" 'ADOレコードセットの生成(全データを返すレコードセットの生成) 'DBから条件で抽出する rs.Open "select * from TABLE_NAME where CD = 'コード'", cn, adOpenDynamic, adLockOptimistic, adCmdText '配列の初期化 rsCount = 0 Do Until rs.EOF rs.MoveNext rsCount = rsCount + 1 Loop ReDim jissekiArr(rsCount, rs.Fields.Count) 'データレコードを最初に戻す rs.MoveFirst 'フィールド名の表示 For colnum = 0 To rs.Fields.Count - 1 jissekiArr(0, colnum) = rs(colnum).Name Next 'データの表示 rownum = 0 Do Until rs.EOF For colnum = 0 To rs.Fields.Count - 1 jissekiArr(rownum + 1, colnum) = rs(colnum).Value Next rs.MoveNext rownum = rownum + 1 Loop '配列をシートに出力する。 Sheets("Sheet1").Select Range(Cells(1, 1), Cells(rsCount + 1, rs.Fields.Count)) = jissekiArr 'オブジェクトのクローズ rs.Close cn.Close '各種オブジェクトの開放 Set rs = Nothing Set OraDatabase = Nothing Set OraSession = Nothing Erase jissekiArr End Sub これだと日時のデータが 20161221151143 の部分が 2016E+13 先頭に0があるコード 0601000 が 601000 の様に表示されてしまいます。 Dim jissekiArr() の部分を Dim jissekiArr() as string とすると、 jissekiArr(rownum + 1, colnum) = rs(colnum).Value の部分が黄色く表示され、 実行時エラー'94' Nullの使い方が不正です。 となります。 どうしたら、文字のまま抽出できるか教えて頂きたく。 ※貼り付けるシートsheet1を全て文字列にしておいても、標準に変更されてしまいます。

  • マクロでoracleセットアップ後、エラー発生

    win10  office2016 oracle12c りースパソコンや新規パソコンでのoracleソフト更新用に、下記の様なマクロファイル(setting.xlsm)を作成し、oracleソフトやその他アプリソフトインストールの簡略化を図ろうとしています。 1.共有ドライブからORACLEソフトをc:\client32フォルダへコピー 2.oracleのsetup.exe起動 3.tnsnames.oraファイルを所定のフォルダへ登録 4.パソコンのハード管理番号をoracleへ登録 5.その他のアプリソフトインストール 上記を順番に実行していくと、4の内容実施時にエラー(OraOLEDBpus12.dll:指定されたモジュールが見つかりません)が発生してしまいます。 原因が、2の内容らしく、何かのコマンドを実行したまま開放されていないみたいな状況になっています。 上記の判断をした理由は下記の結果からです。 VBAでなく、手動で1から3の内容を実施すると4は実行可能。 1と3を手動、2をvbaで実施すると、4の実行でエラーになる。 4の実行でエラーになった後、setting.xlsmのファイルを閉じて、再度開きなおして4を実行すると動作可能。 2のマクロの内容は Dim wdApp As Variant Set wdApp = CreateObject("Wscript.Shell") With wdApp .Run "C:\client32\setup.exe", 5 End With Set wdApp = Nothing 4のマクロは参考までに下記 Sub PC_save() 'ハード管理番号を登録 Application.ScreenUpdating = False Sheets("hardnumber").Select On Error GoTo ERR_HANDLER 'ADO用のオブジェクト変数の宣言 Dim cn As New ADODB.Connection 'コネクション Dim rs As New ADODB.Recordset 'レコードセット Dim rownum As Long Dim colnum As Integer 'ADOコネクションの生成 cn.Open "Provider=OraOLEDB.Oracle;Data Source= source ;User ID=source;Password=pass;", "source", "pass" 'ADOレコードセットの生成(全データを返すレコードセットの生成) rs.Open "select * from hardnumber ", cn, adOpenDynamic, adLockOptimistic, adCmdText 'データの挿入 '固定で2行目から100行目までのデータを転送 For rownum = 2 To 100 If ActiveSheet.Cells(rownum, 1) = "" Then Exit For End If rs.AddNew For colnum = 0 To rs.Fields.Count - 1 Select Case rs(colnum).Type Case 10 'varchar rs(colnum).Value = ActiveSheet.Cells(rownum, colnum + 1) Case 8 'date rs(colnum).Value = CDate(ActiveSheet.Cells(rownum, colnum + 1)) Case Else 'その他 rs(colnum).Value = ActiveSheet.Cells(rownum, colnum + 1) End Select Next rs.Update Next ' 'オブジェクトのクローズ rs.Close cn.Close ' Sheets("MENU").Select Worksheets("hardnumber").Visible = False 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 Application.ScreenUpdating = True End Sub 何か、回避方法あれば教えていただきたく。

  • VBAでOracleにSQL発行(ADO)

    ExcelのVBAからOracleにADOで登録したく下記のコードを作成しましたが コンパイルで"変数定義がされていません”に成ってしまいます。 参照設定に何か必要なのでしょうか? ----------------------------------------------- 'ADO用のオブジェクト変数の宣言 Dim cn As New ADODB.Connection ← ここでエラー Dim rs As New ADODB.Recordset Dim rownum As Long Dim colnum As Integer 'ADOコネクションの生成 cn.Open "Provider=OraOLEDB.Oracle;Data Source=" & ActiveSheet.Cells(26, 1) & ";User ID=scott;Password=tiger;", "scott", "tiger" 'ADOレコードセットの生成(全データを返すレコードセットの生成) rs.Open "select * from emp", cn, adOpenDynamic, adLockOptimistic, adCmdText ... ... ...

  • VBAでoo4oを使用してINSERTする際にエラーが発生

    Excelのマクロでoo4oを使用してINSERTをしようとしています。 Dim OraSession As OraSession Dim OraDatabase As OraDatabase Set OraSession = CreateObject("OracleInProcServer.XOraSession") Set OraDatabase = OraSession.OpenDatabase(TNS, USER/PASS, 0&) OraSession.BeginTrans OraDatabase.ExecuteSQL("Insert Into tablename ( colum1, colum2) VALUES( '12345', '1234');") OraSession.BeginTrans OraDatabase.ExecuteSQLでINSERTしようとした場合に、「ORA-00911: 文字が無効です。」とエラーになってしまいます。 同じSQL文をSQL PLUS+で実行させた場合、正常にINSERTができます。 何か特別な処理をしないといけないのでしょうか。 よろしくお願いします。

  • VB6でのPL/SQLの実行について

    現在VB6(SP6)でORACLEのデータベースに接続後、プロシージャを実行してOUTのパラメータを取得したいと思ってプログラムを作っております。 ORACLEへの接続はいろいろ調べてできたのですが、プロシージャの実行(呼び出し)のしかたがわからず困っております。 PL/SQL(プロシージャ名"TEST_DATA") out1 = TEST(OUTパラメータ1) out2 = これはテストです。(OUTパラメータ2) VB6(SP6) Dim OraSession As OraSession Dim OraDatabase As OraDatabase Dim OraDynaset As OraDynaset Dim P1 AS String Dim P2AS String '接続処理 Set OraSession = CreateObject("OracleInProcServer.XOraSession") Set OraDatabase = OraSession.OpenDatabase("TEST", "TEST/TEST DB_DEFAULT) OraSession.BeginTrans 'ここでPL/SQLを実行して、パラーメタを取得したいです。 '取得したパラメータをセット P1 = パラメータ1(TEST) P2 = パラメータ1(これはテストです。) OraSession.CommitTrans '結果表示 Call MsgBox(P1 & "結果" & P2) ご教授のほどをお願いいたします。

  • DAOでデータベースを二つ開くには?

    環境 Windows2000 VB6 DAOで同じデータベースを開くためのやり方がわかりません。 下記のようにマスタのキーを使用して他のテーブルの 内容を更新したいのですが よろしくお願いします。m(__)m Dim ws As Workspace Dim db As Database Dim qd As QueryDef Dim rs As Recordset Dim STRSQL As String dim strsql2 as string Set ws = DBEngine.Workspaces(0) Set db = ws.Databases(0) STRSQL = "SELECT KEY FROM マスタ" Set qd = db.CreateQueryDef("", STRSQL) Set rs = qd.OpenRecordset() Do While Not rs.EOF strsql2 = "Update data from マスタ where key = " & rs!key ???? rs.MoveNext Loop rs.Close qd.Close db.Close

  • oo4oを使ったOracleへのデータ処理を高速化したい

    タブ区切りのtsvファイルの1項目目に並んでいるデータをDBのプライマリーキーとみなして、DB上に既にあればupdate、なければinsertします。 下のPGは、DBに30万件のデータが入った状態で実行すると、遅すぎて使えません。もっと速くすることはできませんでしょうか。 Public Const OraSQL_01 = "INSERT INTO CUSTOMER (COMPANY_CODE, TEST1) Values (:データ0, :データ1)" Public Const OraSQL_02 = "UPDATE CUSTOMER SET COMPANY_CODE = :データ0, TEST1 = :データ1 WHERE COMPANY_CODE = :データ0" wkFile1 = "c:\test\test.csv" Open wkFile1 For Input As #1 OraSession.BeginTrans Set rs = OraDatabase.CreateDynaset("SELECT COMPANY_CODE FROM CUSTOMER", ORADYN_DEFAULT) OraDatabase.Parameters.Add "データ0", 0, ORAPARM_INPUT OraDatabase.Parameters("データ0").ServerType = ORATYPE_NUMBER OraDatabase.Parameters.Add "データ1", 0, ORAPARM_INPUT OraDatabase.Parameters("データ1").ServerType = ORATYPE_VARCHAR2 Do Until EOF(1) Line Input #1, Text sec = Split(Text, vbTab) OraDatabase.Parameters("データ0").Value = sec(0) OraDatabase.Parameters("データ1").Value = sec(1) Dim flg As Boolean Do Until rs.EOF flg = False If rs("COMPANY_CODE") = sec(0) Then OraDatabase.ExecuteSQL OraSQL_02 flg = True Exit Do Else rs.MoveNext End If Loop If flg = False Then OraDatabase.ExecuteSQL OraSQL_01 End If rs.MoveFirst Loop OraSession.CommitTrans

専門家に質問してみよう