• 締切済み

Excel VBAにてSQLで文字列中の空白を削除

投稿させていただきます。 MSDNのフォーラムの下記URLの質問にて有効な情報を得ることができませんでしたのでここでもお聞きします。 http://social.msdn.microsoft.com/Forums/ja-JP/vbajp/thread/f8d2eae8-8547-48f8-96e2-12e5e01dc294 ADOとMicrosoftJetOLE DB4.0プロバイダを使用して、自らのブックからワークシートへ接続しています。 SELECTするワークシート(テーブル)の1つのフィールドには文字列中に空白が含まれており、それを無視して、WHERE句の条件を適用させて、データ抽出をしようとしています。 Trim関数は左右の空白削除で、使えることはわかりました。 しかし、文字列間となるとREPLACE関数で置き換えてやるのが最善と考え、それを実行しましたが、「式に未定義関数Replaceがあります」とエラーがでます。 抽出結果には置き換え前のデータを表示させたいです。 REPLACE関数に限らず、何か良い方法はありませんでしょうか。 環境はWindows 7 Excel2003です。 よろしくお願いします。

みんなの回答

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

自ブックへのADO接続はトラブルの元と聞いておりましたが、今でも状況は変わっていない様なので、抽出操作用の別ブックから操作される事をおすすめします。 http://support.microsoft.com/kb/319998/ja 検索すると、Replace関数はJET ネイティブな関数でないので使えないという記事が多いのですが、当方の環境WindowsXP SP3&Excel2010では、下記は両方とも動作いたしましたので、お知らせしておきます。 'ADO 2.8に参照設定 'ADO 2.1あたりで試しても、Excel2010のブックから抽出出来るので、ADOの仕組みがよく分からなくなりましたが、Providerの機能なんでしょうね。 JET4.0と言いながら、種々のバージョンがある様です。 http://support.microsoft.com/kb/829558 しかしながら、Windows7なら最新のバージョンが入っていそうなものですので、ご参考にはならないかと思います。 Sub test() Dim cn As New ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String Dim conn_str As String '対象とするセル範囲に、tableRangeという名前をつけてあります。 conn_str = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & ThisWorkbook.Path & "\" & "dataBook.xlsx;" & _ "Extended Properties=""Excel 12.0 XML;HDR=Yes;""" cn.Open conn_str '試験データは手抜きでField1という見出しが付けてあります。 SQL = "SELECT * FROM tableRange WHERE ((Replace([Field1],"" "","""")='aaaaa'));" Set RS = New ADODB.Recordset RS.Open SQL, cn, adOpenStatic, adLockReadOnly Do While Not RS.EOF Debug.Print RS.Fields(1).Value RS.MoveNext Loop RS.Close: Set RS = Nothing cn.Close: Set cn = Nothing End Sub Sub test2() Dim cn As New ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String Dim conn_str As String conn_str = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & ThisWorkbook.Path & "\" & "dataBook.xls;" & _ "Extended Properties=""Excel 8.0;HDR=Yes;""" cn.Open conn_str SQL = "SELECT * FROM tableRange WHERE ((Replace([Field1],"" "","""")='aaaaa'));" Set RS = New ADODB.Recordset RS.Open SQL, cn, adOpenStatic, adLockReadOnly Do While Not RS.EOF Debug.Print RS.Fields(1).Value RS.MoveNext Loop RS.Close: Set RS = Nothing cn.Close: Set cn = Nothing End Sub

Uyrjyyf6sd
質問者

お礼

お礼が遅れてしまい、申し訳ありません。 大変参考になる提案でした。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.1

例えば次のようにしてはいかがでしょう。 同一セル内での改行を削除するなら Range("A1").Value = Replace(expression:=Range("A1").Value, Find:=Chr(10), Replace:="") 空白を無くするのなら Range("A1").Value = Replace(expression:=Range("A1").Value, Find:=" ", Replace:="")

Uyrjyyf6sd
質問者

お礼

お礼が遅れてしまい、申し訳ありません。 参考にさせていただきます。 ありがとうございました。

Uyrjyyf6sd
質問者

補足

ご回答ありがとうございます。 ご提示いただいた方法はVBAのReplace関数でしょうか。 私が試した方法は SQLでのWHERE句のフィールドにもSQLのReplace関数をかけて WHERE 空白のないフィールド='空白のない条件' と、したかったのしたかったのです。 理解が足らず申し訳ありませんが もう少し詳しく利用方法をお教え願えませんでしょうか。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 文字列中の空白削除について

    PHP4で、文字列の前後に空白が場合はtrimを使って削除可能ですが、文字列の中に含まれていたとき、その空白を削除するいい方法はあるでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 空白セルの削除と重複データの加算のマクロ

    シート1の文字列のデータの0又は空白のセルを取り除いて、並んでいる文字列の左と真ん 中の数が重複しているデーターは左端の数を加算して別のシート2のC10からC100のセルに抽出できるマクロを教えて下さい。データーの0は関数で空白にしたいと思っています。 データの並び方はこのままで重複するデーターの加算と空白のセルの削除を一回のマクロで実行したいのです。  E列               空白を削除    0-4-1              0-4-1         2-3-2              2-3-2         2-2-3              2-2-(3) 0                 2-2-(1) 2-2-1              4-1-9 4-1-9              2-1-7 2-1-7              2-2-3 0                 2-3-(5)                (数式がある空白セル)   2-3-(1)            2-2-3              2-3-(4) 0                 0-4-1 2-3-5 2-3-1 2-3-4 0-4-1 シート2のB列10~100に抽出 0-4-1 2-3-2 2-2-4 4-1-9 2-1-7 2-2-3 2-3-10 0-4-1 このように抽出したいのです。

  • 文字列の全ての空白を取り除くにはどうしたらよいでしょうか。

    文字列の全ての空白を取り除くにはどうしたらよいでしょうか。 Excel VBAで文字列の前後の空白を取り除くにはTrimを使ってできます。 文字列内にある空白をすべて取り除くにはTrimではできませんでした。 なにか良い方法はないでしょうか。 よろしくお願いします。

  • エクセルの文字内の空白の削除

    EXCELの表の列に下記のようにカタカナで氏名が入っています。 ヤマダ タロウ ヤマダジロウ できれば、全て空白を詰めて下記のように修正したいのですが、エクセルの関数若しくはBVAでは可能でしょうか??trim関数は前後の空白だけ削除ですよね?? 宜しくお願いします ヤマダタロウ ヤマダジロウ

  • エクセルVBAで不一致に空白セルを挿入

    エクセル2010です。 A、B列ともソートされています。 ごく少数ですが同一列内に重複するデータもあります。 そして A列に、1行目からA、B、C、E、F、F、H B列に、1行目からA、B、D、E、F、G、I (カンマは実際にはありません。) というような文字列データがある場合 別シートに A列に、1行目からA、B、C、空、E、F、F、空、H、空、 B列に、1行目からA、B、空、D、E、F、空、G、空、I、 (空は空白セルの意味です。) というように、お互いが一致しない場合は空白で飛ばし、一致するものは同じ行にするにはどのような方法がよろしいでしょうか? 例のように少ないデータなら目で見て手作業でできますが、実際は千件以上のデータです。 VBAでも関数でも結構です。よろしくお願いします。

  • 文字間の空白の削除を教えてください。

    全角文字の文字間にある空白を削除したいです。 山 田 太 郎 → 山田太郎 下記のとおり置き換えようとしてもダメでした。 select replace('山 田 太 郎',' ','') from user_master; 左空白削除(ltrim() 関数)、右空白削除(rtrim() 関数)、左右空白削除(trim() 関数)などは、ありますが。。。 文字間の空白削除は、どうすれば良いのですか?

  • エクセルのVBAマクロについて

    エクセルのVBAマクロについて、添付のような物を考えているのですが、宜しくお願いします。 B3~E15に関数を入れて、TRUE となったデーターを表示 させるまでは出来たのですが、このデーターをF~I列へ上から順に (空白行は詰めて)順次記録して行きたいのです。 B3~E15に表示させるデーターは、別シートから抽出し、 切り替えますので、結果を表示させたら、ボタンを押して記録し、 再度別データーを入れたらその下に記録して行くような仕組み を考えております。 宜しくお願いします。

  • エクセルでVBAで範囲に対してTRIM関数を適用したい

    他のソフトから取り込んだデータなどに、各データの前後に不要なスペースがついている場合があります。 これをワークシート関数のTRIM同様前後のスペースだけ(文字列中のスペースは残す)削除したいのですが、データが多いのでFor~Nextは避けたいと思っています。 何かよい方法はありますか?

  • EXCEL2010で同じ文字列のセルの数を数え・・

    EXCEL2010で一つのワークシート上に様々な文字列が散らばっているとします。 この中でたとえばAAAという文字列が何個あるかを抽出してAAA 1、またBBBという文字列が何個あるかを抽出してBBB 3というように表示させたいのですが、方法をご存じの方、よろしくお願いいたします。VBAを使わずに解決して下さると嬉しいです。 ちなみに、COUNTIFなどの関数は、あらかじめ探したい文字列が分かっている場合には使えますが、本件はそうではなく、ワークシート上にどんな文字列があるのか一目ではわからないくらいたくさんあります。 理想は、その文字列が入っている全てのセルを範囲選択しておいて、何か関数で抽出させ、 AAA 3 ABC 19 BBB 21 DCF 3 などといったリストが作成されることです。 よろしくお願いいたします。

  • VBAにて特定文字(セル)抽出

    例 Sheet2     (E列)     (F列) 3 41 兵庫高速道路  33333 42 阪神高速道路  55555 52 63 64 阪神高速道路  66666 Sheet2のE41からデータのある所(約200)までの決まった文字「阪神高速道路」とその隣(F列)のセットセルを抽出し、Sheet3のF3へ順にコピーしたいと思います。 *Sheet2のE41以降は空白ありません。 結果 Sheet3    (F列)     (G列) 3 阪神高速道路  55555 4 阪神高速道路  66666 5 6 7   となるように。 Dim Cr As Range With Sheets(2) Set Cr = .Range("E1:F1") Cr.Item(1).Formula = "=E41" Cr.Item(2).Value = "'=阪神高速道路" .Range("E41").CurrentRegion.AdvancedFilter _ xlFilterCopy, _ CriteriaRange:=Cr, _ CopyToRange:=Sheets(3).Range("F3") End With うまく抽出できません。お願い致します。

専門家に質問してみよう