- 締切済み
Excel 指定文字列でSPLIT
いつもお世話になっております。 前も同じことで質問させていただきましたが、 再度質問させて頂きます。 http://okwave.jp/qa/q8452163.htm 過去 「--------------------------」でくくってある部分ごとに、セルに書き出したい (テキストボックス) と質問しました。 しかし、テキストボックスではエラーが出て、 リッチボックスを使おうと試みるも色んな問題が出てきてしまった為… 結局、テキストボックスに書き込むはずだった内容を部分をセルに書くことにしようと思っています。 テキストボックスでやりたかった理由ですが、 書式設定がなくなる上、タブとか?色々消えるので テキストボックスで行いたかったのです。 また、ダブルクリックをして入力するのも面倒になってしまうので テキストボックスでやろうとしていました。 やりたいこと ● 全データをA1に貼り付ける (ユーザーが自分で行います) ● そのデータはSheet2のA1に保管(履歴をどんどん保持していきます。 ● ユーザーが貼り付けたA1のデータを「--------------------------」でSPLITし、変数に格納 ● B列に配列内容ひとつずつ貼り付けて?入力していきます。 ● 更にその内容をSPLITしていきます。「*************************」とかで。 ● それをC列に切り取り、貼り付け?していきます。 例) A1セル -------------------------- ああああああああああああああ あああああああああああ あああああああああああああ ああああああああああああ ************************* いいいいいいいいいいい いいいいいいいいいいいい いい いいいいいいいいいいいいいいい -------------------------- ううううううう うううううううううううう うううううううううううううう うううううう ************************* ええええええええええ えええ ええええええええ え -------------------------- ↓マクロ実行後 A B C 1 "-------------------------- ああああああああああああああ あああああああああああ あああああああああああああ ああああああああああああ ************************* いいいいいいいいいいい いいいいいいいいいいいい いい いいいいいいいいいいいいいいい -------------------------- ううううううう うううううううううううう うううううううううううううう うううううう *************" "ああああああああああああああ あああああああああああ あああああああああああああ ああああああああああああ" "いいいいいいいいいいい いいいいいいいいいいいい いい いいいいいいいいいいいいいいい" 2 "ううううううう うううううううううううう うううううううううううううう うううううう" "ええええええええええ えええ ええええええええ え" (エクセルに貼り付けると分かりますが、 A1に元データ、 B1にああああああああああああ C1にいいいいいいいいいいいいい B2にうううううううううううう C2にえええええええええええええええ が入ります。 Private Sub TEST() Dim a With Worksheets("Sheet1") Worksheets("Sheet1").Select a = Split(.Range("A1"), "--------------------------") .Range("B1").Resize(UBound(a), 1) = Application.Transpose(a) .Range("B1").Delete shift:=xlShiftUp a = Split(.Range("B1"), "*************************") .Range("C1") = a(0) .Range("D1") = a(1) a = Split(.Range("B2"), "*************************") .Range("C2") = a(0) .Range("D2") = a(1) End With End Sub 試しに作成してみましたが、 一応思ったとおりの結果が出ました! しかし、一つ一つ遣っていくわけにもいかないので ループする必要がありそうです… 行数を.rowで取得すれば上手くいくかもしれませんが、 もう少し効率の良い方法もありそうな気がしてなりません。 色々分かりにくくて申し訳ありませんが、 回答いただけると嬉しいです。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- WindFaller
- ベストアンサー率57% (465/803)
こんばんは。 >Wordに貼り付けて置換したいデータを保存。 >そうしてWordのマクロを実行すれば >上手く置換できるはず…?なため、 いわゆる「オーバーヘッド(Wordオブジェクトの呼び出しによる時間的なロス)」のことを考えないというなら、その手もあるのですが、ExcelでもWordでも、VBAに関しては、結果的には大きく変わらないはずです。 私としては、Excelで必ず出来るという確信を持って回答はしているのですが、やはり生ログでないとうまくいかないかもしれませんね。おそらく、見えていない部分があるのでしょう。 >置換するキーワードは必ず1メールに1個は配置されています つまり、すべてのキーワードは存在しない、ということですね。 私のコードは、完全な、キーワードが存在しないというエラー処理がされていません。 まだ、全体的な構成から、基本的なマクロの設計が決まっていないような気がするというか、私のほうは、連続して複数の質疑回答はみているつもりではいるのですが、未だ、全体像が見えていないままに、個々に回答している状態で、その場しのぎの感が強いのです。 それよりも、あまり、個々の回答者のコードをもらっていて、様々な考え方(コンセプト)に直面して、実際に、satoron666さんご自身がコード組み込むとなると、ある程度、そのコードの考え方を把握して進めていかないと、完成しないでしょう。その点で、私の今回のコードは、先走って失敗したと言えます。配列(Array)とInstrとMidの組み合わせは、私自身が使っているワザで、他人では、今ひとつ何をしているのか掴めないかと思います。 質問文の >一応思ったとおりの結果が出ました! とありますので、もう一度、原点に戻って考えなおしてみます。私が先走ってしまったからかもしれませんが、質問文の要求された処理が、実際のメールでは、どういうようになるのか理解していません。(←そんなことは考えなくてもよいと言われそうですが。)
- WindFaller
- ベストアンサー率57% (465/803)
こんにちは。 >a = Mid(n, x, y - x) >のところで躓いてしまいました… この辺りは、想定済みです。 今回の原因は、Mid で切り分けする時に、x, y の値が取れないというので、計算値(y-x)の値がマイナスになってエラーを発生するという特徴があります。それはよくあることですが、そのためには、InstStr で確実に、文字位置を取らなくてはならないということです。ここらになると、実際のデータに当たってみるのが早いし、本来、Webサイトの掲示板のように定形スタイルが決まっているのが条件かもしれません。 その辺りがちゃんとなっているかで、成否が別れます。 本来、こういうことは、コードを出す時点で書いて置かなくてはならなかったのでした。 私が、このコード自体を、もう5年以上近く使っているものを、あえて、ここに披露したのですが、実は、Webサイト(教えて!goo)のログを取り、切り分けるものを元にしたものです。 初期版からすると、9年近くなります。改編後、そのコードから正規表現を辞めてしまったのです。なぜ使わないのか明確な理由はないのですが、ひとつに、外部オブジェクトを利用しないということで、安定性ということを重視し、内部コマンドに変更したのです。言い換えれば、外部オブジェクトの出し入れの問題です。たんなる私の心配だけかもしれません。ここらは、本当の所は分かっていません。 たぶん、今までの回答では、その点を考慮しないからこそ、正規表現が出てきたと思うし、パターンの修正するのも手早いです。VBScriptの正規表現が悪いわけではないのです。また、ここらは元に戻しても構わないと思います。 そもそもの話になりますが、いわばフリーフォーマットの場合は、やっかいです。本来、今回のケースのようなスタイルは、ご存知かとも思いますが、カード型のデータベースの世界の話です。1枚のカードの容量も、結構あるし、設定も簡単なのですぐに使えるようになるのですが、昨今では、なかなか値段の張るアプリになってしまい、そう簡単に手に入らなくなってしまいました。今はExcelやWordが全盛ですが、以前では、もう少し選択肢において、豊富だったような気がします。Access はリレーショナル型ですから、今ひとつ敷居が高いようです。 >体調は大丈夫でしょうか?お大事にしてください! お心遣いありがとうございます。体調には波があって、この先、また休むかもしれませんが、ご容赦願います。
お礼
回答ありがとうございます。 >本来、Webサイトの掲示板のように >定形スタイルが決まっているのが条件かもしれません。 定形のスタイルは決まっていますが、 間のタブを削除する必要があったり、 文字数の違いもあったりします。 うーん、やはり難しいのでしょうか? >いわばフリーフォーマットの場合は、やっかいです。本来、今回のケースのようなスタイルは、ご存知かとも思いますが、カード型のデータベースの世界の話です。 色々勉強不足でしたので、調べました! 一応、置換するキーワードは必ず1メールに1個は配置されていますし、置換ミスというのは無いと考えられます。 また、本文の内容量などは変わってきますが、 定型型?は変わらないはずですので、 問題は無いかと思っております。 うーん、見方を変えて、 Wordに貼り付けて置換したいデータを保存。 そうしてWordのマクロを実行すれば 上手く置換できるはず…?なため、 それをExcelから利用していくほうが良いでしょうかね…?
- WindFaller
- ベストアンサー率57% (465/803)
こんばんは。 ちょっと、寒い日に身体を壊し、集中力を失ってしまいましたので、このような長丁場のものに関しては、書けなくなってしまいました。それで、やっと回復気味になり、気になっていた前回の途中から手を付けました。しかし、なんだか、今までやってきたことが、あやふやになってしまいました。手間を取らせてすみません。 >テキストボックスに表示できるということでしたら改行されて複数セルに入っていても問題ありません。 これに関しては、一旦、分割したものを、どこかに置いたほうがよいですね。 その上で、TextBox に出すなどしたらよいと思います。TextBox は、どうしても一時保存状態ですから、シートなり、TextFileに置かないといけません。今回は、シートに出力しました。 ここまで書いてみて、今まで、同じようなことはしてきましたが、できれば、本来、TextFileに再び出力して、そこからTextBox に出す方法や別シートにするなどが、考えられます。今回は、思っていたものとは違うかとは思いますが、参考にしてみてください。私自身は、このようなスタイルのものを使っています。 '// Sub TextExstract() Dim TextLine As String Dim buf As String Dim fNo As Integer Const fNAME As String = "Test1.txt" 'テキストファイル名 '----------------- '今回は、A1セルは使わずに、テキストインポートにした fNo = FreeFile() Open fNAME For Input As #fNo Do While Not EOF(fNo) Line Input #fNo, TextLine TextLine = Replace(TextLine, "転送者", vbCrLf & "転送者") '転送者の部分が次に続いている場合 If InStr(1, TextLine, "転送者", vbTextCompare) = 0 Then TextLine = DeleteSpace(TextLine) buf = buf & TextLine TextLine = "" End If Loop Close #fNo buf = Replace(buf, vbCrLf, "") '改行コードを抜く buf = Replace(buf, "件名", vbCrLf & "件名") '件名の前に、改行コードを入れる Call EnterWords(buf) End Sub Sub EnterWords(TextLine) '文字列を調整する Dim KeyWords As Variant Dim bufArray As Variant Dim n As Variant Dim a As String Dim buf As String Dim i As Long Dim x As Long Dim y As Long KeyWords = Array("件名", "本文", "本文おわり", "内容", "対策", "添付") bufArray = Split(TextLine, vbCrLf) For Each n In bufArray If Len(Trim(n)) > 1 Then For i = 0 To UBound(KeyWords) If i < UBound(KeyWords) Then x = InStr(1, n, KeyWords(i), 1) y = InStr(1, n, KeyWords(i + 1), 1) If x > 0 And y > 0 Then a = Mid(n, x, y - x) If KeyWords(i) <> "本文おわり" Then a = Replace(a, KeyWords(i), "<" & KeyWords(i) & ">" & vbCrLf) buf = buf & vbCrLf & a End If End If Else y = InStr(1, n, KeyWords(i), 1) If y > 0 Then a = Mid(n, y) a = Replace(a, KeyWords(i), "<" & KeyWords(i) & ">" & vbCrLf) buf = buf & vbCrLf & a End If End If x = 0: y = 0 Next i End If Next n buf = Replace(buf, "<件名", String(10, "-") & "<件名") 'シート出力用 buf = Replace(buf, "<対策", String(10, "*") & "<対策") 'buf = Replace(buf, "<件名", String(10, "-") & vbCrLf & "<件名") 'そのまま出力 'buf = Replace(buf, "<対策", String(10, "*") & vbCrLf & "<対策") 'Debug.Print buf 'イミディエイト・ウィンドーへ Call TextOut2Sheet(buf) 'シート出力 End Sub Function DeleteSpace(TextLine As Variant) '余分な改行コードを抜く Do Until InStr(1, TextLine, Space(1), 1) = 0 '1 = TextCompareMode TextLine = Replace(TextLine, Space(1), "", , , 1) Loop DeleteSpace = TextLine End Function Sub TextOut2Sheet(TextLine As String) 'シートに出力 Dim bufArray As Variant Dim buf As Variant Dim buf1 As Variant Dim i As Long Dim j As Long j = 2 bufArray = Split(TextLine, String(10, "-")) If IsArray(bufArray) Then For i = 0 To UBound(bufArray) buf = bufArray(i) If Len(buf) > 0 Then buf1 = Split(buf, String(10, "*")) If UBound(buf1) > 0 Then '個別で配列がある場合 Cells(j, 2).Value = buf1(0) Cells(j, 3).Value = buf1(1) j = j + 1 End If End If Next i Else MsgBox "取得したデータに不明なエラーが発生しています。", vbExclamation End If End Sub '//
お礼
回答ありがとうございます。 >こんばんは。 こんばんは! >ちょっと、寒い日に身体を壊し、集中力を失ってしまいましたので、このような長丁場のものに関しては、書けなくなってしまいました。それで、やっと回復気味になり、気になっていた前回の途中から手を付けました。しかし、なんだか、今までやってきたことが、あやふやになってしまいました。手間を取らせてすみません。 体調は大丈夫でしょうか?お大事にしてください! また、回答頂き本当に助かっております!ありがとうございます^^ なんだかとても難しいプログラムですね! まだ5行目くらいまでしか理解できておりませんorz 少しずつ、勉強させていただきます! a = Mid(n, x, y - x) のところで躓いてしまいました… プロシージャの呼び出し、または引数が不正らしいです。 もう少し自分で考えて見ます^^
- WindFaller
- ベストアンサー率57% (465/803)
こんばんは。 まず、 今回のお礼の欄の >ただ、保存するときに文字コードを何にするか悩むところです。 ANSI?Unicode? たぶん、Unicodeだと思いますが… 別に特別気にすることはありません。一応、ANSIであろうが、Unicodeであろうが、UTFであろうが、それは、後にしましょう。一応、Excelで出会う、文字コード変換はほとんど可能なテクニックは持っているつもりです。 「このテキストファイルは、間違いないですね。」 これは、テキストファイルを、VBAで読み込んで構わないですよね、ということです。 あくまでも、ワークシートのセルからだというと、少し話が違ってきますから。 「別の便利なツールのコントロールのことを思い出したのですが、例のRuntimeかどうかは忘れてしまいましたので、それは後ほど確認します。」 この件については、忘れてください。どうやら、使う段階にはないようです。理由は、テキストファイル自体が、1つしかなさそうだからです。 前回の#8450279のお礼の欄の質問に答えておくと、 >+?で、要らない部分も置換しているのでしょうか? そう聞かれれば、そういうことになりますが、正確に書けば、"本文おわり.+?内容" で、"本文おわり"のところから、"内容"のところまで、探せということです。これを、「最短マッチ法」(最短一致)と呼ばれています。 >Accessは一度も使ったことが無く、 >どう使うべきか良く分かっていないのですが… >大丈夫でしょうか? 今回は、あまり考慮に入れることはないと思います。Accessの方が、VBAにおいて「生(き)=混じりけのない」の部分が多いから、ユーザー側のテクニックが発展したような気がしますが、それは、逆にExcelは、いろんなオブジェクトがあるということです。だから、Accessは、やむをえずに、いろんなテクニックを使うことが多いのだと思います。 さて、やはり分からないところが出てきました。 1. 前回の#8450279の質問と、今回の質問とをどう結びつけるのかの点で、 前回は、「件名, 本文, 本文おわり, 内容, 対策, 添付」が、区切り文字でしたが、 今回の >************* >------------- と、どう結びつくのかということです。 前回の解答案として、あえて別なものを考えてみました。 実際のデータに当たれば、もっと早くできあがるのですが、最終的には、satoron666さんに委ねられているので、単発では可能でも、全体的にはどうかなっていうところです。 もちろん、前回の質問に対して、(TextBoxではないが)同じような結果にはなるのですが、コードが思った通りややこしいのは、避けられません。ただ、今回の質問の部分と合わせられるような構想の元に考えているからです。正規表現の場合の方がパターンさえ書ければ、修正は楽です。 2. 最初に尋ねるべき内容だったのですが、Excelのワークシートに貼り付けた時に、どのテキストファイルでも、A1やB1に全部入ってしまうのか、という疑問です。言い換えると、改行コードの問題です。CR+LFが入っていれば、自動的に複数のセルにテキストファイルは、またぐはずです。 テキストボックスの場合は、確かに、ひとつの中に収まろうとしますが、ワークシートの場合は、そうはいかないように思います。 なお、今回は、あまりひとつのパターンに拘らないほうが良いかなと思います。臨機応変というか、いろんな手立てからアプローチしてみてもよいと思います。つまり、Split関数も、一案にしかすぎません。 書いてある内容が、分かりにくかったら、ご指摘ください。
お礼
回答ありがとうございます! >一応、Excelで出会う、文字コード変換はほとんど可能なテクニックは持っているつもりです。 すごいですね…!見習って色々勉強しないと… >これは、テキストファイルを、VBAで読み込んで構わないですよね、ということです。 はい、テキストファイル資本で考えていきたいと思います! >"本文おわり.+?内容" で、"本文おわり"のところから、"内容"のところまで、探せということです。これを、「最短マッチ法」(最短一致)と呼ばれています。 そういうことだったんですね^^勉強になります! >Accessの方が、VBAにおいて「生(き)=混じりけのない」の部分が多いから、ユーザー側のテクニックが発展したような気がしますが、それは、逆にExcelは、いろんなオブジェクトがあるということです。だから、Accessは、やむをえずに、いろんなテクニックを使うことが多いのだと思います。 ふむふむ。Accessで色々発展した内容をExcelにも使われている・・・ということでしょうか? >1. 前回の#8450279の質問と、今回の質問とをどう結びつけるのかの点で、前回は、「件名, 本文, 本文おわり, 内容, 対策, 添付」が、区切り文字でしたが、今回の >************* >------------- >と、どう結びつくのかということです。 前の質問内容には載せていませんが、 行頭 転送者、件名、本文、本文終わり、内容、対策、署名、転送者… と続いていきます。 行頭から転送者までの間に-------------が入り、 (メール1通ごとに-------------の区切りが入ります。) また、本文終わりの最後と、内容の間に *************が入る置換処理をしていたと思います。 例として出したものを置換すると、 下記のようになるように自分で修正していました。 ------------- <件名> ああああああああああ <本文> ああああああああああ ああああああああああ ああああああああああ <内容> うううううううううううううううううううう ううううううううううううううううう ************* <対策> ええええええええええ えええええええええええええええ <添付> おおおおおおおおおおお おおおおおおおおお ------------- <件名> ああああああああああ <本文> ああああああああああ ああああああああああ ああああああああああ <内容> うううううううううううううううううううう ううううううううううううううううう ************* <対策> ええええええええええ えええええええええええええええ <添付> おおおおおおおおおおお おおおおおおおおお ------------- >2. 最初に尋ねるべき内容だったのですが、Excelのワークシートに貼り付けた時に、どのテキストファイルでも、A1やB1に全部入ってしまうのか、という疑問です。 そうですね…そうなったほうがありがたいです。 改行コードが邪魔なら、前もって置換しておいて 改行をなくしておいても良いと思います。 (改行がなくなっていても、後から足すので大丈夫です) でも、そういう事をしないで、 最終的に(分割したデータを) テキストボックスに表示できるということでしたら 改行されて複数セルに入っていても問題ありません。 メール1 |--------||--------| |<件名>- ||<対策>- | |--------||--------| |<本文>- ||--------| |--------||--------| |<内容>- ||<添付>- | |--------||--------| |--------||--------| ← → のように、矢印を押したら次のメール内容を表示 とかできれば一番良いと思っています! >書いてある内容が、分かりにくかったら、ご指摘ください。 とても良く分かります、ありがとうございます! 現在の進捗状況ですが、 ファイル選択するダイアログ?を出すとこまでは 作れました!(たぶんですが) 色々説明不足かもしれませんが、 何か不明点などあればおしえてください! よろしくお願い致します。
- WindFaller
- ベストアンサー率57% (465/803)
こんばんは。 >読み取った後の置換がこの方法だと出来なくなってしまいます… 私は、この話はよく分かっていません。そういうことは、読み込む際に置換すればよいのではないでしょうか? >1.テキストファイルを全部まとめて読み込み、置換 このテキストファイルは、間違いないですね。 ここらは、別の便利なツールのコントロールのことを思い出したのですが、例のRuntimeかどうかは忘れてしまいましたので、それは後ほど確認します。 >2.置換後、テキストファイル2を出力 >3.出力したテキストファイル2を1行ずつ読み込む 置換後が一旦、別のテキストファイル2になるというなら、何か無駄があるような気がします。ただし、よほど巨大ファイルでもなければ、スピード自体は、大幅な違いはないはずです。ここら辺は、全部、メモリ内で処理すればよいのだと、考えています。 >複数のメールを転送にし、それを全て貼り付けてから メーラーにもよりますが、これ自体は、OutLookからですと、かなりのことが出来ますね。 とりあえず、前の質問の#8450279をもう一度、こちらのスタイルで考えさせていただきたいと思います。 >Set FSO = CreateObject("Scripting.FileSystemObject") >Set Txt = FSO.OpenTextFile(FileName, ForReading) これについては、Accessの話ですね。外部オブジェクトを使うかどうかは、少し勝手が違うだけで、考えるほど大きな差はないのですが、内部コマンドのほうが扱いやすいということは言っておきます。もちろん、前回のRegExp(正規表現置換)という方法もないわけではありませんが、若干、遅いということが玉にきずで、その代わり、パターンの修正がし易いという利点があります。 数年の間使ってみると、個人的に感覚では、前の方が書いた回答のように、最終的に、RegExpに軍配が上がるようですが、定型の場合は、内部コマンドで済ませてしまいます。ただ、それは修正しにくくなります。 まだ、私が分かっていない部分もあるとは思いますが、コードを出して、なるべく早く次の回答をつけて修正するつもりです。
お礼
回答ありがとうございます! >>1.テキストファイルを全部まとめて読み込み、置換 >このテキストファイルは、間違いないですね。 間違いない…? 問題ないかと思います。 ただ、保存するときに文字コードを何にするか悩むところです。 ANSI?Unicode? たぶん、Unicodeだと思いますが… >置換後が一旦、別のテキストファイル2になるというなら、 >何か無駄があるような気がします。 >ただし、よほど巨大ファイルでもなければ、 >スピード自体は、大幅な違いはないはずです。 >ここら辺は、全部、メモリ内で処理すればよいのだと、考えています。 最大サイズがどのくらいになるか分かりませんが、 現在試してみたら76Kありました。 これ以上に増えることはあるかと思いますが、 1Gまではいかないだろう…と思っております。 10Mメモリがあれば大丈夫なのでしょうか…? >メーラーにもよりますが、これ自体は、OutLookからですと、かなりのことが出来ますね。 申し訳ないのですが、プログラムが組めないメーラーなのです。Notesというメーラーを使用しておりまして、 色々触るのが怖く(管理者でもないため)、プログラム組めない状況です。 >とりあえず、前の質問の#8450279をもう一度、 >こちらのスタイルで考えさせていただきたいと思います。 ありがとうございます! Accessは一度も使ったことが無く、 どう使うべきか良く分かっていないのですが… 大丈夫でしょうか? 色々対応頂き、本当にありがとうございます! とりあえず、プログラムの大枠を作っておきたいと思います!
- WindFaller
- ベストアンサー率57% (465/803)
こんばんは。 私用で、レスをつけるのが遅くなりました。 前回の書き込みも読ませていただきました。 >置換すると、元データは消えてしまいますし、 >テキストボックスの内容をセルに書き出して、 >それをずらしていく?みたいな考えなのですかね? なるほど、経緯をやっと氷解しました。そのために、テキストボックスを置いたわけですね。これは、変数の場合は、オブジェクト型ですと、同じくうまく行きません。これは経験しないと分かりませんね。 >実行時エラー '2147417848(80010108)' >オートメーションエラーです。 ところが、64kbを越えたので、こうなってしまったとつながるわけですね。 今回の話は、 >● 全データをA1に貼り付ける (ユーザーが自分で行います) この前も書いたけれども、それ自体は、無理ではないでしょうか。64kb までです。 閾値(いきち)を、見出さないといけませんが、それは、今の段階では、おいておきます。これを解決するには、実際のデータから割り出さないといけませんから。 最初の素朴な疑問として、巨大なデータを処理するにしても、元のソースはExcelではありませんね? A1に貼り付けるというのは、元は別のものということになりそうです。 それはさておいて、実際、本格的にはVBAマクロを書かなくなった私でも、今でも、唯一使っているマクロが同じように、WebデータをSplitを利用したものなのです。要するに、大分類・小分類と分けていくということになるのです。 ただ、前回、おっしゃっていたような、巨大ファイルの場合は、通常の方法では保証できないのです。 言い換えると、ここの部分です。前回の問題は解決されません。 a = Split(.Range("A1"), "--------------------------") それは、今回の問題が片付いてからにしましょう。 '//テスト的に作ってみました。A1に置くことをせずに、テキストファイルにしました。 Sub TestSpliting0() Dim fNo As Integer Dim textLine As String Dim buf As String Dim buf1 As Variant Dim buf2 As Variant Dim i As Long Dim j As Long Dim k As Long '----------------- '今回は、A1セルは使わずに、テキストインポートにした fNo = FreeFile() Open "TestDoc.txt" For Input As #fNo Do While Not EOF(fNo) Line Input #fNo, textLine buf = buf & textLine Loop Close #fNo '----------------- buf1 = Split(buf, "--------------------------") If IsArray(buf1) = False Then MsgBox "配列が取れません。", vbCritical: Exit Sub '配列でない場合 For i = 0 To UBound(buf1) buf2 = Split(buf1(i), "*************************") If IsArray(buf2) And UBound(buf2) > -1 Then '区切り線が、最初にあるのでスキップ k = k + 1 '必ずしも、i と k(行数)は一致しない For j = 0 To UBound(buf2) Cells(k, j + 2).Value = buf2(j) 'B列からだから、j+2 Next j End If Next i End Sub '//
お礼
回答ありがとうございます! 色々説明不足で申し訳ありませんでした! A1に貼り付けるデータですが、ソースは転送メールになります。 複数のメールを転送にし、それを全て貼り付けてから 置換し、分解?していこうという考えです。 >>● 全データをA1に貼り付ける (ユーザーが自分で行います) >この前も書いたけれども、それ自体は、無理ではないでしょうか。 >64kb までです。 直接セルに書き込んだ場合であっても、 64kbまででしたか(苦笑 では、テキストボックスと変わらないのですね! 他の方法…教えて頂いた方法がベストかもしれないです^^ 教えて頂いたプログラム、なんとなくですが分かりました! ですが…読み取った後の置換がこの方法だと出来なくなってしまいます… 置換しないと、SPLIT文字列が出ないのです。 また、置換するときは行をまたいだ置換をしています。 http://okwave.jp/qa/q8450279.html (テキストボックスからの置換でしたが、他の方向に考え直します ReadAllも良いのではないか、と考えております。) 1.テキストファイルを全部まとめて読み込み、置換 2.置換後、テキストファイル2を出力 3.出力したテキストファイル2を1行ずつ読み込む 4.読み込んだテキストファイル2をSPLIT 5.SPLIT後のデータをセルに書き出す という流れにしようと考えてます! 教えて頂いたプログラムを元に、考えてみます^^ 色々ありがとうございます!
補足
http://www.moug.net/tech/acvba/0090005.html 上記リンクを参考に編集していきたいとおもいます^^
お礼
回答ありがとうございます! 回答いただいたのに通知が無く、返信遅れて申し訳ありません! 置換するキーワードについては毎回あり、 Wordで問題なく作業できていますので、 今はそれをExcelに転換する段階になっています。 今やっている作業としては、 1.メールを選択し、転送形式にする 2.テキストに貼り付け、それをコピー (書式を無くすためです) 3.Wordに貼り付け 4.マクロを実行(置換マクロです) 5.[-----]で1メールずつ区切られているので、 それを利用し、1メールずつ色々仕分ける (ここは必ず手作業になります) 6.他の転送メールを取得し、コピー (形式が全然違います) 7.テキストに貼り付け、それをコピー 8.Word(違うマクロのあるWord)に貼り付け 9.マクロ2、マクロ3を実行 (2回目の転送メールを貼り付けてマクロ2実行し、) (その後2回目のメールを貼り付けてマクロ3を実行) 10.最終テキストの並び替えなどをして、最終形式へ (田中、とか名前ごとに並び替えしたりします) (Wordでやっているため、手作業でやっております) 11.(9、10)の内容をメール送信 という流れになっています。 置換など、一応やろうと思っていることはできている?ので どうにか、一括で出来ないものか…と考えています。 (最初のメールは別に良いとして、11の内容をメール送信 を手軽に?できればいいなと思っています。) 色々とごちゃごちゃとすみませんorz 毎回、回答ありがとうございます!!