Excelで’付きデータのOracle登録

このQ&Aのポイント
  • Excelマクロを使用してOracleのテーブルにデータを登録する際、文字列の中に'が含まれると登録ができません。修正方法を教えてください。
  • Excelマクロでデータの登録において、name2のデータに'が含まれる場合は登録ができません。その問題を解決する方法を教えてください。
  • Excelのマクロを使用してOracleにデータを登録する際に、name2のデータに'が含まれる場合、登録ができません。解決策を教えてください。
回答を見る
  • ベストアンサー

excelで’付きデータのoracle登録

office2010 oracle12c 下記のexcelマクロで文字列の中に'があるとoracleのテーブルにデータ登録できません。 Option Explicit ' ADOのオブジェクト変数を宣言 Private cnn As New ADODB.Connection Private cmd As New ADODB.Command Sub add() On Error GoTo err_hdr Sheets("table").Select ' ' Oracleの接続 cnn.Open "Provider=OraOLEDB.Oracle;" & _ "Data Source=Source_name;", "ID", "PW" Set cmd.ActiveConnection = cnn '追加の例 Dim row As Long row = 1 Do Until ActiveSheet.Cells(row, 1) = "" With cmd .CommandText = "insert into table " & " (name1, name2)" & "" _ & "VALUES('" & ActiveSheet.Cells(row, 1) & "','" & ActiveSheet.Cells(row, 2) & "')" .CommandType = adCmdUnknown .Execute End With row = row + 1 Loop cnn.Close Set cmd = Nothing Set cnn = Nothing Exit Sub err_hdr: Resume Next End Sub 具体的には name2のデータがPEOPLEだと上記マクロでoracleのtableにデータ登録できますが、 name2のデータがPEOPLE'Sの様に'がついているとデータ登録できません。 ’付きの文字列を、上記マクロ修正してデータ登録可能でしょうか?

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

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.3

https://oracle.programmer-reference.com/sql-singlequotation/ の対応、つまり、 .CommandText を組み立てる前に name2 = Replace(name2, "'", "''") を実行します。

3620313
質問者

お礼

回答ありがとうございます。 教えていただいた内容が参考になりデータ追加できました。 name2はテーブルの項目名になるので、対応としては、excel帳票の中で PEOPLE'S→PEOPLE''S と置換しました。 ’が使用されている文字列が多かったら、マクロで対応とも考えましたが、この文字列1ケだけが’付きだったので上記の様に置換で対応しました。 excelからoracleへのデータ追加マクロは他にもあり、そちらは'付きでもデータ追加できていたのですが、処理時間が遅いので、今回事例であげたマクロで対応出来て時間短縮となり、非常に助かりました。(^^)/

その他の回答 (2)

  • maiko04
  • ベストアンサー率17% (345/1956)
回答No.2

文法がわからんので .CommandText = 'insert into table ' & ' (name1, name2)' & '' _ & 'VALUES("' & ActiveSheet.Cells(row, 1) & '","' & ActiveSheet.Cells(row, 2) & '")' か .CommandText = "insert into table " & " (name1, name2)" & "" _ & "VALUES(\'" & ActiveSheet.Cells(row, 1) & "\','" & ActiveSheet.Cells(row, 2) & "')" か .CommandText = "insert into table " & " (name1, name2)" & "" _ & "VALUES(''" & ActiveSheet.Cells(row, 1) & "'','" & ActiveSheet.Cells(row, 2) & "')" あたりでうまくいきませんか?

3620313
質問者

お礼

回答ありがとうございます。 3件試しましたが、3件ともだめでした。

  • oboroxx
  • ベストアンサー率40% (317/792)
回答No.1

Oracleでは、'は文字列を囲むときに使われる文字なので、エスケープが必要だと思います。 'を\'とバックスラッシュ(日本語環境では円記号かも)を前に付けてください。

3620313
質問者

お礼

回答ありがとうございます。 'を\'とバックスラッシュ(日本語環境では円記号)を前に付ける対応ではだめでした。

関連するQ&A

  • VBA where複数条件

    Oracle12c office2016 oracleのデータをEXCELのマクロで更新するのにシリアル等の1つしかない条件だと次の内容で更新できます。マクロは抜粋です。 C列(ActiveSheet.Cells(row, 3))の内容がシリアルだと、下記でkomoku1,komoku2が更新可能。 With cmd .CommandText = "UPDATE table1" & " set komoku1 = '" & ActiveSheet.Cells(row, 6) & "' " & ", komoku2 = '" & ActiveSheet.Cells(row, 58) & "' WHERE " & " joken1 = '" & ActiveSheet.Cells(row, 3) & "'" .CommandType = adCmdUnknown .Execute End With 違うテーブルで条件を2つにして設定する場合 ActiveSheet.Cells(row, 3) と ActiveSheet.Cells(row, 4)のAND条件で設定する場合は、どの様な書式になるか教えていただきたく。 ActiveSheet.Cells(row, 3) と ActiveSheet.Cells(row, 4)は両方とも文字列です

  • Excel VBAデータ登録のスピードアップしたい

    下記のようなコードがあります。 ■input データ閲覧・登録・編集シート ■data データを格納するシート inputシートとdataシートでdataの受け渡しを行っているのですが、データレコードを切り替えるだけで20秒ちょっとかかるため、作業効率が悪いです。 この時間を1~2秒ぐらいまで減らすには、どのように修正すれば、いいでしょうか?どうかアドバイスをお願いいたします。 Private Sub datatouroku() ’データを登録する Dim touroku As Integer Dim fRange As Range Set fRange = Sheets("data").Columns(1).Find(What:=Range("BC1").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) touroku = fRange.Row '検索されたNoの行位置を求める Sheets("data").Cells(touroku, 1).Value = Range("BC1:BE1").Value Sheets("data").Cells(touroku, 2).Value = Range("AX1").Value Sheets("data").Cells(touroku, 3).Value = Range("I4").Value   '・・・上記のデータが全部で256件あります。 End Sub ------------------------------------------ Private Sub hyouji() 'データを表示させる Dim fRange As Range Dim kensaku As Long Set fRange = Sheets("data").Columns(1).Find(What:=Range("BC1").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)    If (fRange Is Nothing) Then '見つからなかった?    MsgBox "入力された顧客コードが存在しません。", vbExclamation    Exit Sub    End If    kensaku = fRange.Row '検索された顧客DCの行位置を求める     Range("BC1:BE1").Value = Sheets("data").Cells(kensaku, 1).Value     Range("AX1").Value = Sheets("data").Cells(kensaku, 2).Value    Range("I4").Value = Sheets("data").Cells(kensaku, 3).Value     '・・・上記のデータが全部で256件あります。 Set trg = Sheets("data").Cells(kensaku, 1) End Sub

  • 複数条件でoracleデータ更新

    office2016 Oracle12C excelの A1にTEST C1にSERIAL01 F1にKOTEI1 のデータが入っていて、oracleのテーブルデータをexcelマクロで更新させようとしています。 oracle接続等のコマンドは省略してポイント部分のマクロだけ記載します。 (1) With cmd .CommandText = "UPDATE TABLE1  set KOMOKU1 = '" & ActiveSheet.Cells(1, 1) & "' WHERE KOMOKU3 = '" & ActiveSheet.Cells(1, 3) & "' " End With 上記(1)を実行すると、oracleのTABLE1のデータはSERIAL01に関して KOMOKU1の列がTESTに更新されます。 (2) With cmd .CommandText = "UPDATE TABLE1  set KOMOKU1 = '" & ActiveSheet.Cells(1, 1) & "' WHERE KOMOKU6 = '" & ActiveSheet.Cells(1, 6) & "'" End With 上記(2)を実行すると、oracleのTABLE1のデータはKOTEI1に関して KOMOKU1の列がTESTに更新されます。 (3) やりたい内容は、 KOMOKU3がSERIAL01 KOMOKU6がKOTEI1 のAND条件だった場合に、KOMOKU1を更新させたいので、 With cmd .CommandText = "UPDATE TABLE1  set KOMOKU1 = '" & ActiveSheet.Cells(1, 1) & "' WHERE KOMOKU3 = '" & ActiveSheet.Cells(1, 3) & "' AND KOMOKU6 = '" & ActiveSheet.Cells(1, 6) & "'" End With の様なマクロを実行するのですが、対象のKOMOKU1がデータ更新されません。 何が悪いのか修正いただきたく。

  • 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 ... ... ...

  • VB.NETでADOでOracleのストアドを起動

    いつも楽しく勉強させていただいております。 環境はWindows Server 2008R2 DataCenter、データベースはOracle10G、開発ツールはVB.NET2015です。 このたびWindows Server 2003のVB6.0から上記の環境に乗せ換えているところです(Oracleのバージョンは変わりなし)。 最初にVB6.0からVB.NETへの変換はかけましたが、 なるべくVBのソースは変更しないという制約があります(テストのし直しが膨大になるので)。 VBとOracleはADOを使って接続しています。 ADOを使ってテーブルの読み書きはできるのですが、ストアドプロシージャの起動がうまくいきません。 具体的には入力パラメータはストアドに渡って処理も動くのですが、出力パラメータが返ってきません。 ストアドが正しく動くことはObjectBrowserで確認済みです。 下記のソースはVB6.0で動いていたものですが、VB.NET2015では二つの出力パラメータの値がNothingとなります。 (本来ならステータスとメッセージが返ります)。 VB.NET2015でADOでストアドを使うことは無理なのでしょうか。 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim Cnn As New ADODB.Connection Dim cmd As New ADODB.Command Dim Prm As New ADODB.Parameter Dim strMsg As String On Error GoTo Err_cmdExec_Click With Cnn .Provider = "MSDASQL" .ConnectionString = "DSN=DB1;" & "UID=abc;" & "PWD=efg" .Open() End With 'ストアドプロシージャ呼び出し設定&呼び出し With cmd .CommandTimeout = 0 'タイムアウト設定を無制限に .ActiveConnection = Cnn 'サーバー接続設定 .CommandText = "CHECK_PROC" 'ストアド名セット .CommandType = ADODB.CommandTypeEnum.adCmdStoredProc 'ストアドなのでadCmdStoredProc Prm = .CreateParameter("p_yyyymm", ADODB.DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamInput, 6, "201601") cmd.Parameters.Append(Prm) Prm = .CreateParameter("p_sts", ADODB.DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamOutput, 1) cmd.Parameters.Append(Prm) Prm = .CreateParameter("p_msg", ADODB.DataTypeEnum.adVarChar, ADODB.ParameterDirectionEnum.adParamOutput, 512) cmd.Parameters.Append(Prm) '実行 .Execute() '戻り値の判断&表示用メッセージ生成 If .Parameters.Item("p_sts").Value = "0" Then strMsg = "正常終了しました" Else strMsg = "異常終了しました" & vbCrLf & "ErrMsg=" & .Parameters.Item("p_msg").Value End If End With Exit_cmdExec_Click: '接続解除 Cnn.Close() 'Set Cnn = Nothing 'メッセージ表示 MsgBox(strMsg) Exit Sub Err_cmdExec_Click: 'ストアド以外の場所でのエラーなので、VBのErrの情報セット strMsg = "異常終了しました" & vbCrLf & "ErrNO=" & Err.Number & " ErrMsg=" & Err.Description Resume Exit_cmdExec_Click End Sub

  • EXCELマクロのこの記述の意味を教えてください。

    こんにちは。 以前、教えてもらったマクロですが もう少し深く勉強したいので、記述の 意味(翻訳?)を教えてください。 Sub Test5() Dim FR1 As Range, FR2 As Range With ActiveSheet Set FR1 = .Cells.Find( _ "*", , xlValues, xlWhole, xlByRows, xlPrevious) Set FR2 = .Cells.Find( _ "*", , xlValues, xlWhole, xlByColumns, xlPrevious) End With Range("A1", Cells(FR1.Row, FR2.Column)).Select Set FR1 = Nothing: Set FR2 = Nothing End Sub また、この範囲をA列だけを見る場合、つまりA列の最終行を範囲とする場合は、どう記述すればよいのでしょうか? ぜひ、教えてください。

  • 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
  • Excel 改ページのマクロ

    同シート内で改ページを設定するマクロを、ここで教えてもらったのですが、改ページを判断するデータの列が関数(vlookup)で持ってきたデータの場合にうまく機能しません。下のマクロに手を加えれば可能でしょうか? Sub Macro4() Const col As String = "A" '改ページを判断するデータの列名 Dim idx As Long Dim sv sv = Cells(1, col).Value For idx = 1 To Cells(65536, col).End(xlUp).Row   If Cells(idx, col).Value <> sv Then     ActiveSheet.HPageBreaks.Add Before:=Rows(idx)     sv = Cells(idx, col).Value   End If Next idx End Sub

  • データ抜き取りマクロの改良について

    エクセルのデータを10秒に一つごと抜き出すマクロがあります。 これでデータを抜き出すと1行目のサンプル名がぬけるので、 抜けないように改良したいです。 僕はマクロ勉強したことないので教えてください。 以下のマクロを改良して、1行目にデータがのるようにしてください。 Sub nukitori() ' Macro Nukitori ' I.Tsumagari nukitori_step = 10 i = 2 ii = 1 Dim X As Worksheet Set X = ActiveSheet MsgBox ("shortdataのシートがある場合は削除") Worksheets.Add.Name = "shortdata" While X.Cells(i, 1) <> "" And i < 65535 For col = 1 To 255 Worksheets("shortdata").Cells(ii, col).Value = X.Cells(i, col).Value Next i = i + nukitori_step ii = ii + 1 Wend End Sub

  • excel2003入力したデータを別シートにコピー

    会社でエクセル2003を使っています。 ド素人で、専門用語が全く分からないのでお許しください。 ひな形に入力したデータを その都度、別シートにリストとして保存したいのです。 ネットで調べたところマクロを使うようで Sub 正方形長方形4_Click() Call macro01 Call macro02 End Sub Sub macro01() Dim ws1 As Worksheet, ws2 As Worksheet Dim x As Long, y As Long Set ws1 = Sheets("Sheet1") Set ws2 = Sheets("Sheet2") x = ws2.Cells(Rows.Count, "b").End(xlUp).Row + 1 y = ws1.Cells(Rows.Count, "b").End(xlUp).Row ws1.Cells(21, "b").Resize(y, 9).Copy ws2.Cells(x, "B").PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False End Sub Sub macro02() Worksheets("Sheet1").PrintOut End Sub いろいろ知らべみてこのようなマクロを作りました。 家のエクセル2010では順番に入力行のその下にデータリストが増えていくのですが 会社の2003だと2行空いてしまうのです。 上記にマクロは家で作って会社ではそのマクロを入力する形です。 マクロの意味が全く分からず、どこを修正すればいいのかもわかりません。 お力をお貸しください。 よろしくお願いいたします。

専門家に質問してみよう