- ベストアンサー
access VBAでテキストファイルの編集をする方法
- access VBAを使用して、日々更新されるテキストファイルの編集を行いたいです。退社した前任者から受け継いだエクセルファイルを使用して、本社のサーバからダウンロードした受注データを加工していますが、日々更新が続くため不都合が生じています。そこで、アクセスのデータベースに受注データを蓄積したいと考えています。
- 毎日FTPでアップロードされる日付を含むテキストファイルを受信し、VBAを使用してそのテキストファイルの日付を任意の日付に変更し、バッチファイルを実行して変更した日付のファイルを受信する方法を探しています。
- アクセスでは、フォームにテキストボックスを作成し、そこに日付を入力することで、VBAを使用してテキストファイルの日付を変更することができます。さらに、他の工程に進む前にテキストファイルの編集が必要ですが、エクセルのVBAに比べてaccess VBAは初心者であるため、サポートをお願いしたいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
A No.2です。 短いバッチなら、毎回1から作成した方が簡単かもしれませんね。 VBA本来のテキストファイル読み書きの機能もありますが、FSOのオブジェクトの方がなんとなく馴染むので愛用しております。
その他の回答 (4)
- mitarashi
- ベストアンサー率59% (574/965)
A No.2です。 正規表現を使う事例です。今日の日付に変えるコードですが、お好きな様に変更してください。また、XXXXXXXXYYMMDDの所は秘密のコマンド+日付を表す数字6桁という解釈で作成しています。XXXXXXXXの所にも数字が含まれていると、もう一ひねりが必要ですが、ご自分で正規表現をお調べ下さい。過去に作成したコードをアレンジしたので、冗長なところもあるかと思います。 Sub test() Dim FSO As Object Dim buf As String Dim fileName As String Dim subMatchText As String Dim returnString As String Dim patternString As String fileName = "C:\Documents and Settings\?????\My Documents\sample.bat" Set FSO = CreateObject("Scripting.FileSystemObject") If Not FSO.FileExists(fileName) Then Exit Sub With FSO.getfile(fileName).OpenAsTextStream buf = .ReadAll .Close End With patternString = "(\d{6}) " subMatchText = subMatchWord(buf, patternString) returnString = replaceText(buf, subMatchText, Format(Date, "yymmdd")) With FSO.getfile(fileName).OpenAsTextStream(2) .Write returnString .Close End With Set FSO = Nothing End Sub Private Function subMatchWord(targetstring As String, patternString As String) As String Dim regEx As Variant, Matches As Variant, match As Variant Dim i As Long Dim buff As String Set regEx = CreateObject("VBScript.RegExp") regEx.MultiLine = True regEx.Pattern = patternString regEx.IgnoreCase = True regEx.Global = True Set Matches = regEx.Execute(targetstring) If Matches.Count > 0 Then For Each match In Matches If Matches(i).subMatches.Count > 0 Then subMatchWord = Matches(i).subMatches.Item(0) End If Next match End If Set Matches = Nothing Set regEx = Nothing End Function Private Function replaceText(targetstring As String, patrn As String, replStr As String) As String Dim regEx As Object Set regEx = CreateObject("VBScript.RegExp") regEx.Pattern = patrn regEx.IgnoreCase = False replaceText = regEx.Replace(targetstring, replStr) End Function
- mitarashi
- ベストアンサー率59% (574/965)
ANo.2です。 興味から、バッチ完了迄待つ処理について調べてみました。 http://hpcgi1.nifty.com/kenzo30/b_cbbs/cbbs.cgi?mode=al2&namber=29854&rev=&no=0&P=R&KLOG=193 http://aircross.hp.infoseek.co.jp/vb_synshell.htm ご参考まで。
- mitarashi
- ベストアンサー率59% (574/965)
>1、VBAでテキストファイルの日付を変更する。(任意の日付) これはファイルの作成日を変更したいのでしょうか? たぶんご要求は違うと思いますが、敢えてお答えすると方法は下記にあります。 http://aircross.hp.infoseek.co.jp/vb_timestamp.htm これはVB用のコードですが、 Attribute VB_Name = "mdlSetLocalFileTime" を削除すると、使用可能です。下記は使用例 Sub test() Dim retVal As Boolean Dim timeStamp As Date timeStamp = DateValue("2009/6/1") retVal = SetLocalFileTime("C:\Documents and Settings\????\My Documents\Sample.txt", timeStamp) End Sub なお、実際になさりたい事が、 日付になっているファイル名を変更したいなら、 vba ファイル名 変更 VBAから、バッチファイルを実行したいなら、 vba バッチファイル 実行 で検索すれば、直ぐにいくつも見つかります。 Accessでの事例も出てきますし、この手の内容なら、Excel用とされているコードも多くはそのままAccessで使用できると思います。
お礼
ご回答ありがとうございます。 私の説明がいまいちだったようです。 テキストに書かれている内容は ----------------------------------------------- open (xxx.xxx.xxx.xxxx) (loginname) (password) binary get XXXXXXXXYYMMDD "c:\test\test.dat) quit ----------------------------------------------- のようにFTPで行う処理が書かれていて、YYMMDDの部分を 対象日付に書き換えたいのです。 エクセルのVBAではテキストを開いてgetが出てくるまで探して、 getが出たら そこから右XX文字をcell(X,X)の値に書き換える。 という処理でした。 同じことをアクセスで記述する方法がわからず困っています。 「microsoftaccess テキスト編集 VBA」 等で検索してもパッとそれらしい答えが見つからず困っています
すみませんが、「課題の丸投げ」になっていませんか? こういうやり方をしてみたら、こうなった的な結果がないと、質問として成立しないのですよ。 以上
お礼
ありがとうございます。 参考URLを見て少し考えてみます。また 報告させていただきます。 現状、以前のエクセルのファイルを日付毎に作成し、 日付を選んでアクセスに取り込むフォームを作って対応してますが、 FTPから受信するときだけエクセルを動かさないといけないのは やはり不便です。がんばってみます
補足
試してみました。 参考URLからの説明がすごくわかり易かったので簡単でした。 とはいっても、書き換えの仕方がわからなかったので、 一度テキストファイルを削除して、同じファイル名で新規作成し、 内容を書き込むという。スマートでない方法ですが、 一日一回でそんなに時間のロスがあるわけでもないので、 とりあえず、良しとしました。 従来使用のエクセルファイルを利用することなくアクセスにデータを ためていけるようになりました。 ありがとうございました。 今度はサイズの心配が必要かもしれませんが