• ベストアンサー

分割マクロ

よろしくお願いします。写真のように、一つの文字列に空白スペースが何ヵ所かあり、それを3分割に分けたいのですが、M列からO列が欲しい結果なのです。しかし、5行目のようにスペースがないものは、N列にしたいのです‼find関数Len関数left.right関数を駆使して、やっても良いのでしょうが、5行目、6行目のようにスペースが、たくさんあるものは、時間がかかりそうです。結局のところ、最初と最後の文字列にを抜き出し、残りは、N列にしたいのです。なにか、良いマクロ教えて下さい。よろしくお願いします。尚、スペースは全角スペースです。

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

  • ベストアンサー
回答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 を必要なだけフィルダウンします。 ―――――――――――――――――――――――――――――― 以上、ご参考まで。 既出のご回答で解決に十分なものが得られていたのでしたら、 こちらの杞憂、むしろ幸い、と思っております。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.6

もう一度、掲載して おきます どうぞ お使い、ください https://1drv.ms/x/s!AjviygfJDgV_1G0zl6Cl0I1yl3vN

全文を見る
すると、全ての回答が全文表示されます。
  • mt2015
  • ベストアンサー率49% (258/524)
回答No.5

例題の文字列はAやBなど一文字ですが、実際にはもっと長い文字列が全角スペースで結合されているのではないですか? 手抜きマクロですが作ってみました。 Sub sample()   For r = 3 To 6     sData = Trim(Cells(r, "L").Text)     sSpData = Split(sData, " ")          If UBound(sSpData) = 0 Then       Cells(r, "N") = sData     Else       Cells(r, "M") = sSpData(0)       Cells(r, "O") = sSpData(UBound(sSpData))       nStart = Len(Cells(r, "M")) + 2       nLong = Len(sData) - nStart - Len(Cells(r, "O"))       Cells(r, "N") = Mid(sData, nStart, nLong)     End If   Next r End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

標題の「分割マクロ」というのは適当でない。なんのことかと思う。 質問者はマクロをそんなに得意としていないようだし、関数でもできるかもしれないのだから、したいことを文章に表現して、「VBAでの回答も可」、とすればよい。 最初の文字をM列へ 最後の文字をO列へ 第2文字から最終の文字の1文字前までN列へ分離したい とでも、表現したら仕舞ではない? A列     D、E、F列 ABC A B C ABCD A BC D A A A ABCDE A BCD E AB A B D列の式 =LEFT(A1,1) E列の式 =IF(LEN(A1)>1,MID(A1,2,LEN(A1)-2),"") F列の式 =RIGHT(A1,1) これで質問を誤解しているかな。 VBAでもこれらの 関数は使えるので、IF文かCase文で分ければ仕舞。 なぜマクロという発想になったのか?

全文を見る
すると、全ての回答が全文表示されます。
  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.3

作って、おきました リンク先に、あります ご参照、くださいね 此れで、構いませんか?

参考URL:
https://1drv.ms/x/s!AjviygfJDgV_1F2Eflyu7yZwQaQn
nafun0404
質問者

お礼

ご回答ありがとうございます。今日は、出先になるみないなので、後日試させていただきます。助かります

nafun0404
質問者

補足

今スマホで確認すると。エラーがでます。後でもかまいませんので、よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

70歳になった爺ですが・・・ ? CutStr("A B C D E", " ", 1) A ? CutStr("A B C D E", " ", ChrCount("A B C D E", " ")+1) E ? Trim(Replace(Replace("A B C D E", CutStr("A B C D E", " ", 1), ""), CutStr("A B C D E", " ", ChrCount("A B C D E", " ")+1), "")) B C D 20年前に書いた CutStr()とChrCount() とを組み合わせても出来ますね。 1、最初の文字は、CutStr()で抜き出す。 2、最後の文字も、CytStr()で抜き出す。   何番目かは ChrCount() で計算する。 3、最初と最後を抜き出すには、1と2を""に変換するだけ。 なお、次の CutStr()とChrCount() とは標準モジュールに登録して利用します。 Public Function CutStr(ByVal Text As String, _             ByVal Separator As String, _             ByVal N As Integer) As String   Dim strDatas() As String      strDatas = Split("" & Separator & Text, Separator, , 0)   CutStr = strDatas(N * Abs(N <= UBound(strDatas))) End Function Private Function CharCount(ByVal Text AS String, _               ByVal C As String) As Integer   Dim I As Integer   Dim L As Integer   Dim N As Integer      L = Len(Text)   For I = 1 To L     N = N + Abs(strComp(Mid$(Text, I, 1), C, vbTextCompare) = 0)   Next I End Function 【補足】 ただし、一文字の時は、もうひと工夫する必要あり。ということは、添付図の処理を一つの関数にまとめるのが現実的。Ifで分岐するだけだが、長くなりすぎ。で、添付図の1番目、2番目、3番目、そして一文字にも対応する関数にした方が簡単。CutStr()、ChrCount()を利用すればチャッチャッだと思う。でも、70の爺が20年前に考えたこと。もっと新しいやり方があるかも・・・。

nafun0404
質問者

お礼

みなさんご回答ありがとうございます。pcは会社なので、後日試させていただきます。

全文を見る
すると、全ての回答が全文表示されます。
  • f272
  • ベストアンサー率46% (8043/17185)
回答No.1

こんな感じ? Sub main() Set r = Range("L3") Do s = Trim(r.Value) j = InStr(s, " ") 'ここは全角スペース If j > 0 Then r.Offset(, 1) = Left(s, j - 1) s = Trim(Mid(s, j + 1)) End If s = StrReverse(s) j = InStr(s, " ") 'ここは全角スペース If j > 0 Then r.Offset(, 3) = StrReverse(Left(s, j - 1)) s = Trim(Mid(s, j + 1)) End If s = StrReverse(s) r.Offset(, 2) = s Set r = r.Offset(1) Loop While Not IsEmpty(r) End Sub

nafun0404
質問者

お礼

早速の回答ありがとうございます。pcは会社保管なので後日試させていただきます。

全文を見る
すると、全ての回答が全文表示されます。

関連する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以降にスペースを含む文字列が書かれたとき、 自動でスペースを削除するマクロに変更できますか? どなたかお願いします。

専門家に質問してみよう