- ベストアンサー
ACCESS カンマをスペースに置き換えるマクロ(初心者です)
ACCESSで作業をし、EXCELにエクスポートしてCSVで配信しています。 CSVに落とす際には必ずカンマ区切りで次の列として認識させたいのですが、 商品の型名などの中には,カンマが含まれている場合があり、CSVに落とす際に 列ずれを起こしてしまいます。 私だけが使用するのであれば、検索置換で毎回確認すればいいのですが、 私以上の初心者の人もこのDBを使用して作業するので、ボタンをクリック するだけで出来るような物にしたいのです。 初心者の為、質問内容がわかりにくいと思いますがご回答よろしくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
NULLのデータがありましたか(汗; NULLというのは、「何もない」という意味です。 したがってこの場合は下記のように記述します。 lobjRecordset.Fields(0).Value = IIf(IsNull(lobjRecordset.Fields(0).Value), "", Replace(lobjRecordset.Fields(0).Value, ",", "-")) これは、型名に何もデータがなかったら(IsNullなら)そのまま、データがあったらカンマをハイフンに置き換えた文字をセットする。 というものです。
その他の回答 (5)
- 5qoo
- ベストアンサー率48% (20/41)
カンマをスペースに置き換えずに、エクスポート時に列を「"」で囲むのはどうでしょうか? (例) "06/02/10","商品代","1,000" この方法でカンマが含まれている場合でも一つの列として認識します。 方法は、エクスポートでファイルの保存画面の時に ファイルの種類を「テキストファイル(*.txt,*.csv,*.tab,*.asc)」を選択する。 そして[エクスポート]ボタンをクリックすれば『テキストエクスポートウィザード』が立ち上がります。 あとは、 フォーマットを「区切り記号付き」を選択。 フィールド区切り文字「カンマ」、テキスト区切り記号「"」をそれどれ選択。 最後にエクスポート先のファイル名を「○○○.xls」にする。 これでウィザードを完了させればOKです。
お礼
O_cyanさんの方法で、無事出来たので今回はそちらでやってみようと思いますが、 5qooさんに教えていただいた方法は今後も使えそうなので覚えます。 これは、文字列として認識させるということですかね? ありがとうございます。
- O_cyan
- ベストアンサー率59% (745/1260)
簡単な方法は クエリで Replace([型名],","," ") として型名にある,をスペースに置き換えます。 そのクエリを元にしてエクスポートすれば簡単にできます。 ExcelにでもCSVにでもどちらにでもエクスポートできます。 このクエリを使ってマクロでも作りボタンのイベントに設定すれば良いのでは
補足
できました!! 初心者の私でもわかる方法をありがとうございました。 皆さん詳しくて頭が下がります。
- PrintScree
- ベストアンサー率25% (538/2091)
>lstrSqlStmnt = "SELECT 型名 FROM T03 データ統合" テーブル名にスペースがあるんですね。 その場合はこう記述します。 lstrSqlStmnt = "SELECT 型名 FROM [T03 データ統合]" Visual Basicはブランクが間にあるとブランクの左側と右側は別物と判断してしまうので、[]記号で「一つである」と教えてやらなければなりません。 本来は、テーブル名やクエリなどではスペースを使用せずアンダーバー(_)を使用するのが、AccessプログラマやVBプログラマの間では暗黙の了解となっています。
補足
暗黙の了解なんですね。今後は気をつけるようにします(^^) そして、申し訳ないのですがさらなる問題が起きました。 実行時エラー'94':NULLの使い方が不正です。 モジュールはこの通りです。↓ lobjRecordset.Fields(0).Value = Replace(lobjRecordset.Fields(0).Value, ",", "-") 余分な空白が入っているということでしょうか? 私もPrintScreeさんに教えて頂いた、関数とかの意味を調べて考えてみますが、お時間があれば教えて下さい。
- PrintScree
- ベストアンサー率25% (538/2091)
まず、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の命令なので、ヘルプで検索できます。 まだ分からない所が会ったら、補足質問してください。
補足
度々、申し訳ありません。 言われたとおり作業をしたのち、ボタンをクリックしたところ、このようなメッセージが表示されました。 実行時エラー'3078' 入力テーブルまたはクエリ'T03'が見つかりませんでした… モジュールはこうです。↓ lstrSqlStmnt = "SELECT 型名 FROM T03 データ統合" テーブルのプロパテイなどで名前を調べましたが一見間違っているようには見えません。 ただ、エラーメッセージでは'T03'とテーブル名が途中までしか表示されません。 確認した、テーブル名等は、↓こうでした。 【テーブル名:T03 データ統合 フィールド名:型名】 何か、テーブル名などに問題があるのでしょうか?
- PrintScree
- ベストアンサー率25% (538/2091)
モジュールで関数を作成し、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にエクスポートしてください。
補足
VBをほとんど使ったことがなく知識がなさすぎて申し訳ないのですが、 まず、ACCESS側で、オブジェクトをモジュールにし、新規作成をクリックすると、PrintScreeさんのおっしゃる【Option Explicit】が表示されず【Option Compare Database】が表示されます。 また、その次の段階でこの関数を貼付け後はモジュールは名前を付けて保存するのでしょうか? あと、フォームのボタンにその関数を割り当てる方法がよくわからないので、よろしければ教えてください。
お礼
PrintScreeさん、本当に詳しく色々教えていただいてありがとうございましたm(_ _)m O_cyanさんの方法で無事出来ましたが、PrintScreeさんのおかげでモジュールに触れることが出来、 せっかくなので、モジュールのほうでも、作ってみます。 ただ、締め切らないと、他の回答がどんどん来てしまいそうなので、PrintScreeさんにはもう少し聞きたいことが ありましたが、締め切りますね(:_;) 本当にありがとうございましたっ!
補足
なるほど~。エクセルと似て非なるものなんですね(^^;) 今、試してみましたが、やはり 実行時エラー'94':NULLの使い方が不正です。 モジュールは頂いたものをコピペしました。この通りです。↓ lobjRecordset.Fields(0).Value = IIf(IsNull(lobjRecordset.Fields(0).Value), "", Replace(lobjRecordset.Fields(0).Value, ",", "-")) 忙しい中、申し訳ありません。私も出来るだけ自分で考えてみます。。。