『VBA:セルの中の文字を指定して抜き出し』(じん) VBA初心者です。 初歩的な質問かもしれませんが、よろしくお願いします。 セルの中に記載されている文字を20文字づつ抜き出して 1レコードとしてCSVファイルで出力したいです。 1セルにある文字列が20文字を超える場合、20文字ずつ抜き出して あまりの文字が10文字であれば10文字+空白10で20文字分のレコードを作製。 その抜き出したい文字列は1セルに収まっているとは決まっていなくて 続いている複数セル(縦)になっている場合がありです。 このようなことは可能でしょうか? 元のファイルからそのままコピーはできるのですが、 文字を指定してというのとあまった文字を空白で埋めるというのが 本とかを読んでも全然わからず行き詰まっています。。。 どなたか教えてください。。 ----- データはA列にあるだけですか? 20文字ごと , 区切り? データの具体例があれば、教えて下さい。 (INA) ---- データはF列とG列にあり、結合されている場合があります。 例えばF・G列の20行目から25行目が結合されているとしてその部分と更に その下の26行目(FG列は結合されているが行としては1行)を指定範囲としたい。 その範囲に入っている文字を20文字を1レコードとして抜き出したい。 F・G列の20行目から25行目に入っている文字が50文字、 26行目に入っている文字が30文字だとすると、 F・G列の20行目から25行目に入っている文字を 20文字のレコードを2レコード、10文字+空白10文字分のレコードを1レコード作成。 26行目に入っている文字で20文字のレコードを1レコード、10文字+空白10文字分のレコードを1レコード 合計5レコード作成して、最終的にCSVファイルに落としたいということです。 うまく説明できなくてすいませんが、意味が通じますでしょうか? (じん) ---- >1レコード これの定義は何ですか? CSVの1行単位のことですか? カンマ区切りの単位のことですか? 具体的なデータ例をあげることは出来ますか? 対象範囲は、選択範囲のセルとするのでしょうか? (INA) ---- 何度もすいません・・・ とりあえず、CSVファイルに出力は考えないとして、 違うシートの1セルづつに20文字づつ貼り付けていくのであれば 可能ですか? F・G列の20行目から25行目に入っている文字が50文字だとすると 20文字づつ、違うシートのC1のセルに貼り付け、次の20文字をC2に貼り付け、 残りの10文字+空白10文字分をC3に貼り付けのような。 (じん) ---- こんなんなりました・・・。 Sub Test() With Worksheets("Sheet1") For Each C In .Range("F20:G25")  For i = 1 To Application.WorksheetFunction.RoundUp(Len(C.Value) / 20, 0) MyText = Mid(C.Value, 1 + 20 * (i - 1), 20) If Len(MyText) < 20 Then MyText = MyText & _ Application.WorksheetFunction.Rept(" ", 20 - Len(MyText)) End If With Worksheets("Sheet2") If IsEmpty(.Range("C65536").End(xlUp).Value) Then MyR = 1 Else MyR = .Range("C65536").End(xlUp).Row + 1 End If .Cells(MyR, 3) = MyText End With Next i Next C End With End Sub ※でもこれだと横方向に抽出していくんですよね_/ ̄|○ il||li  縦に抽出するには、For Eachを2つに分けなきゃいけないのかな_/ ̄|○ il||li 修正:回数がINT+1では、丁度のときがダメなので、ROUNDUPに変えました。 (川野鮎太郎) ---- こういう処理での良くある面倒事として 「全角半角の混在を考慮する必要が有るか無いか」 って部分がありますが、その辺どうなんでしょうね。 文字数調整で空白を付け足したい、って事はある意味CSVと言うよりは 固定長にしたいっぽくもあるし。 (ご近所PG) ---- みなさま レスありがとうございます。 まだ書いてみていないのですが、 川野様に教えていただいた方法で 色々テストしてみたいと思います。 半角・全角の判断はやらなくてはいけません。 あと、CSVじゃなくてslkでした・・・ すいません。。。 (じん) ---- >縦に抽出するには、For Eachを2つに分けなきゃいけないのかな_/ ̄|○ il||li 処理順が大切ならCells(Row,Col)指定の方が良いかしら。 For Eachだと取得順がどうなるか見えないと思うので。 (Excel的に必ずこうなるという順序が決まっているとしてもソース上からはそれが読み取れない  =Excelの内部動作に詳しい人、慣れている人じゃないと処理結果が見えない) >あと、CSVじゃなくてslkでした・・・すいません。。。 苦言を呈したとかそういう訳では無いので、そんな恐縮なさらず… #ちなみにSLK(SYLK形式?)というのを初めて聞きました。 (ご近所PG)←の知識はそんなもんです ---- >※でもこれだと横方向に抽出していくんですよね どうしても縦にやりたいならこんな方法もあるけど、 範囲が連続してなきゃだめだけどね。今回の様な場合なら使えるかもぉ?? v(=∩_∩=)v (SoulMan) Sub Test() Dim C As Range Dim i As Long, j As Long With Worksheets("Sheet1") j = 1 Do For Each C In .Range("F20:G25").Columns(j).Cells MsgBox C.Address(False, False) Next C j = j + 1 Loop While j < 3 End With End Sub