• 締切済み

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で取得すれば上手くいくかもしれませんが、 もう少し効率の良い方法もありそうな気がしてなりません。 色々分かりにくくて申し訳ありませんが、 回答いただけると嬉しいです。

みんなの回答

回答No.6

こんばんは。 >Wordに貼り付けて置換したいデータを保存。 >そうしてWordのマクロを実行すれば >上手く置換できるはず…?なため、 いわゆる「オーバーヘッド(Wordオブジェクトの呼び出しによる時間的なロス)」のことを考えないというなら、その手もあるのですが、ExcelでもWordでも、VBAに関しては、結果的には大きく変わらないはずです。 私としては、Excelで必ず出来るという確信を持って回答はしているのですが、やはり生ログでないとうまくいかないかもしれませんね。おそらく、見えていない部分があるのでしょう。 >置換するキーワードは必ず1メールに1個は配置されています つまり、すべてのキーワードは存在しない、ということですね。 私のコードは、完全な、キーワードが存在しないというエラー処理がされていません。 まだ、全体的な構成から、基本的なマクロの設計が決まっていないような気がするというか、私のほうは、連続して複数の質疑回答はみているつもりではいるのですが、未だ、全体像が見えていないままに、個々に回答している状態で、その場しのぎの感が強いのです。 それよりも、あまり、個々の回答者のコードをもらっていて、様々な考え方(コンセプト)に直面して、実際に、satoron666さんご自身がコード組み込むとなると、ある程度、そのコードの考え方を把握して進めていかないと、完成しないでしょう。その点で、私の今回のコードは、先走って失敗したと言えます。配列(Array)とInstrとMidの組み合わせは、私自身が使っているワザで、他人では、今ひとつ何をしているのか掴めないかと思います。 質問文の >一応思ったとおりの結果が出ました! とありますので、もう一度、原点に戻って考えなおしてみます。私が先走ってしまったからかもしれませんが、質問文の要求された処理が、実際のメールでは、どういうようになるのか理解していません。(←そんなことは考えなくてもよいと言われそうですが。)

satoron666
質問者

お礼

回答ありがとうございます! 回答いただいたのに通知が無く、返信遅れて申し訳ありません! 置換するキーワードについては毎回あり、 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 毎回、回答ありがとうございます!!

回答No.5

こんにちは。 >a = Mid(n, x, y - x) >のところで躓いてしまいました… この辺りは、想定済みです。 今回の原因は、Mid で切り分けする時に、x, y の値が取れないというので、計算値(y-x)の値がマイナスになってエラーを発生するという特徴があります。それはよくあることですが、そのためには、InstStr で確実に、文字位置を取らなくてはならないということです。ここらになると、実際のデータに当たってみるのが早いし、本来、Webサイトの掲示板のように定形スタイルが決まっているのが条件かもしれません。 その辺りがちゃんとなっているかで、成否が別れます。 本来、こういうことは、コードを出す時点で書いて置かなくてはならなかったのでした。 私が、このコード自体を、もう5年以上近く使っているものを、あえて、ここに披露したのですが、実は、Webサイト(教えて!goo)のログを取り、切り分けるものを元にしたものです。 初期版からすると、9年近くなります。改編後、そのコードから正規表現を辞めてしまったのです。なぜ使わないのか明確な理由はないのですが、ひとつに、外部オブジェクトを利用しないということで、安定性ということを重視し、内部コマンドに変更したのです。言い換えれば、外部オブジェクトの出し入れの問題です。たんなる私の心配だけかもしれません。ここらは、本当の所は分かっていません。 たぶん、今までの回答では、その点を考慮しないからこそ、正規表現が出てきたと思うし、パターンの修正するのも手早いです。VBScriptの正規表現が悪いわけではないのです。また、ここらは元に戻しても構わないと思います。 そもそもの話になりますが、いわばフリーフォーマットの場合は、やっかいです。本来、今回のケースのようなスタイルは、ご存知かとも思いますが、カード型のデータベースの世界の話です。1枚のカードの容量も、結構あるし、設定も簡単なのですぐに使えるようになるのですが、昨今では、なかなか値段の張るアプリになってしまい、そう簡単に手に入らなくなってしまいました。今はExcelやWordが全盛ですが、以前では、もう少し選択肢において、豊富だったような気がします。Access はリレーショナル型ですから、今ひとつ敷居が高いようです。 >体調は大丈夫でしょうか?お大事にしてください! お心遣いありがとうございます。体調には波があって、この先、また休むかもしれませんが、ご容赦願います。

satoron666
質問者

お礼

回答ありがとうございます。 >本来、Webサイトの掲示板のように >定形スタイルが決まっているのが条件かもしれません。 定形のスタイルは決まっていますが、 間のタブを削除する必要があったり、 文字数の違いもあったりします。 うーん、やはり難しいのでしょうか? >いわばフリーフォーマットの場合は、やっかいです。本来、今回のケースのようなスタイルは、ご存知かとも思いますが、カード型のデータベースの世界の話です。 色々勉強不足でしたので、調べました! 一応、置換するキーワードは必ず1メールに1個は配置されていますし、置換ミスというのは無いと考えられます。 また、本文の内容量などは変わってきますが、 定型型?は変わらないはずですので、 問題は無いかと思っております。 うーん、見方を変えて、 Wordに貼り付けて置換したいデータを保存。 そうしてWordのマクロを実行すれば 上手く置換できるはず…?なため、 それをExcelから利用していくほうが良いでしょうかね…?

回答No.4

こんばんは。 ちょっと、寒い日に身体を壊し、集中力を失ってしまいましたので、このような長丁場のものに関しては、書けなくなってしまいました。それで、やっと回復気味になり、気になっていた前回の途中から手を付けました。しかし、なんだか、今までやってきたことが、あやふやになってしまいました。手間を取らせてすみません。 >テキストボックスに表示できるということでしたら改行されて複数セルに入っていても問題ありません。 これに関しては、一旦、分割したものを、どこかに置いたほうがよいですね。 その上で、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 '//

satoron666
質問者

お礼

回答ありがとうございます。 >こんばんは。 こんばんは! >ちょっと、寒い日に身体を壊し、集中力を失ってしまいましたので、このような長丁場のものに関しては、書けなくなってしまいました。それで、やっと回復気味になり、気になっていた前回の途中から手を付けました。しかし、なんだか、今までやってきたことが、あやふやになってしまいました。手間を取らせてすみません。 体調は大丈夫でしょうか?お大事にしてください! また、回答頂き本当に助かっております!ありがとうございます^^ なんだかとても難しいプログラムですね! まだ5行目くらいまでしか理解できておりませんorz 少しずつ、勉強させていただきます! a = Mid(n, x, y - x) のところで躓いてしまいました… プロシージャの呼び出し、または引数が不正らしいです。 もう少し自分で考えて見ます^^

回答No.3

こんばんは。 まず、 今回のお礼の欄の >ただ、保存するときに文字コードを何にするか悩むところです。 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関数も、一案にしかすぎません。 書いてある内容が、分かりにくかったら、ご指摘ください。

satoron666
質問者

お礼

回答ありがとうございます! >一応、Excelで出会う、文字コード変換はほとんど可能なテクニックは持っているつもりです。 すごいですね…!見習って色々勉強しないと… >これは、テキストファイルを、VBAで読み込んで構わないですよね、ということです。 はい、テキストファイル資本で考えていきたいと思います! >"本文おわり.+?内容" で、"本文おわり"のところから、"内容"のところまで、探せということです。これを、「最短マッチ法」(最短一致)と呼ばれています。 そういうことだったんですね^^勉強になります! >Accessの方が、VBAにおいて「生(き)=混じりけのない」の部分が多いから、ユーザー側のテクニックが発展したような気がしますが、それは、逆にExcelは、いろんなオブジェクトがあるということです。だから、Accessは、やむをえずに、いろんなテクニックを使うことが多いのだと思います。 ふむふむ。Accessで色々発展した内容をExcelにも使われている・・・ということでしょうか? >1.  前回の#8450279の質問と、今回の質問とをどう結びつけるのかの点で、前回は、「件名, 本文, 本文おわり, 内容, 対策, 添付」が、区切り文字でしたが、今回の >************* >------------- >と、どう結びつくのかということです。 前の質問内容には載せていませんが、 行頭 転送者、件名、本文、本文終わり、内容、対策、署名、転送者… と続いていきます。 行頭から転送者までの間に-------------が入り、 (メール1通ごとに-------------の区切りが入ります。) また、本文終わりの最後と、内容の間に *************が入る置換処理をしていたと思います。 例として出したものを置換すると、 下記のようになるように自分で修正していました。 ------------- <件名> ああああああああああ <本文> ああああああああああ ああああああああああ ああああああああああ <内容> うううううううううううううううううううう ううううううううううううううううう ************* <対策> ええええええええええ えええええええええええええええ <添付> おおおおおおおおおおお おおおおおおおおお ------------- <件名> ああああああああああ <本文> ああああああああああ ああああああああああ ああああああああああ <内容> うううううううううううううううううううう ううううううううううううううううう ************* <対策> ええええええええええ えええええええええええええええ <添付> おおおおおおおおおおお おおおおおおおおお ------------- >2. 最初に尋ねるべき内容だったのですが、Excelのワークシートに貼り付けた時に、どのテキストファイルでも、A1やB1に全部入ってしまうのか、という疑問です。 そうですね…そうなったほうがありがたいです。 改行コードが邪魔なら、前もって置換しておいて 改行をなくしておいても良いと思います。 (改行がなくなっていても、後から足すので大丈夫です) でも、そういう事をしないで、 最終的に(分割したデータを) テキストボックスに表示できるということでしたら 改行されて複数セルに入っていても問題ありません。 メール1 |--------||--------| |<件名>- ||<対策>- | |--------||--------| |<本文>- ||--------| |--------||--------| |<内容>- ||<添付>- | |--------||--------| |--------||--------|      ←  → のように、矢印を押したら次のメール内容を表示 とかできれば一番良いと思っています! >書いてある内容が、分かりにくかったら、ご指摘ください。 とても良く分かります、ありがとうございます! 現在の進捗状況ですが、 ファイル選択するダイアログ?を出すとこまでは 作れました!(たぶんですが) 色々説明不足かもしれませんが、 何か不明点などあればおしえてください! よろしくお願い致します。

回答No.2

こんばんは。 >読み取った後の置換がこの方法だと出来なくなってしまいます… 私は、この話はよく分かっていません。そういうことは、読み込む際に置換すればよいのではないでしょうか? >1.テキストファイルを全部まとめて読み込み、置換 このテキストファイルは、間違いないですね。 ここらは、別の便利なツールのコントロールのことを思い出したのですが、例のRuntimeかどうかは忘れてしまいましたので、それは後ほど確認します。 >2.置換後、テキストファイル2を出力 >3.出力したテキストファイル2を1行ずつ読み込む 置換後が一旦、別のテキストファイル2になるというなら、何か無駄があるような気がします。ただし、よほど巨大ファイルでもなければ、スピード自体は、大幅な違いはないはずです。ここら辺は、全部、メモリ内で処理すればよいのだと、考えています。 >複数のメールを転送にし、それを全て貼り付けてから メーラーにもよりますが、これ自体は、OutLookからですと、かなりのことが出来ますね。 とりあえず、前の質問の#8450279をもう一度、こちらのスタイルで考えさせていただきたいと思います。 >Set FSO = CreateObject("Scripting.FileSystemObject") >Set Txt = FSO.OpenTextFile(FileName, ForReading) これについては、Accessの話ですね。外部オブジェクトを使うかどうかは、少し勝手が違うだけで、考えるほど大きな差はないのですが、内部コマンドのほうが扱いやすいということは言っておきます。もちろん、前回のRegExp(正規表現置換)という方法もないわけではありませんが、若干、遅いということが玉にきずで、その代わり、パターンの修正がし易いという利点があります。 数年の間使ってみると、個人的に感覚では、前の方が書いた回答のように、最終的に、RegExpに軍配が上がるようですが、定型の場合は、内部コマンドで済ませてしまいます。ただ、それは修正しにくくなります。 まだ、私が分かっていない部分もあるとは思いますが、コードを出して、なるべく早く次の回答をつけて修正するつもりです。

satoron666
質問者

お礼

回答ありがとうございます! >>1.テキストファイルを全部まとめて読み込み、置換 >このテキストファイルは、間違いないですね。 間違いない…? 問題ないかと思います。 ただ、保存するときに文字コードを何にするか悩むところです。 ANSI?Unicode? たぶん、Unicodeだと思いますが… >置換後が一旦、別のテキストファイル2になるというなら、 >何か無駄があるような気がします。 >ただし、よほど巨大ファイルでもなければ、 >スピード自体は、大幅な違いはないはずです。 >ここら辺は、全部、メモリ内で処理すればよいのだと、考えています。 最大サイズがどのくらいになるか分かりませんが、 現在試してみたら76Kありました。 これ以上に増えることはあるかと思いますが、 1Gまではいかないだろう…と思っております。 10Mメモリがあれば大丈夫なのでしょうか…? >メーラーにもよりますが、これ自体は、OutLookからですと、かなりのことが出来ますね。 申し訳ないのですが、プログラムが組めないメーラーなのです。Notesというメーラーを使用しておりまして、 色々触るのが怖く(管理者でもないため)、プログラム組めない状況です。 >とりあえず、前の質問の#8450279をもう一度、 >こちらのスタイルで考えさせていただきたいと思います。 ありがとうございます! Accessは一度も使ったことが無く、 どう使うべきか良く分かっていないのですが… 大丈夫でしょうか? 色々対応頂き、本当にありがとうございます! とりあえず、プログラムの大枠を作っておきたいと思います!

回答No.1

こんばんは。 私用で、レスをつけるのが遅くなりました。 前回の書き込みも読ませていただきました。 >置換すると、元データは消えてしまいますし、 >テキストボックスの内容をセルに書き出して、 >それをずらしていく?みたいな考えなのですかね? なるほど、経緯をやっと氷解しました。そのために、テキストボックスを置いたわけですね。これは、変数の場合は、オブジェクト型ですと、同じくうまく行きません。これは経験しないと分かりませんね。 >実行時エラー '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 '//

satoron666
質問者

お礼

回答ありがとうございます! 色々説明不足で申し訳ありませんでした! A1に貼り付けるデータですが、ソースは転送メールになります。 複数のメールを転送にし、それを全て貼り付けてから 置換し、分解?していこうという考えです。 >>● 全データをA1に貼り付ける (ユーザーが自分で行います) >この前も書いたけれども、それ自体は、無理ではないでしょうか。 >64kb までです。 直接セルに書き込んだ場合であっても、 64kbまででしたか(苦笑 では、テキストボックスと変わらないのですね! 他の方法…教えて頂いた方法がベストかもしれないです^^ 教えて頂いたプログラム、なんとなくですが分かりました! ですが…読み取った後の置換がこの方法だと出来なくなってしまいます… 置換しないと、SPLIT文字列が出ないのです。 また、置換するときは行をまたいだ置換をしています。 http://okwave.jp/qa/q8450279.html (テキストボックスからの置換でしたが、他の方向に考え直します  ReadAllも良いのではないか、と考えております。) 1.テキストファイルを全部まとめて読み込み、置換 2.置換後、テキストファイル2を出力 3.出力したテキストファイル2を1行ずつ読み込む 4.読み込んだテキストファイル2をSPLIT 5.SPLIT後のデータをセルに書き出す という流れにしようと考えてます! 教えて頂いたプログラムを元に、考えてみます^^ 色々ありがとうございます!

satoron666
質問者

補足

http://www.moug.net/tech/acvba/0090005.html 上記リンクを参考に編集していきたいとおもいます^^

関連するQ&A

  • 指定したシートに入力する。

    よろしくお願いします。 ユーザーフォームのテキストボックスのデータをコマンドボタンをクリックしたときに 指定シート(AAA)の最終行+1(C)に入力する。 Private Sub CommandButton5_Click() With Worksheets("AAA") .Range("C65536").End(xlUp).Row 1 = TextBox4 End With End Sub と、したのですが、シート(AAA)に入力されません。 よろしくご教示お願いします。

  • エクセルのフォームのVBAについて

    VBAがまったくわからないのに参考書を見て高度な事に挑戦しています フォームは作れてフォームをクリックやら入力やらして作ったOKボタンを押すと シート2のA1B1C1‥の列に入力文字だけが羅列されます。 しかし次にやろうとするとA2B2C2‥と下に行かず又A1B1C1‥の列の文字が変更になり続きません。何がいけないのでしょうか? Sub 入力() Dim LastRow As Long With Worksheets("sheet2") LastRow = Worksheets("sheet2").Range("A" & Rows.Count).End(xlUp).Row .Range("A" & LastRow).Value = Worksheets("sheet1").Range("A5").Value .Range("B" & LastRow).Value = Worksheets("sheet1").Range("A7").Value .Range("C" & LastRow).Value = Worksheets("sheet1").Range("A8").Value .Range("D" & LastRow).Value = Worksheets("sheet1").Range("A10").Value End With End Sub と参考書とおりいれたのですが‥。教えて下さい。

  • エクセルVBA 1つのシートで出来ますか?

    説明が下手で申し訳ございませんが、宜しくお願い致します。 sheet(1)に20個のボタンがあります。 ボタンをクリックすると、別のシートが開きます。 開いたシートにも複数のボタンがあり、そのうちの任意のボタンをクリックすると、そのボタンの値がsheet(1)のそれぞれのボタンに対応したセルに入力される、という動作を実現したいと思っています。 現状、下記のようなコードで目的の動作は実現できてはいるのですが、各ボタンそれぞれにシートを作っているような状況です。(データ自体は全く同じ内容のものが、計20シート) たぶん、もの凄く頭の悪い事をやっているんだろうと思います。 sheet(1)を除いた各シートの入力データ自体は全く同じなので、シート一枚で出来るんじゃないのかなと思い、ネットや本で調べながら色々試してみたのですが、どうも上手く行きません。データが同じでも、sheet(1)のクリックしたボタンによって入力するセルを変えなければならないのが問題です。 sheet(1)のボタンとセルの関連付けや、sheet(1)のどのボタンを押したのかの判別ができればいいのかなと思って調べてみても、初心者にはよく理解できず、もう何週間もチャレンジしているのですがお手上げです。 上級者の方の知恵をお借りできれば幸いです。 Sub sheet2を開く() Worksheets(2).Select End Sub Sub 入力1() Worksheets(1).Range("F8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("F8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("F8") = "データ3" Worksheets(1).Select End Sub Sub sheet3を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("H8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("H8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("H8") = "データ3" Worksheets(1).Select End Sub Sub sheet4を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("M8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("M8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("M8") = "データ3" Worksheets(1).Select End Sub    ・    ・    ・    ・    ・

  • エクセル2007VBAで連続データ(文字列)の入力

    ●質問の主旨 エクセル2007のVBAでマクロを作成して 同じ列に次々と文字を入力していくにはどうすればよいでしょうか? ●質問の補足 ワークシートのA列に文字列を入力していくマクロを 作成しようとしています。コードの概要は以下の通りです。 1.1回目の入力でA1セルには文字列を入力 2.1のあとフォーカスがテキストボックスに戻る。 3.2回目の入力でテキストボックスに文字列を入力 4.2回目の文字列がA2セル入力 5.以下2~5が続く ところが4のところでA1セルの内容を消去して 2回目の文字列をそのままA1セルに入力してしまいます。 コードに問題があると考えられますが、 どこに問題があるでしょうか? 以下のコードと添付画像をご参照の上、 ご教示くだされば幸いです。 なお添付画像の内容は、作成目標である A列に次々と文字列が入力されていく「模範解答」です。 ●コード (General)-連続データ入力 Sub 連続データ入力() UserForm1.Show vbModal End Sub (General)-(Declaration) Dim CelNo As String Dim Pos As Integer (UserForm1:UserForm_Initialize) Private Sub UserForm_Initialize() Pos = 1 CelNo = "A" & Pos End Sub (UserForm1:InputBtn_Click) Private Sub InputBtn_Click() With Worksheets("sheet1") .Range(CelNo) = UserForm1.TextBox1.Text Pos = 1 CelNo = "A" & Pos .Range(CelNo).Activate End With UserForm1.TextBox1.Text = "" UserForm1.TextBox1.SetFocus End Sub (UserForm1:CommandButton2_Click) Private Sub CommandButton2_Click() Unload UserForm1 End End Sub

  • エクセルVBA 別シートからのコンボボックス連動

    エクセルVBA 別シートからのコンボボックス連動について Book1(多人数入力用ブック) ・入力シート ・データ用シート Book2(反映用ブック) ・シート1 Book1にコンボボックスが2列 テキストボックスが2列 * 6行のユーザーフォームを作成しました。 コンボボックス1 コンボボックス2 テキストボックス1 テキストボックス2 コンボボックス3 コンボボックス4 テキストボックス3 テキストボックス4 ・ ・ ・ 左のコンボボックスで「あ」が選ばれたときには、右のコンボボックスで「あ行の顧客」・・・というように連動させたいと考えております。 データ用シートのデータは、   A      B          C 1 あ あ行で始まる顧客 か行で始まる顧客 2 か 3 さ 4 た 5 な 6 Private Sub UserForm_Initialize() Dim c As Range ComboBox1.RowSource = "データ用シート!A1:A9" End Sub Private Sub ComboBox1_Change() 'Dim Rng As Range 'Dim i As Long i = ComboBox1.ListIndex If i > -1 Then Dim c As Range Set Sh = Worksheets("データ用シート") Set Rng = Worksheets("データ用シート").Range("B2:I30") ComboBox2.Value = "" ComboBox2.RowSource = Rng.Columns(i + 1).Address End If End Sub 上記コードですと、コンボボックス2が入力シートのデータを表示してしまいうまくいきません。 欲をいえば、 Book1(多人数入力用ブック)入力シートの特定セルに コンボボックス2・テキストボックス1 コンボボックス4・テキストボックス3というように続けて1セルに反映 Book2(反映用ブック)シート1に コンボボックス2・テキストボックス1・テキストボックス2 を各1セル 1行に反映させたいと考えております。 まったく知識がないのですが 仕事上どうしても必要となったので、各種サイトを見よう見真似でやっております。 ご助力いただければ幸いです。

  • Excelマクロにて文字列連結

    現在Excelのマクロにて文字列の連結を行っているのですが、 繋いだ文字列を改行を付けて連結を行いたいです。 セルとセルの中の文字列を改行を付けて連結するにはどうしたらいいのでしょうか? 例 A1セル「あああ」 B1セル「いいい」 C1セル「あああ       いいい」 Worksheets(sheet1).Range("C1").Value = Worksheets(sheet1).Range("A1").Value + Worksheets(sheet1).Range("B1").Value をすると 「あああいいい」と1行で表示されてしまいます。     ↑ ここに改行を入れるにはどうしたらいいのでしょうか? 以上、宜しくお願いします。

  • エクセル2007VBA 連続データ(文字列)の入力

    エクセル2007VBA 連続データ(文字列)の入力 ●質問の内容 エクセル2007のVBAでマクロを作成して 同じ列に次々と文字を入力していくには どうすればよいでしょうか? ●質問の補足 ワークシートのA列に文字列を入力していくマクロを 作成しようとしています。コードの 概要は以下の通りです。 1.1回目の入力でA1セルには文字列は入力 2.1のあとフォーカスがテキストボックスに戻る。 3.2回目の入力でテキストボックスに文字列を入力 4.2回目の文字列がA2セル入力 しかし4のところでA1セルの内容を消去して 2回目の文字列をそのままA1セルに入力してしまいます。 コードに問題があると考えられますが、どこに 問題があるでしょうか?以下のコードと添付画像を ご参照の上、ご教示くだされば幸いです。 なお添付画像の内容は、作成目標である A列に次々と文字列が入力されていく 「模範解答」です。 ●コード (General)-連続データ入力 Sub 連続データ入力() UserForm1.Show vbModal End Sub (General)-(Declaration) Dim CelNo As String Dim Pos As Integer (UserForm1:UserForm_Initialize) Private Sub UserForm_Initialize() Pos = 1 CelNo = "A" & Pos End Sub (UserForm1:InputBtn_Click) Private Sub InputBtn_Click() With Worksheets("sheet1") .Range(CelNo) = UserForm1.TextBox1.Text Pos = 1 CelNo = "A" & Pos .Range(CelNo).Activate End With UserForm1.TextBox1.Text = "" UserForm1.TextBox1.SetFocus End Sub (UserForm1:CommandButton2_Click) Private Sub CommandButton2_Click() Unload UserForm1 End End Sub

  • コンボボックス or リストボックス (複数列表示→値の取得)

    マクロ初心者です。(エクセル2003使用-ユーザーフォーム) 先日はお世話になり、ありがとうございました。 作成していくうちにさらに改良を加えたく、再質問させていただきます。 ※コンボボックス内の表示を複数行表示(Sheet1の管理番号,品名,注文数量)し、そのデータをSheet2のセルA(管理番号),セルB(品名),セルC(注文数量)と貼り付けようとしております。 が、本で探したところ複数行表示のやり方がリストボックスでしかのっていなく、さらに自分で作成したマクロでは動きませんでした。 すみませんが、お力をお貸しください。 (Sheet1) 担当課 客先 管理番号 品名 注文数量 出荷数量 A 岡田さん 1324 りんご 30 20 B 山田さん 1554 みかん 250 70 C 岡田さん 7634 なし 40 25 B 金子さん 4653 みかん 75 70 A 金子さん 6675 りんご 170 60 C 杉浦さん 7789 りんご 200 120 (↓こちらは、前回質問させていただいた内容です。) Private Sub UserForm_Initialize() ComboBox1.RowSource = "Sheet1! C2:C" & Worksheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row ←ここを複数行用に変更するのでしょうか?いろいろ試したのですがダメでした。 ComboBox1.ListIndex = -1 ComboBox1.SetFocus End Sub Private Sub CommandButton1_Click() Dim lRow As Long With Worksheets("Sheet2") lRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & lRow + 1).Value = ComboBox1.Value End With End Sub (↓こちらは、リストボックスでのマクロですが、動きません) Private Sub UserForm_Initialize() With UserForm2.ListBox1 .ColumnWidths = "70;50;50" .ColumnCount = 3 End With With Worksheets("Sheet1") Dim MyA As Variant Dim i As Long For i = 2 To UBound(MyA, 1) .AddItem .List(i - 2, 0) = Cells(i, 1).Value .List(i - 2, 1) = Cells(i, 2).Value .List(i - 2, 2) = Cells(i, 3).Value Next End With End Sub Private Sub CommandButton1_Click() Dim lRow As Long With Worksheets("Sheet2") lRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & lRow + 1).Value = ListBox1.Value End With End Sub 教えていただけましたら幸いです。 よろしくお願いいたします。

  • Excel VBA With ~ End With

    Excel VBA With ~ End Withを使わずに記述するには Sheet1シートのセルA1,A2,B1,B2にA,B,75,25の値を入力して、 Sub test1()  With ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart.Chart   .ChartType = xlBarStacked100   .SetSourceData Source:=Sheets("Sheet1").Range("A1:B2"), PlotBy:=xlRows  End With End Sub を実行すると横棒グラフが1個表示されますが、 これを、With ~ End Withを使わずに記述すると Sub test2()  ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart.Chart.ChartType = xlBarStacked100  ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart.Chart.SetSourceData Source:=Sheets("Sheet1").Range("A1:B2"), PlotBy:=xlRows End Sub というようになると思いますが、 実行すると縦棒が2個表示されてしまって同じ結果になりません。 なぜなのでしょうか。 test1を、With ~ End Withを使わずに記述するには、 どのように記述すればよいのでしょうか。 よろしくお願いします。(Windows10,Excel2016)

  • Excel VBA 構文をすっきりさせたい

    いつもお世話になっています。 次のような構文を使って、データを別シートに転送するVBAを作成しました。 転送するデータが多い場合、構文が延々続くことになります。 もっとすっきりと記述する方法がありましたらぜひ教えてください。 お力添え、よろしくお願いします。 Sub データ() With ActiveSheet Dim last last = ActiveSheet.Range("b" & Rows.Count).End(xlUp).Row + 1 .Range("b" & last).Value = Worksheets(2).Range("b2").Value .Range("c" & last).Value = Worksheets(2).Range("c2").Value .Range("d" & last).Value = Worksheets(2).Range("d2").Value     以下同様に続く・・・・ End With End Sub

専門家に質問してみよう