• ベストアンサー

ACCESS カンマをスペースに置き換えるマクロ(初心者です) 

ACCESSで作業をし、EXCELにエクスポートしてCSVで配信しています。 CSVに落とす際には必ずカンマ区切りで次の列として認識させたいのですが、 商品の型名などの中には,カンマが含まれている場合があり、CSVに落とす際に 列ずれを起こしてしまいます。 私だけが使用するのであれば、検索置換で毎回確認すればいいのですが、 私以上の初心者の人もこのDBを使用して作業するので、ボタンをクリック するだけで出来るような物にしたいのです。 初心者の為、質問内容がわかりにくいと思いますがご回答よろしくお願いいたします。

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

  • ベストアンサー
  • PrintScree
  • ベストアンサー率25% (538/2091)
回答No.4

NULLのデータがありましたか(汗; NULLというのは、「何もない」という意味です。 したがってこの場合は下記のように記述します。 lobjRecordset.Fields(0).Value = IIf(IsNull(lobjRecordset.Fields(0).Value), "", Replace(lobjRecordset.Fields(0).Value, ",", "-")) これは、型名に何もデータがなかったら(IsNullなら)そのまま、データがあったらカンマをハイフンに置き換えた文字をセットする。 というものです。

d-loop
質問者

お礼

PrintScreeさん、本当に詳しく色々教えていただいてありがとうございましたm(_ _)m O_cyanさんの方法で無事出来ましたが、PrintScreeさんのおかげでモジュールに触れることが出来、 せっかくなので、モジュールのほうでも、作ってみます。 ただ、締め切らないと、他の回答がどんどん来てしまいそうなので、PrintScreeさんにはもう少し聞きたいことが ありましたが、締め切りますね(:_;) 本当にありがとうございましたっ!

d-loop
質問者

補足

なるほど~。エクセルと似て非なるものなんですね(^^;) 今、試してみましたが、やはり 実行時エラー'94':NULLの使い方が不正です。 モジュールは頂いたものをコピペしました。この通りです。↓ lobjRecordset.Fields(0).Value = IIf(IsNull(lobjRecordset.Fields(0).Value), "", Replace(lobjRecordset.Fields(0).Value, ",", "-")) 忙しい中、申し訳ありません。私も出来るだけ自分で考えてみます。。。

その他の回答 (5)

  • 5qoo
  • ベストアンサー率48% (20/41)
回答No.6

カンマをスペースに置き換えずに、エクスポート時に列を「"」で囲むのはどうでしょうか? (例) "06/02/10","商品代","1,000" この方法でカンマが含まれている場合でも一つの列として認識します。 方法は、エクスポートでファイルの保存画面の時に ファイルの種類を「テキストファイル(*.txt,*.csv,*.tab,*.asc)」を選択する。 そして[エクスポート]ボタンをクリックすれば『テキストエクスポートウィザード』が立ち上がります。 あとは、 フォーマットを「区切り記号付き」を選択。 フィールド区切り文字「カンマ」、テキスト区切り記号「"」をそれどれ選択。 最後にエクスポート先のファイル名を「○○○.xls」にする。 これでウィザードを完了させればOKです。

d-loop
質問者

お礼

O_cyanさんの方法で、無事出来たので今回はそちらでやってみようと思いますが、 5qooさんに教えていただいた方法は今後も使えそうなので覚えます。 これは、文字列として認識させるということですかね? ありがとうございます。

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.5

簡単な方法は クエリで Replace([型名],","," ") として型名にある,をスペースに置き換えます。 そのクエリを元にしてエクスポートすれば簡単にできます。 ExcelにでもCSVにでもどちらにでもエクスポートできます。 このクエリを使ってマクロでも作りボタンのイベントに設定すれば良いのでは

d-loop
質問者

補足

できました!! 初心者の私でもわかる方法をありがとうございました。 皆さん詳しくて頭が下がります。

  • PrintScree
  • ベストアンサー率25% (538/2091)
回答No.3

>lstrSqlStmnt = "SELECT 型名 FROM T03 データ統合" テーブル名にスペースがあるんですね。 その場合はこう記述します。 lstrSqlStmnt = "SELECT 型名 FROM [T03 データ統合]" Visual Basicはブランクが間にあるとブランクの左側と右側は別物と判断してしまうので、[]記号で「一つである」と教えてやらなければなりません。 本来は、テーブル名やクエリなどではスペースを使用せずアンダーバー(_)を使用するのが、AccessプログラマやVBプログラマの間では暗黙の了解となっています。

d-loop
質問者

補足

暗黙の了解なんですね。今後は気をつけるようにします(^^) そして、申し訳ないのですがさらなる問題が起きました。 実行時エラー'94':NULLの使い方が不正です。 モジュールはこの通りです。↓ lobjRecordset.Fields(0).Value = Replace(lobjRecordset.Fields(0).Value, ",", "-") 余分な空白が入っているということでしょうか? 私もPrintScreeさんに教えて頂いた、関数とかの意味を調べて考えてみますが、お時間があれば教えて下さい。

  • PrintScree
  • ベストアンサー率25% (538/2091)
回答No.2

まず、ACCESS側で、オブジェクトをモジュールにし、新規作成をクリックすると、PrintScreeさんのおっしゃる >【Option Explicit】が表示されず【Option Compare Database】が表示されます。 Option Explicit は Option Compare Databaseの次にあってもなくても構いません。 Option Compare Databaseの下に関数を貼り付けてください。 >モジュールは名前を付けて保存するのでしょうか? はい、名前を付けて保存してください。 名前は表示されている Module1 のままで構いません。 >フォームのボタンにその関数を割り当てる方法 まず、ボタンを貼り付けボタンの上で右クリックしてプロパティをクリックするとプロパティシートが出てきます。(プロパティシートが表示されているならそのまま) ボタンを貼り付ける時、「コマンドボタンウィザード」が表示されたらキャンセルしてください。 次に、そのシートの上に[イベント]タグがあるので、そこをクリック。 表示された中に「クリック時」というのがあるので、そこをクリックするとコンボボックスの矢印が表示されるので[イベント プロシージャ]を選択。 その隣にある[...]ボタンをクリックすると、Microsoft Visual Basic の画面になり、下記のような表示になるはずです。 Private Sub コマンド0_Click() End Sub これを、次のように書き換えてください。 Private Sub コマンド0_Click()  Call sub置き換え End Sub これで、フォームを保存して開けば、コマンドボタンをクリックすると、カンマを置き換える関数「sub置き換え」が実行されます。 関数の中身については、ヘルプを見ながら勉強してください。 Set、Database、Recordset、String、CurrentDB、While、MoveNext、Sub、FunctionなどはVisualBasicの命令なので、ヘルプで検索できます。 まだ分からない所が会ったら、補足質問してください。

d-loop
質問者

補足

度々、申し訳ありません。 言われたとおり作業をしたのち、ボタンをクリックしたところ、このようなメッセージが表示されました。 実行時エラー'3078' 入力テーブルまたはクエリ'T03'が見つかりませんでした… モジュールはこうです。↓ lstrSqlStmnt = "SELECT 型名 FROM T03 データ統合" テーブルのプロパテイなどで名前を調べましたが一見間違っているようには見えません。 ただ、エラーメッセージでは'T03'とテーブル名が途中までしか表示されません。 確認した、テーブル名等は、↓こうでした。 【テーブル名:T03 データ統合 フィールド名:型名】 何か、テーブル名などに問題があるのでしょうか?

  • PrintScree
  • ベストアンサー率25% (538/2091)
回答No.1

モジュールで関数を作成し、Replaceコマンドを使用すれば , → 別の文字 に一括で置き換えることが可能です。 まず、モジュールの編集画面(Microsoft Visual Basic)を開き(モジュールの新規作成)、[ツール] - [参照設定]から「Microsoft DAO 3.6 Object Library」にチェックを入れます。 次に、下記の関数を「Option Explicit」の下に貼り付けてください。 Public Sub sub置き換え()  Dim lobjDB  As Database  Dim lobjRecordset As Recordset  Dim lstrSqlStmnt As String    Set lobjDB = CurrentDB()    lstrSqlStmnt = "SELECT 型名 FROM 商品テーブル" ← この部分はご自分で書き換えてください。  Set lobjRecordset = lobjDB.OpenRecordset(lstrSqlStmnt, dbOpenDynaset)  While Not lobjRecordset.EOF   lobjRecordset.Edit   lobjRecordset.Fields(0).value=Replace(lobjRecordset.Fields(0).Value, "," ,"-")   lobjRecordset.Update     lobjRecordset.MoveNext  Wend    lobjRecordseet.Close  lobjDB.Close    Set lobjRecordset = Nothing  Set lobjDB = Nothing End Sub そして、フォームを新規作成し、ボタンを貼り付け、「クリック時」のイベントプロシージャ内に、上記関数名を書きます。 これで、フォームのボタンを押すだけで型名内のカンマを(この例だと)ハイフンに置き換えるので、その後でCSVにエクスポートしてください。

d-loop
質問者

補足

VBをほとんど使ったことがなく知識がなさすぎて申し訳ないのですが、 まず、ACCESS側で、オブジェクトをモジュールにし、新規作成をクリックすると、PrintScreeさんのおっしゃる【Option Explicit】が表示されず【Option Compare Database】が表示されます。 また、その次の段階でこの関数を貼付け後はモジュールは名前を付けて保存するのでしょうか? あと、フォームのボタンにその関数を割り当てる方法がよくわからないので、よろしければ教えてください。

関連するQ&A

  • カンマ区切りの数字をCSVファイルにインポートする時どうすれば?

    カンマ区切りで区切られた金額を CSVファイルにエクスポートなどする時は、 どうやって、カンマの区切りを判別するのですか?

  • (エクセル)特定のスペースをカンマに置換

    エクセル(2000、2003)で、英熟語帳を作成しています。例えば同一セル内(A1)のデータがひとつ以上の半角スペースで区切られている英語(英熟語)と日本語訳(例:a lot of たくさんの)を2列に分けたいのですが、エクセルの区切りの処理では、 A1   B1    C1    D1 a      lot   of   沢山の というように4列に分かれてしまいます。また、関数SUBSTITUTEを使って"of"と"たくさん"の間のスペースをカンマにしてカンマ区切りを試みましたが、=SUBSITUTE(A1," ",",",3として、「a lot of たくさんの」場合はうまくいっても、単語数の異なる例えば 「plenty of たくさんの」ではカンマに置換したいスペースの位置が変わる(SUBSTITUTEの最後の引数が2となる)のでうまくいきません。そこで、「もっとも右側のスペースだけをカンマに置換する」ということは可能なのでしょうか?よろしくご教授をお願いいたします。

  • ACCESSデータベースのインポート 

    ACCESSデータベースでインポートしたいデータ(拡張子がlog)があるのですが、そのままだと文字列が区切られていなくテーブルに入らないので、毎回 しょうがなく事前に置換ツール等を使ってカンマ区切りにしてからインポートしています。 モジュールなどを使って、インポートする前のデータをテーブルに入れやすい 形(カンマ区切りのtxtファイルぐらいしか思いつかないのですが。。。)に置換・変換っていうのはできるんでしょうか??教えて下さい。。

  • カンマ区切りでないテキストをcsvへ

    カンマ区切りしていないテキストファイルを一気にカンマ区切りしてcsvに変更することはできないのでしょうか?? 元のテキストファイルをワードパッドで開いてカンマ区切りし直して保存し、名前の変更でcsvに変更(拡張子が変更するとファイルが使用できなくなる可能性あり、というエラーは無視)したら読み込めるようにはなります。 しかしカンマ区切りし直すというのは面倒です。

  • csvカンマ区切りデータに=""を入力したい

    csvカンマ区切りデータに、例えば、 ="00",="123",="456" といった感じで入力したいのです。 大元のcsvカンマ区切りデータで、 00,123,456 が入っているので、これをExcelを使ってText変換や書式設定で文字列にして みたのですが、csvデータとしては=""としては保存されていないのです。 どなたか、こういった型変換に詳しいかたご連絡をお待ちしています。

  • ACCESS「CSV」形式での、保存方法。

    ACCESSで作ったデータを「CSV形式(カンマ区切り)」で保存する方法がわかりません。 今日ACCESSに初挑戦しています。(ACCESS2000を使用) 色々調べて、データを「エクスポート」すればいいというところまでは、わかりました。 テキストデータにエクスポートしたのですが、 CSV(カンマ区切り)に変更する方法がわかりません。 よろしくお願いします。 -------------------------------------------------------- 強硬手段で、拡張子を「.csv」に変更してみたのですが、 だめでした。 データ内に、改行のあるHTMLが入っています。 拡張子を強制的に変更したら、 このHTMLタグが、消えてしまいました。 --------------------------------------------------------

  • 複数のスペースをひとつのカンマで置き換えるには?

    WORDの文字の置き換えの質問です。 次のことをしたい場合、「検索する文字」「置換する文字列」にどういった文字をいれればよいのでしょうか?(特殊文字を使用するとおもわれます。いろいろやってみましたが、わかりません) 1.ひとつまたは複数あるスペースをカンマで置き換える。 2.行の先頭にあるスペースだけを削除する。

  • csvカンマ区切りデータの特定列を置換したい

    csvカンマ区切りデータの数百列のうち特定データに固定長文字列を入力したいのですが、 正規表現機能を使って文字列置換する方法が知りたいのです。 たとえば、  111, 2, 33,以降省略・・・,100 を  111,="02",="033",以降省略・・・,100 と言った様に置換したいのです。100は仮ですので入力が省けれれば省きたいです。 上記の場合は、2列目を2桁の文字列、3列目を3桁の文字列として入力する場合です。 以上、よろしくお願いします。

  • エクセルでカンマ区切り文字を各行に分解するマクロを書きたい

    WindowsXP Excel2003 エクセルで以下ができるマクロを書きたいです。 B列にはカンマ区切りで文字列が入っています。 カンマ区切りの数は行によって様々です。 この表をB列のカンマ区切り文字を各行に分解したいです。 その際、A列とC列は分解前の値と同様です。 このようなマクロは書けますかね? A列     B列     C列 あ     a,b,c    100 い     d,e     200 う     f      300 え     g,h     400     ↓ A列     B列     C列 あ     a      100 あ     b      100 あ     c      100 い     d      200 い     e      200 う     f      300 え     g      400 え     h      400

  • アクセスのテーブルからエクスポートした際のケタ落ち

    Accessの通常のテーブルからエクスポート (業務系DBにインポートする為にカンマ区切りのcsvファイル) する際に、小数4桁のフィールドが2桁に切り捨てられてしまいます。 テーブルの定義で4桁固定等色々試してみたのですが・・。 エクスポートのウィザード画面では4桁まで見えているのですが、 実行後にcsvファイルを見ると2桁に切られてしまっています。 これを避けるにはどの様にすれば良いのでしょうか? 初歩的な質問かも知れませんが、どうぞ宜しくお願いいたします。

専門家に質問してみよう