- ベストアンサー
CSVファイルをEXCELで編集する場合について
こんにちは。カテゴリ違いかもしれませんが、教えてください。EXCELのマクロやVBAについては全くの初心者なのですが、不特定の名称のCSVファイルをEXCELで表示・編集した場合、マクロ・VBAを自動で起動させて入力規制や入力チェックは行えるものでしょうか?あるセルの内容をチェックする場合、VBAだとシート名を指定しなくてはならない印象を受けましたが、この指定が不特定であることは可能でしょうか?現状ではVBAの扱い方からのスタートになっている段階なので、このような質問になってしまっています。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
なんか質問を読んで、もやもやしてよく主旨が採れないですが参考になれば。 >不特定の名称のCSVファイルをEXCELで表示・編集した場合 あるブックのブックのオープンイベントに Private Sub Workbook_Open() Workbooks.Open "c:\My documents\aaa.xls" MsgBox Worksheets("sheet1").Range("a1") MsgBox "bb" End Sub を入れると、上例ではc:\My documents\aaa.xlsを自動的に開きます。「不特定の」言ってますが、このブック名の指定部分を、ダイアログボックスを表示して、ユーザーにファイル指定させることもできます。最低InputBoxで聞くのも出来る。 >表示・編集した場合・・ それより前にCSVファイルをエクセルに読みこまないといけませんが、上記のファイル名を実在のXXX.CSVにすれば良い。表示はその結果シートに表示されます。 データ-外部データの取りこみをマクロ記録したものも あります。 テキストファイルを1レコードずつよみ、Split関数で 分離し、自分でセルにセットも出来ます。 編集に付いては、この質問では編集はオペレーターがやるようですね。 >編集した場合、マクロ・VBAを自動で起動させて 編集した場合はマクロが編集するのではないでしょうが、 人間が編集した(セルの値を変えた)時などに即座にチェックしエラー指摘するのはイベント・プロセジュアしかなく、VBAではあまり十分な機能ではないが出来ます。 むしろ、入力が全て終わった時にチェックをやる手もある。 しかし操作(本来の使い方)での、「入力規則」なども 相当強力なので、プログラムに頼らなくても済む面は大きいと思う。 >あるセルの内容をチェックする場合、VBAだとシート名を指定しなくてはならない印象を受けましたが これはその通りですが、だからと言ってシート名を取得することも出来るし、Activesheetという表現で、一般化することも出来る。CSVファイルを読みこむとCSVファイル名のシート(だけ1つ)が出来ると思いますが。 上例でMsgBox "bb"は詰まらんものですが、ここにモジュール名を書くと、そのモジュールを実行します。VBAが判れば 自在にエクセル処理が出来る可能性があります。 ブック内のモジュールとかPersonal.xls内とかの制約の色々な勉強が必要ですが。 ●取り越し苦労せず、入り口(CSVファイルのエクセルへの読みこみ)から始めて、一歩一歩疑問点を詰めて、質問してはどうでしょう。 まあしかし回りにVBAを知っている方がいないと、短期間では無理かも知れない。しかしお若い方は理解の早い方はいるし、他言語をやっておられる様ですから大丈夫かも知れない。
その他の回答 (2)
- piyo2000
- ベストアンサー率49% (144/293)
まだ見てますかね?(^^; #1さんの回答どおり、CSVではマクロを記述できません。 >ThisWorkBooks("?????.csv")←VBチックにこんな記述は不可能でしょうか? 100近くあるCSVファイルを開くには、やはりファイル名を列挙した上でWorkBooks.Openに投げるしかないですね。 最悪、エクスプローラでCSVを全て選択して「開く」をやればいいんですけどね(^^; >VBAだとシート名を指定しなくてはならない印象を受けましたが、 >この指定が不特定であることは可能でしょうか? が、「全てのシート(名前が分からない)に対して同じ処理をしたい」 という意図であるなら、それは簡単です(^^; For Eachを使って列挙すればいいのです。 Dim oSheet As Worksheet For Each oSheet In ThisWorkbook.Worksheets MsgBox oSheet.Name Next oSheet ここではmsgboxでシート名を出してみたわけですが ここにシートに共通して行う処理を書けばいいですね。 >一番楽なのはVBでアプリケーションを作ってしまうことなのですが、 >Excelで編集するという制約がありまして・・・ VBからExcelを制御できますけど(^^; つまり、制御するのがExcelブックなのかVBアプリかだけの違いです。 あとExcelでCSVを読み込むときは数値と文字列の区別など注意が必要ですよ(内容が変わってしまう)。
お礼
piyo2000さん、朝早くからご回答ありがとうございます。 100個ほどファイルがあると申し上げましたが、1作業では1ファイルのみの編集になりますので、一度に複数のCSVファイルを開いていることが前提ではありません。しかしCSVファイルを"開く""閉じる"という動作を繰り返し行う可能性はあります。 >VBからExcelを制御できますけど(^^;・・・ 言葉が足りませんでした。Officeアプリケーション(Accessは除く)で編集する制約、の方が正確な意味になります。Excelマクロを使用する理由は、有形のアプリケーションを作成せずにCSV編集作業の簡易化を図るためです。 >あとExcelでCSVを読み込むときは数値と文字列の区別など注意が必要ですよ(内容が変わってしまう)。 この区別もVBAがVBと似た関数を持っているならば、判別・変換は可能ですよね?その点はあまり心配はしてませんが・・・
- bin-chan
- ベストアンサー率33% (1403/4213)
> 自動で起動させて入力規制や入力チェックは行えるものでしょうか? CSVファイルはEXCELアプリケーションに関連付けされているからEXCELで開かれますが、実体はただのテキストファイルです。 従って、マクロを記述できません。 > VBAだとシート名を指定しなくてはならない印象を受けましたが CSVファイルを開くとファイル名=シート名で、単一のシートです。 結局、「指定されたCSVファイルを開くマクロを記述したEXCELブックを作成する」が良いと思います。 キーワード「EXCEL CSV 開く」で過去の回答を参照ください。
お礼
bin-chanさん、ご回答感謝です。 やっぱり無理ですかぁ・・・残念です・・・ >CSVファイルを開くとファイル名=シート名で、単一のシートです。 ThisWorkBooks("?????.csv")←VBチックにこんな記述は不可能でしょうか? >結局、「指定されたCSVファイルを開くマクロを記述したEXCELブックを作成する」が良いと思います。 実は編集したいCSVファイル数は100近くあります・・・"1CSVファイル:1マクロ用ファイル"は現実的ではないですが・・・ 一番楽なのはVBでアプリケーションを作ってしまうことなのですが、Excelで編集するという制約がありまして・・・ >キーワード「EXCEL CSV 開く」で過去の回答を参照ください。 ヒント頂き感謝します!しかしヒット数が多いですね・・・地道にキッカケを探してみます。
お礼
imogasiさん、ご回答ありがとうございます。今自分の質問の文を読み返すと、確かに目的が曖昧でした・・・それにも関わらず噛み砕いてお返事いただき、感謝いたします。 おっしゃっていただいた文のお返事になるか分かりませんが、現状でできていることを申し上げますと、 (1)あるBookをExcelで開いた時、内部で記述されたVBAによりCSVを開くためのダイアログを表示する (2)ダイアログで開かれたCSVをSplit関数で各セルに格納する (3)シートを閉じる際、各セルの入力チェックを行う です。やりたいことに近づいているとは思いますが、現状の問題点として 1>一度CSVを閉じてしまうと、もう一度CSVを開く際(1)のマクロは起動できないため、マクロ起動のためのコマンドボタンなどのオブジェクト配置が必要 2>(2)・(3)の機能は(1)で開いた場合のみ有効(Splitのロジックを通れないため) 3>VBAが不特定の名称のCSVに対して汎用的に処理できない という感じです。上記から、コマンドボタンなどのトリガーを設けておけば、ある程度簡易なルーチンワークにすることが可能と思われますが、現状でBook自体にユーザーインターフェースを備えたアプリケーション的なものにすることを避けているため、 1)VBAを実装したExcelブックは開きぱなしでよいが、上から CSVを開いた際、いつでもCSVの内容の編集・入力チェックが行えるようにしたい 2)編集作業者はExcelアプリケーションそのものに対しては"開く""保存する""閉じる"以外の動作は行えないようにしたい >取り越し苦労せず・・・ 耳が痛いです・・・最近こちらのサイトに頼りっぱなしな面もありますので、おっしゃる通り自分で調べることを省略してしまっていることは否めません・・・ 恐れ入りました。