• ベストアンサー

分割マクロ

real beatin(@realbeatin)の回答

  • ベストアンサー
回答No.7

こんにちは。お邪魔します。 > 5行目、6行目のようにスペースが、たくさんあるものは、時間がかかりそうです 解決までに時間が掛かる、という意味だったのでしょうか? それとも、行数が多過ぎて、計算が終るのに時間が掛かる、でしょうか? ふたつの意味で気になったのと、解決が長引いている理由を想像してみて、 指定した範囲に空白セルが存在する場合などのことも加味して、回答します。 > 最初と最後の文字列にを抜き出し、残りは、N列にしたいのです 仮にスペースが1つだけの場合があれば、中央N列を空にして、 両端M,O列に振り分ける、という仕様と理解しました。 元データにエラー値が混じっているとか、 3分割した先の文字列が255文字を超えるとか、 そういう場合にはうまく機能させられませんけれど、 結構意地悪なサンプル作って動作確認しています。 無いでしょうど、全角スペースのみ、3つ以上並んでいる場合は、 M N O列皆、空白になります。(N列に全角スペースだけ並びはしません。) 以下、色々作っていた中で妥当性のありそうなもの、 VBAを2例(簡易版と高速版)、数式を1例、です。 (VBAは、L列最下のデータ行まで処理します。) ' ' ――――――――――――――――――――――――――――― ' ' // vba 簡易版 ※使っているのはMid関数ではなく、Midステートメントです Sub piyo() Dim v, a, i As Long   For i = 3 To Cells(Rows.Count, "L").End(xlUp).Row     v = Cells(i, "L") ' 元の値     a = Split(v, " ") ' 区切り文字で分割した文字列配列     Select Case UBound(a) ' 区切り文字の数で分岐     Case 0: Cells(i, "N") = v     Case 1: Cells(i, "M") = a(0): Cells(i, "O") = a(1)     Case Is > 1       Mid(v, InStr(v, " ")) = vbCr ' 最初の区切り文字をCrに       Mid(v, InStrRev(v, " ")) = vbCr ' 最後の区切り文字をCrに       Cells(i, "M").Resize(, 3) = Split(v, vbCr) ' Cr区切りで分割した文字列配列     End Select   Next i End Sub ' ' ――――――――――――――――――――――――――――― ' ' ――――――――――――――――――――――――――――― ' ' // vba 大量データ向き、高速(配列入出力)版 Sub fuga() Dim m, a, i As Long   m = Range("L3:L" & Cells(Rows.Count, "L").End(xlUp).Row).Value   ReDim Preserve m(1 To UBound(m), 1 To 3)   For i = 1 To UBound(m)     a = Split(m(i, 1), " ")     Select Case UBound(a)     Case 0: m(i, 2) = m(i, 1): m(i, 1) = Empty     Case 1: m(i, 1) = a(0): m(i, 3) = a(1)     Case Is > 1       m(i, 1) = a(0): a(0) = Empty       m(i, 3) = a(UBound(a)): a(UBound(a)) = Empty       m(i, 2) = Trim$(Join(a, " "))     End Select   Next i   Range("M3:O" & Cells(Rows.Count, "L").End(xlUp).Row).Value = m End Sub ' ' ――――――――――――――――――――――――――――― 数式 ―――――――――――――――――――――――――――――― M3 =LEFT(L3,IFERROR(FIND(" ",L3),1)-1) N3 =TRIM(MID(L3,LEN(M3)+1,LEN(L3)-LEN(M3)-LEN(O3))) L3 =MID(L3,MAX(IFERROR(FIND(" ",L3,ROW($2:$256)),1)+1),100) ―――――――――――――――――――――――――――――― L3だけは、Ctrl+Shift+Enterで確定して、数式バーに、 {=MID(L3,MAX(IFERROR(FIND(" ",L3,ROW($2:$256)),1)+1),100)} と表示され、配列(CSE)数式として設定されたことを確認します。 M3:O3 を必要なだけフィルダウンします。 ―――――――――――――――――――――――――――――― 以上、ご参考まで。 既出のご回答で解決に十分なものが得られていたのでしたら、 こちらの杞憂、むしろ幸い、と思っております。

関連するQ&A

  • Excel関数 文字分割

    A列               関数の結果求めたい値 AAAA BBBB(半角スペース区切)     AAAA AAAA BBBB(全角スペース区切)    AAAA AAAA/BBBB(半角/区切)        AAAA AAAA/BBBB (全角/区切)       AAAA =LEFT(A1,FIND(" ",SUBSTITUTE(A1," "," "))-1) =LEFT(A1,FIND("/",SUBSTITUTE(A1,"/","/"))-1) Excelの関数で一回の関数で上記二つの関数を使用して 区切文字複数を考慮して文字分割したいのですが、 どのように実施すればよいかご教授ねがえますでしょうか? IF文を使うのかもしれないとは思いいろいろと試したのですが うまく出来ない為質問させて頂いたおります。

  • マクロでLen関数の使い方がわかりません。

    マクロでLen関数の使い方がわかりません。 基幹システムのデーターベースをエクセル出力する機能があります。 その吐き出したエクセルファイルを使って 印刷したり、別のシステムにインポートしています。 このデーターの行数は吐き出すたび違います。 吐き出したエクセルのD列にあるデータですが ここは必ず半角数字7桁固定長と決まっています。 7桁に満たないデータは0で埋めて7桁になっています。 基幹システム上でも7桁で表示されています。 例↓ 0000002 0002222 0000000 ですがエクセルに吐き出されると桁数が変わってしまいます。 (なぜか0は空白にならず0と表示されています) 書式設定は[標準]でエラーマークが出ていて (数値が文字列として保存されています)となっています。 例↓ 2 2222 0 印刷時は後者、インポート時には前者である必要があるので 以下のようにE列は残したままF列に7桁表示を加えたいです。      E   → F -------------------------- 1     2  → 0000002 2  1234567 → 1234567 3    333 → 0000333  4   22 → 0000022 5   4444 → 0004444 6   0 → 0000000 以下のマクロを作成しましたが動作しません。 Select Caseでという考え方がまずいのでしょうか? (それ以前にLen関数の使い方もわかっていません。) どうかよろしくお願いします。 Sub 七文字化() 行 = 2 Do If Cells(行, 2).Value = "" Then Exit Do n=Cells(行,2) Select Case True '6文字 Case Len(n) = 6 '先頭に0を追加 myStr = "0" & n '5文字 Case Len(n) = 5 '先頭に0を追加 myStr = "00" & n '4文字 Case Len(n) = 4 '先頭に0を追加 myStr = "000" & n '3文字 Case Len(n) = 3 '先頭に0を追加 myStr = "0000" & n '2文字 Case Len(n) = 2 '先頭に0を追加 myStr = "00000" & n '1文字 Case Len(n) = 1 '先頭に0を追加 myStr = "000000" & n '7文字ある時 Case Else myStr = n Cells(行, 3).Value = myStr End Select 行 = 行 + 1 Loop End Sub

  • エクセル関数 A#BB#CCCを分割したい

    A1に"A#BB#CCC"という文字列があり、#を元にB1 C1 D1に分割させたいのですが、ご教授お願いいたします。B1は書けたのですが、#が同一文字で判別方法などがよくわかりません。 可能であれば、A列が空白になるまでの、マクロ登録をしておきたいです。 B1 = LEFT(A1,FIND("#",A1)-1)

  • 文字列を取り出す

    A列に[ No.××× ] あああああ・・・と入力されています。 毎回入力される行数が違います(100~300行) B列にNo.×××という文字列だけ取り出すために下記の関数が入っているのですが A列に入力のあった分だけをマクロで処理できませんか。 =LEFT(RIGHT(A2,LEN(A2)-FIND("[ No",A2,1)),8) 現在は300行目までこの関数が入った状態で、エクセルが重い気がします。

  • IF関数で結果が♯VARUE!のとき...

    EXCEL2000で、IF関数を使用しています。 条件式で,結果が♯VARUE!の時は、正を返したいのですが、うまくいきません。 教えて下さい。 実際に組んでいる式です。 =IF(FIND(" ",I6)=0,LEFT(I6,LEN(I6)),LEFT(I6,FIND(" ",I6,1)-1)) スペースがあればスペース前の文字列を返し、スペースがなければ全文字返すという式を組んでいます。 スペースがなければということで、FINDが0ならとしたのですが、上手くいかないため、エラーならば、という条件に変えようとしている次第です。 宜しくお願い致します。

  • substringで文字を分割

    全角80桁の文字列を全角空白を利用して4分割したいのですが 下記にご質問内容を記載します。 String str = new String(住所漢字); Matcher j = pattern2.matcher(住所漢字); Pattern pattern2 = Pattern.compile("^.{1,20} ");で 文字列の先頭から始まって半角空白で終わる最大21文字 (最後の全角空白を含む)にマッチさせた文字列に Matcher j = pattern2.matcher(住所漢字); while(j.find()) { 正規表現で抜き出した文字列の文字カウントをチェック int mojiLength = i.group().length(); String iNewString = tmp.substring(mojiLength); out.print(j.group()+","+iNewString); として、正規表現でマッチさせた文字列以降を substringで抜き出したのですが それ以降の文字列も同じようにして substringで抜き出した20文字以降の文字列に 先に設定した正規表現を利用して分割して カンマ区切の4分割にしたいのですが この先の方法が分からず色々調べている最中です。 すいませんがぜひアドバイスお願いします。

    • ベストアンサー
    • Java
  • 文字と数字を1文字ずつ分割し右詰めさらに0は空白

    エクセルで仕訳伝票を作成していますが文字と数字を1文字づつ分割し右詰までできましたが、0のばあいは空白にしたいです。 =IF(COLUMNS(P:$P)>LEN(TEXT($A9,"¥0;¥-0")),"",LEFT(RIGHT(TEXT($A9,"¥0;¥-0"),COLUMNS(P:$P)),1)) 色々調べてこの関数を使っていますがA9に金額を入れ¥0は空白にしたいです。よろしくお願いいたします。

  • エクセルの関数で左から文字まで

    エクセルの関数で左から(数字以外の)文字までの文字数を返す関数はどのように表せばよいのでしょうか。 具体的には 25 34 345 ああああ54525 156 のような文字列で初めの「あ」までの文字数「11」を返す関数が知りたいです。スペースも入っています。 Findやlenを使って色々考えましたがどうも上手くいかずといった感じです。よろしくお願い致します。

  • エクセル:スペースの削除(連続するセル)

    全角で4文字分スペースをあけ、その後 文字を入力してあるセルがひとつの列に 数百行あります。 スペースをすべて削除し、左詰めで文字を 別の列に表示させたいと思います。 ○○○○M55 ○○○○N987   ↓ M55 N987 行数がかなり多いので、関数等を使い、 オートフィルで一気に片付けたいのですが、 何か良い方法はないのでしょうか?? 教えてください よろしくお願いします!!

  • マクロ Trim

    A列に1500件ほどデータがあります。 左右、真ん中に余分なスペースがありそれを取りたいのですが、 Trim関数では左右の空白しか削除できません。 で、ググってみるとマクロを発見しました。以下です。 Sub 空白除去プログラム() Dim abc As Range ‘セルを定義 For Each abc In Selection abc = Trim(abc) ‘左右の空白を削除、「abc」を置き換える   Next End Sub 勉強不足で、セルを定義できません。A1:A1500を定義したいのですが どのように記述すればよいですか?また、このマクロに手を付け加えて、 今後、A1500以降にスペースを含む文字列が書かれたとき、 自動でスペースを削除するマクロに変更できますか? どなたかお願いします。