SQL Server 文字列の開始と終了を識別するために、シングルクォーテーションのペアを使用します。「Mrs Brown's Boys」をデータベーステーブルに挿入しようとすると、3つのシングルクォーテーションが2つの文字列を意味し、そのうちの1つが不完全であるため、失敗します。 Brown の後のアポストロフィにはエスケープ文字が必要です。この記事では、この異常を解決するためのカスタム VBA 関数の使用法について解説します。
この記事は、読者が開発者リボンを表示していて、VBAエディターに精通していることを前提としています。 そうでない場合は、Googleの「Excel開発者タブ」または「Excelコードウィンドウ」をご覧ください。
ここでの「データベース」という用語は、次のような「産業用強度」データベースに適用されます。 SQL Server そしてオラクル。
この演習で使用したワークブックの例を見つけることができます こちら.
SQL文字列
SQL文の中にアポストロフィ(またはシングルクォーテーション)が含まれている場合、データベースマネージャから次のエラーが返されます(この例では、O'Dowdという名前の場合)。
エスケープ文字として、単一のアポストロフィではなく二重アポストロフィが必要です。したがって、O”Dowd はデータベースで受け入れられますが、O'Dowd は受け入れられません。
関数
キャプチャフィールドにアポストロフィが含まれる可能性がある場合、更新前に実行されるカスタム関数を作成し、シングルクォーテーションをダブルクォーテーションに置き換えることができます。
- 新しいブックを開きます。
- 最初のシートに「更新」という名前を付け、独自のデータベース名などを使用して、次のように入力します。これらのフィールドは、接続文字列を作成するために使用されます。 SQL Server.
- コードウィンドウを開き、モジュールを挿入します。メニュー項目「ツール」>「参照」を使用して、ADOライブラリを参照します。
以下のコードをモジュールにコピーします。 これはデータベースに接続します。
Public connDB As New ADODB.Connection Public rs As New ADODB.Recordset Public strSQL As String Public strCriteria As String Sub ConnectDatabase()If connDB.State = 1 Then connDB.Close On Error GoTo ErrConnect Dim strServer、strDBase、strUser、strPWD As String strServer = Sheets( "Update")。Range( "B2")strDBase = Sheets( "Update")。Range( "B3")strUser = Sheets( "Update")。Range( "B4")strPWD = Sheets( " Update ")。Range(" B5 ")If strPWD>" "Then strConnectionstring =" DRIVER = {SQL Server}; Server = "&strServer&"; Database = "&strDBase&"; Uid = "&strUser&"; Pwd = "&strPWD&"; Connection Timeout = 30; "Else strConnectionstring =" DRIVER = {SQL Server}; SERVER = "&strServer&"; Trusted_Connection = yes; DATABASE = "&strDBase'Windows認証EndIf connDB.ConnectionTimeout = 30 connDB.Open strConnectionstring Exit Sub ErrConnect:MsgBox Err.Description End Sub
- モジュールに関数を追加します。
Function fRemoveApostrophe(strWord As String) Dim n As Integer Dim x As Integer x = 0 For n = 0 To 100 x = InStr(x + 2, strWord, "'") 'アポストロフィの位置を検索 If x = 0 Then Exit For If x > 0 Then strWord = Left(strWord, x - 1) & Chr(39) & Chr(39) & Right(strWord, Len(strWord) - (x)) End If Next n fRemoveApostrophe = strWord End Function
- 関数を無視します。
Sub IgnoreFunction() Call ConnectDatabase strCriteria = Sheets("Update").Range("B10") strSQL = "Insert into tblCrewMember (LastName) values ('" & strCriteria & "')" MsgBox strSQL & ". この SQL エントリは失敗します。アポストロフィが 3 つあることに注意してください。" Debug.Print strSQL 'connDB.Execute (strSQL) End Sub
- 関数を使用する
Sub UseFunction() Call ConnectDatabase strCriteria = Sheets("Update").Range("B15") strCriteria = fRemoveApostrophe(strCriteria) strSQL = "Insert into tblCrewMember (LastName) values ('" & strCriteria & "')" MsgBox strSQL & ". この SQL エントリは成功し、データテーブルに O'Dowd として表示されます。" Debug.Print strSQL 'connDB.Execute (strSQL) End Sub
- こちらのページにある「異議申立てフォーム」に必要事項を全てご記入ください: 更新 以下のワークシートから開始します。 A8:
- ボタンをマクロに割り当てる 無視関数 (NAIST) と 使用関数 それぞれに
結果
メッセージボックスに結果が表示されます。 この演習ではデータベースは物理的に更新されませんが、更新する場合は、フィールド名がデータベースと互換性があることを確認し、VBAステートメントconndb.execute(strSQL)を使用して追加します。
Excelのクラッシュからの回復
Excelは、コンピュータのリソースが不足するとクラッシュしやすい。この演習の作成中に、まだ保存されていないExcelのスプレッドシートがフリーズした。コードウィンドウは部分的に反応し、ワークブック全体を閉じることができた。結果として、ワークブックはコンテンツとコードが完全に揃った状態で正常に再開された。一時ファイルとソースファイルが(非常に頻繁に)破損していた場合、それを修復するツールがないため、作業をやり直さなければならなかっただろう。 xlsxダメージ。 この場合、それはほとんど重要ではありませんでしたが、より大きなワークブックにとっては潜在的な災害になる可能性があります。
著者紹介:
フェリックスフッカーは、のデータ復旧の専門家です DataNumen、Inc。は、以下を含むデータ復旧技術の世界的リーダーです。 RARファイルを復元する およびSQL回復ソフトウェア製品。 詳細については、次のWebサイトをご覧ください。 WWW。datanumen.com


