• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:アンケートメールをACCESSに取り込む方法)

アンケートメールをACCESSに取り込む方法

このQ&Aのポイント
  • フォームメールを使いアンケートを行ったのですが、予想以上にメールが多く、手動では困っています。一度にアンケートの内容をACCESSに取り込む方法を教えてください。
  • Outlook Express 6を使用しているのですが、メールをまとめてデコードしてACCESSに取り込む方法を知りたいです。
  • フォームメールから以下のような形式でアンケートの回答が送られてきます。ACCESSに効率よく取り込む方法があれば教えてください。

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

  • ベストアンサー
  • gadd3
  • ベストアンサー率46% (211/451)
回答No.5

あと、Accessのテーブルからアンケートを取り込んで、「=」の右側を取り出すには、例えば以下のようなコードを書きます(Access97には置換関数が無いので自作になります。) 以下の例は、「test01」という名前のテーブルに、「body」というフィールドを設け、そこにご質問のアンケートサンプル内容をそのまま貼り付けて、実行すると、イミディエイトウィンドウに、「=」の右側が表示されるというものです。 実行結果は 山田花子 99 主婦 女 ○○○○@△△.△.△△ 000-111-2222 ******************* ○○○○○○○○○○○○○○○○ 応募する のようになります。 Sub test01_97() Dim db As DAO.Database Dim rs As Recordset Dim body_str As String Dim record_01(19) As String '要素数が20個の配列 Dim kaisi_num As Integer '改行コードまでの文字を数えるときの基準位置 Dim syuuryou_num As Integer '改行コード直前の文字の位置 Dim cnt02 As Integer '改行コードを見つけ出した回数と配列の添え字とをシンクロさせるためのカウンタ Dim temp_str01 As String '文字列からスペースを消す処理につかう一時的な変数1 Dim temp_str02 As String '文字列からスペースを消す処理につかう一時的な変数2 Set db = CurrentDb Set rs = db.OpenRecordset("test01", dbOpenDynaset) body_str = rs!body ' Debug.Print body_str ' Debug.Print InStr(1, body_str, vbCrLf, vbBinaryCompare) kaisi_num = 1 '初期化 cnt02 = -1 '初期化(配列の添え字が0から始まるのでそれにあわす為) '************************************************************************** '改行コードが全文字列内のどの位置にあるかを調べながら、必要な文字列を切り出す. '************************************************************************** For i = 1 To Len(body_str) If Mid(body_str, i, 1) = Chr(13) Then '改行コードが見つかるたびに行なう処理 cnt02 = cnt02 + 1 '配列の添え字シンクロさせるためのカウント temp_str01 = Mid(body_str, kaisi_num, i - kaisi_num) '一時的な変数に1行分を格納する temp_str02 = F_Wchikan(temp_str01, " ", "") 'その1行から半角スペースをすべて消す temp_str02 = F_Wchikan(temp_str02, " ", "") 'ついでに全角スペースもすべて消す temp_str02 = Right(temp_str02, Len(temp_str02) - InStr(1, temp_str02, "=", vbBinaryCompare)) '= の右側を切り出して・・・ record_01(cnt02) = temp_str02 '配列に格納 kaisi_num = i + 1 '次の開始位置を設定(iは今回の改行コードの「位置」と同じ意味) End If Next '************************************************************************** '改行コードが全文字列内のどの位置にあるかを調べながら、必要な文字列を切り出す続き '文字列の最後は改行コードが無い場合もあるので以下の処理をする。最後に改行コードがあってもなくてもやる。 'もし、最後が改行コードでもフィールド数は固定なので関係ない。 '************************************************************************** cnt02 = cnt02 + 1 '配列の添え字の照らし合わせるためのカウント temp_str01 = Mid(body_str, kaisi_num, Len(body_str) - kaisi_num + 1) temp_str02 = F_Wchikan(temp_str01, " ", "") '半角スペースをすべて消す temp_str02 = F_Wchikan(temp_str02, " ", "") '全角スペースをすべて消す temp_str02 = Right(temp_str02, Len(temp_str02) - InStr(1, temp_str02, "=", vbBinaryCompare)) '= の右側を切り出して・・・ record_01(cnt02) = temp_str02 '配列の中身を表示 Debug.Print record_01(0) _ & vbCrLf & record_01(1) _ & vbCrLf & record_01(2) _ & vbCrLf & record_01(3) _ & vbCrLf & record_01(4) _ & vbCrLf & record_01(5) _ & vbCrLf & record_01(6) _ & vbCrLf & record_01(7) _ & vbCrLf & record_01(8) Set rs = Nothing Set db = Nothing '********************************************************** 'このあと、もしくは、前処理の途中で別のテーブルに配列の中身を '転記する処理をすればよい 'rs02.Fields(i) = record_01(i) みたいな感じ '********************************************************** End Sub '************************************************ '置換関数 ' 文字列の一部を置きかえる ' 引数は、元になる文字列(F_Text - String型) ' 検索する文字列(F_Kugiri - String型) ' 置換文字列(F_Chikan - String型) ' 戻り値は、取り出された文字列(F_Wchikan - String型) ' 関数名は、F_Wchikan '************************************************ Public Function F_Wchikan(F_Text As String, F_Kugiri As String, F_Chikan As String) As String Dim strWord As String Dim intPos As Integer If IsNull(F_Text) Then Exit Function End If If IsNull(F_Kugiri) Then Exit Function End If If IsNull(F_Chikan) Then Exit Function End If intPos = Len(F_Text) Do Until Len(F_Text) = 0 If StrComp(Mid(F_Text, 1, Len(F_Kugiri)), F_Kugiri) = 0 Then strWord = strWord & F_Chikan intPos = intPos - Len(F_Kugiri) Else strWord = strWord & Mid(F_Text, 1, 1) intPos = intPos - 1 End If F_Text = Right(F_Text, intPos) Loop F_Wchikan = strWord End Function 以上は、1つのメール内容だけをテーブルに貼り付けて、「=」の右側を取り出すだけなので、ちゃんとしたものにしようと思うと、そのあとのテーブルへ格納する処理も書かなければなりません。 テキストファイルから読み取るなら、その処理も書かなければなりません。 AccessVBAがわかる場合はさほど難しくないのですが(もっと簡単な方法があるかもしれません)、逆に、わからない場合は、非常に面倒なので、できればExcel上で処理できてしまった方がいいのかな・・・と思います。

momo-p
質問者

お礼

またまたお返事が遅くなり申し訳ございません(≧≦) こんなに沢山書き込んでくださってありがとうございます☆ 早速コピっていろいろやってみたのですがうまくいかず・・。 初心者の私にはちょっと難しすぎたようですo((>ω<o)) EXCEL上で処理したいと思います。 まだまだ勉強不足なのでこれから頑張っていきたいと思います。 本当にありがとうございました(o*。_。)oペコッ

その他の回答 (4)

  • gadd3
  • ベストアンサー率46% (211/451)
回答No.4

ExcelのVBAで、空欄には「なし」を自動的に入力するとか、そういう方法は取れないでしょうか? (僕、Excelは全然わからないもんですから・・・(^^)) AccessのVBAなら、例えばまとめてデコードしたときに一旦テキストファイルにそれをコピペして保存し、それをAccessに読み込んでテーブルの中に入れていくということが出来ますが、ただ、ここで説明するには手間がかかりすぎます。(データが重複してしまう場合に何をもって一意のレコードと判断するのかの基準もわからないですし、お客さんがどんなデータ入力をしているかもわからないので・・・) ちなみに、Excel上で空欄を「なし」にするには、前回の置換の要領で、「検索する文字列」に何も入力しないで、「置換後の文字列」に「なし」と入力してすべて置換します。あらかじめ広範囲に選択範囲を指定してから置換すれば、その中の空白セルがすべて「なし」となりますので、一発で置換できると思いますが・・・ 年齢なども同様に「歳」とか「才」が入力されていたり、半角全角が混ざっていたり・・・という場合は置換やVBAなどで文字列操作するといいとは思うのですが・・・ ダメですか?(^^)

  • gadd3
  • ベストアンサー率46% (211/451)
回答No.3

「mail2table」見ました。(^^) 操作説明書どおりに、A2以降にアンケートデータを貼り付け、以下のようにすると「=」を指定して処理できませんでしょうか?(Excel2000ではできました) 処理前に「=」の前と後のスペースを「すべて置換」で消すのです。 まず事前に「Paras」シートの「KugiriLbl⇒」を「お名前=」に変更しておきます。 また、「Rslts」シートの一行目をアンケートの項目名に変更しておきます。 (1)A2以降にまとめてデコード等を利用してまとめたアンケートデータを貼り付け(ただし、アンケート以外の不要データは消す?検証してません。) (2)Excelの「A」の部分をクリックして、1列全てを選択 (3)Excelの「編集」「置換」をクリック (4)「検索する文字列」に半角スペースを入力 (5)「置換後の文字列」は何も入れない。スペースを消すので。 (6)「すべて置換」を押す で、あとは「Quest」シートの「処理」ボタンを押します。 これでできないでしょうか?

momo-p
質問者

補足

返事が遅くなり申し訳ございません。 ちょっとバタバタしていまして。。 わざわざフリーソフトまで見ていただきありがとうございますm(_ _"m) まさに、今そのやり方でやっているのですが、もっと手間が省けないかな。。と思いまして。 というのも、この他に、年齢の欄の入力の仕方がばらばらだったり、ACCESSに取り込むときに空欄があるとエラーが出て取り込めなかったので、空欄には「なし」という字を入れたりとデータの手直しが結構必要なのです(x_x;)

  • bucyo
  • ベストアンサー率55% (128/229)
回答No.2

その1文字をタブ又はカンマで区切れば良いのではないですか?

  • gadd3
  • ベストアンサー率46% (211/451)
回答No.1

もし、OutlookExpressではなくてOutlook2000などをお持ちでしたら、OutlookExpressからOutlook2000などにエクスポートしてから、Outlook2000でmdbファイル形式でメール内容を書き出せます。 そのファイルのテーブルの「本文」をVBAなどで操作して名前等を抽出すればいいと思います。(=より右の文字列を取り出す…などで) Outlook2000の受信フォルダからmdbにメールを取り込む方法もあるのですが、97で使えるかわかりません。 一応参照設定をすればOutlook2000のメールデータが以下のようなサンプルのように取り出せます。 http://homepage1.nifty.com/tsware/tips/tips_257.htm もしかしたらAcc97でも使えるかも・・・ OE6から直接mdbにメールを取り込むにはMAPIコントロールというのが必要ですが、これはVB6とか、OfficeDeveloppperなんかが無いとできなかったように思います。僕が試した限りでは受信トレイ以外のメールは取り込めませんでした。(他のフォルダも取り込める方法がきっとあるんだと思うんですが…) あとは、フリーウェアなどを使って特定のフォルダにメールをeml形式のファイルとして書き出し、それをAccessで読み込む…かでしょうか?(これは文字コードの問題がめんどくさかったような・・・) 以上はOutlook2000での例なのでOutlook97で通用するかどうかはわかりません。 CDOなんちゃらかんちゃらというのもあるらしいです。 いろいろ試してみてください。 ではでは~!

参考URL:
http://homepage1.nifty.com/tsware/tips/tips_257.htm
momo-p
質問者

補足

教えていただいたURL見ました。 こんな便利なページがあるんですね。 早速お気に入りに登録しました。 けど、OUTLOOKはないんです。。 それでフリーソフトでいいのがないかな、と思って探していたら「mail2table」というのを見つけました。http://www.vector.co.jp/soft/dl/win95/business/se282807.html これは、複数のメールを「まとめてデコード」で一つにし、指定した区切り文字で分けるというようなものなのですが、区切り文字を1文字しか指定できないのです。。 送られてくるメールの区切りは半角スペース=半角スペースなので うまくないんです。変更しようにもロックがかかっていて開けませんでした。これと同じようなものを作れれば、最後にACCESSからこのファイルをインポートすればいいと思うのですが、知識不足なものでちんぷんかんぷんなのです・・。

関連するQ&A