[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『最初の半角又は全角スペースで文字列分割』(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
現在、コードも進行して以下のような状況です。
アドバイスを参照してコード中の//// 変更予定箇所 ////を以下のように変更してみましたが
「型が一致しません」となりますが、検索文字列がスペースではできない相談ですか ?
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
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.