[[20230621053947]] 『最初の半角又は全角スペースで文字列分割』(takeshi) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『最初の半角又は全角スペースで文字列分割』(takeshi)

A列の複数の文字列を最初の全角スペースで2つに分割するVBAのコード
ですが、スペースが半角の場合でも対応できるようにしたい。

(区切りのスペースが半角か?全角か?が統一されていないケースを想定、
  但しスペースは文字列中に複数存在するケースがあります。)

 Sub splitColumn()
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row
  Dim arr() As String

    Dim i As Long
    For i = 1 To lastRow
        arr = Split(Cells(i, 1), " ", 2)
        Cells(i, 2) = arr(0)
        Cells(i, 3) = arr(1)
    Next i
 end sub

< 使用 Excel:Excel2021、使用 OS:Windows10 >


 参考HPです。

https://jizilog.com/vba-instrcovertop
(MK) 2023/06/21(水) 07:28:15


 Instr
 で指定の区切り文字が対象文字列の左から何番目
 に出てくるか、を取得します。

 指定の区切り文字が半角/全角を問わず、だったら
 StrConv
 で指定区切り文字、対象文字列両方を半角ある
 いは全角に統一します。

 あとは、Instrで取得した位置で参照文字列をLeft
 関数やRight関数(あるいはMid関数)で切り出します。
(MK) 2023/06/21(水) 07:48:13

Mkさん、ありがとうございます。

現在、コードも進行して以下のような状況です。

アドバイスを参照してコード中の//// 変更予定箇所 ////を以下のように変更してみましたが
「型が一致しません」となりますが、検索文字列がスペースではできない相談ですか ?

arr1 = InStr(StrConv(UCase(Cells(i, 1).Value), vbNarrow), " ")

  Sub splitColumn()

      Dim lastRow As Long
      Dim arr1() As String, arr2() As String
      Dim i As Long, ii As Long
      Dim count As Long

      lastRow = Cells(Rows.count, "A").End(xlUp).Row

      'B列の書式を「文字列」に設定
      Range("B1:B" & lastRow).NumberFormat = "@"

      For i = 1 To lastRow
            arr1 = Split(Cells(i, 1), " ", 2) '------> //// 変更予定箇所 ////
            arr2 = Split(arr1(0), ":")
            For ii = LBound(arr2) To UBound(arr2)
                  count = count + 1
            Next

            If count - 1 = 1 Then
                  arr2(0) = Left(arr2(0), 5)
            End If

            Cells(i, 2) = CStr(arr1(0))
            Cells(i, 3) = arr1(1)
            Cells(i, 1) = Cells(i, 2) & " " & Cells(i, 3)
      Next i

  End Sub
(takeshi) 2023/06/21(水) 08:07:47

 データ→区切り位置は全角半角を区別しないので、
 Sub samle1()
    Columns("A:A").TextToColumns Destination:=Range("B:B"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True
 End Sub
 とか
 先に置き換えるとか
 Sub sample2()
    Dim aCell As Range
    For Each aCell In Range("A1", Cells(Rows.Count, "A").End(xlUp))
        aCell.Offset(, 1).Resize(, 2).Value = Split(Replace(aCell.Value, " ", " "), " ")
    Next
 End Sub
 すればいいんでは
(´・ω・`) 2023/06/21(水) 08:55:01

 あ、かぶった...

 >但しスペースは文字列中に複数存在するケースがあります

 ちょっと、お勉強でしてみたのですが^^;
 スペースがある分の、全てをB列から右に分割すれば
 いいのでしょうか?

 Sub SplitColumn_Sample()
    Dim tmp As Variant, i As Long, q As Long, LastR As Long
    LastR = Cells(Rows.count, "A").End(xlUp).Row

    Application.ScreenUpdating = False
    For q = 1 To LastR

        '全角スペースを、半角スペースに置換
        tmp = Replace(Cells(q, 1), " ", " ")

        'スペースがあれば、全て分割する
        tmp = Split(tmp, " ")
        '最初のスペースで、2列に分割する
        'tmp = Split(tmp, " ", 2)

        For i = LBound(tmp) To UBound(tmp)
            Cells(q, 2 + i) = tmp(i)
        Next i
    Next q
    Cells(1).CurrentRegion.EntireColumn.AutoFit
    Application.ScreenUpdating = True
 End Sub

 意味が違ったら、ゴミ箱へ...ポイっとしてください。
(あみな) 2023/06/21(水) 08:57:49

 ´・ω・`さん、あなみさん アドバイスありがとうございます。

全角スペースを全て半角スペースに変換して処理する
コードを考えてみましたが不具合ありましょうか ?

      For i = 1 To lastRow
            str = Replace(Cells(i, 1), " ", " ")

            arr1 = Split(str, " ", 2)
(takeshi) 2023/06/21(水) 09:01:44

 >最初の全角スペースで2つに分割
 あ、これが大事なんですね。私のは条件を満たしませんね
 すみません
(´・ω・`) 2023/06/21(水) 09:03:16

 >最初の全角スペースで2つに分割するVBAのコード
 >ですが、スペースが半角の場合でも対応できるようにしたい
  ~~~~~~
  例としての意味ではないのかな? ちゃうん?
(あみな) 2023/06/21(水) 09:10:31

 じゃあ、↓これでよくない?

 str = Replace(Cells(i, 1), " ", " ")

 ↓変換後に書き出し

 arr1 = Split(str, " ", 2)
(あみな) 2023/06/21(水) 09:12:56

 一応、以下の条件で考えました
  a)最初の空白(全角でも半角でも)で前後2つに区切る
  b)それ以外の空白には影響を与えない
 置換を使うとb)を満足しない場合があるのでやめました

 Sub sample3()
    Dim aCell As Range
    For Each aCell In Range("A1", Cells(Rows.Count, "A").End(xlUp))
        aCell.Offset(, 1).Resize(, 2).Value = SplitbySpace(aCell.Value)
    Next
 End Sub

 Function SplitbySpace(s As String) As Variant()
    Dim i As Long, j As Long
    i = InStr(s, " ")
    j = InStr(s, " ")
    If j < i Then i = j
    If i < 1 Then
       SplitbySpace = Array(s)
    Else
       SplitbySpace = Array(Left(s, i - 1), Mid(s, i + 1))
    End If
 End Function
(´・ω・`) 2023/06/21(水) 09:15:52

 ・ω・ さんの、sample3 ちょっとあやしい...ような

 ↓これでいいような気がする^^;

 Sub SplitColumn_Sample()
    Dim tmp As Variant, i As Long, q As Long, LastR As Long
    LastR = Cells(Rows.count, "A").End(xlUp).Row
    Application.ScreenUpdating = False
    For q = 1 To LastR

        '全角スペースを、半角スペースに置換
        tmp = Replace(Cells(q, 1), " ", " ")

        '最初のスペースで、2列に分割する
        tmp = Split(tmp, " ", 2)

        For i = LBound(tmp) To UBound(tmp)
            Cells(q, 2 + i) = tmp(i)
        Next i
    Next q
    Cells(1).CurrentRegion.EntireColumn.AutoFit
    Application.ScreenUpdating = True
 End Sub
(あみな) 2023/06/21(水) 09:24:29

 またまたごめんなさい
 Split関数のオプションをちゃんと理解してませんでした。
 これだけでOKなんじゃないかと

 Sub sample4()
    Dim aCell As Range
    For Each aCell In Range("A1", Cells(Rows.Count, "A").End(xlUp))
        aCell.Offset(, 1).Resize(, 2).Value = Split(aCell.Value, " ", 2, vbTextCompare)
    Next
 End Sub

 >・ω・ さんの、sample3 ちょっとあやしい...ような
 例えばどんな?
(´・ω・`) 2023/06/21(水) 09:26:19

 ・ω・ さん、ちょっと待ってください
(あみな) 2023/06/21(水) 09:28:24

 ・ω・ さんの、sample3 下になりません?

 ●A列は元のデータ

    |[A]                                                    |[B]                                                    |[C]                                                    	
 [1]|A列の 複数の 文字列を 最初の 全角スペースで 2つに  |A列の                                                  |複数の 文字列を 最初の 全角スペースで 2つに        	
 [2]|A列の 複数の 文字列を 最初の 全角スペースで 3つに|A列の 複数の 文字列を 最初の 全角スペースで 3つに|A列の 複数の 文字列を 最初の 全角スペースで 3つに	
 [3]|A列の 複数の 文字列を 最初の 全角スペースで 4つに  |A列の                                                  |複数の 文字列を 最初の 全角スペースで 4つに        	

(あみな) 2023/06/21(水) 09:34:08


皆さん、何度もありがとうございます。

もう一度希望を明確にすると
文字列を左から数えて最初のスペース(全角でも半角でもどちらでも)で2つに分割するです。

私の考えた(09:01:44)のコードでは、希望は満たしますが
(´・ω・`)さんの(09:15:52)のb)までは考慮していませんでした。
(全てスペースを半角に変換して処理するから)

個人的には、b)まで考慮しなくても良さそうなの自前のSIMPLEなコードで処理して
問題が出そうならアドバイスを参考にb)も考慮したいとおもいます。

(takeshi) 2023/06/21(水) 09:44:49


 あみなさん
 ほんとですね
 完全に見落としでした

 sapmle3は見なかったことにしてください
 すみません

 Split関数でvbTextCompareを指定すれば全て丸く収まると思いますが...
(´・ω・`) 2023/06/21(水) 09:52:35

 sapmle3 は見なかったことにします。キャッ♪(*ノдノ)見ないでッ!

 ・ω・ の sample4 が一番いい(きっと)
(あみな) 2023/06/21(水) 10:17:07

なるほど、
最初からvbTextCompareを指定すれば良かったのですね。
勉強になります。

arr1 = Split(ws.Cells(i, 1), " ", 2, vbTextCompare)
(takeshi) 2023/06/21(水) 11:11:21


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.