Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


998 / 13645 ツリー ←次へ | 前へ→

【76956】VBAで文字列中に「スペース」を挿入したい 初投稿 15/4/20(月) 19:13 質問[未読]
【76957】Re:VBAで文字列中に「スペース」を挿入した... β 15/4/20(月) 19:58 発言[未読]
【76959】Re:VBAで文字列中に「スペース」を挿入した... β 15/4/20(月) 20:06 発言[未読]
【76962】Re:VBAで文字列中に「スペース」を挿入した... 初投稿 15/4/21(火) 22:09 お礼[未読]
【76958】Re:VBAで文字列中に「スペース」を挿入した... kanabun 15/4/20(月) 19:58 発言[未読]
【76960】Re:VBAで文字列中に「スペース」を挿入した... kanabun 15/4/20(月) 20:18 発言[未読]
【76963】Re:VBAで文字列中に「スペース」を挿入した... 初投稿 15/4/21(火) 22:11 お礼[未読]
【76961】Re:VBAで文字列中に「スペース」を挿入した... β 15/4/20(月) 22:00 発言[未読]
【76964】Re:VBAで文字列中に「スペース」を挿入した... γ 15/4/21(火) 22:51 発言[未読]
【76965】Re:VBAで文字列中に「スペース」を挿入した... β 15/4/22(水) 8:21 発言[未読]
【76966】Re:VBAで文字列中に「スペース」を挿入した... γ 15/4/22(水) 23:25 発言[未読]
【76967】Re:VBAで文字列中に「スペース」を挿入した... β 15/4/23(木) 8:27 質問[未読]
【76980】Re:VBAで文字列中に「スペース」を挿入した... γ 15/4/23(木) 21:11 発言[未読]
【76981】Re:VBAで文字列中に「スペース」を挿入した... β 15/4/24(金) 0:12 お礼[未読]

【76956】VBAで文字列中に「スペース」を挿入したい
質問  初投稿  - 15/4/20(月) 19:13 -

引用なし
パスワード
   はじめまして
VBAについて質問させてください

あるシステムから出力したデータをエクセル上に貼り付けると以下のようになります

【サンプル】
A B C 全角文字列D 全角文字列E F

※ここで貼り付けられる文字列はそれぞれのセルに代入されるのではなく、
一つの文字列として1セルに貼り付けられます

【やりたいこと】
A B C 全角文字列 D 全角文字列 E F

のようにそれぞれの値を個別のセルに代入したい

1.文字列中の「全角文字列」を判別し、後に「半角スペース」を挿入したい
2.「半角スペース」を区切りとしてそれぞれの文字列をセルに代入したい

【条件】
・「全角文字列」の場所は一定ではない
・「全角文字列」は不特定の単語

お手数をおかけしますがご教示の程、よろしくお願いいたします。

【76957】Re:VBAで文字列中に「スペース」を挿入し...
発言  β  - 15/4/20(月) 19:58 -

引用なし
パスワード
   ▼初投稿 さん:

こんばんは
正規表現を使えば、ループなしでも処理できると思いますが「平文」で。
サンプルです。 A1 にある文字列を B1以降に分割します。

Sub Test()
  Dim s As String
  Dim p As String
  Dim i As Long
  
  s = Range("A1").Value
  For i = 1 To Len(s)
    If LenB(StrConv(Mid(s, i, 1), vbFromUnicode)) = 2 Then
      If Right(p, 1) = "]" Then p = p & "["
      p = p & "x"
    Else
      If Len(p) > 0 And Right(p, 1) <> "]" Then p = p & "]"
      p = p & "[x]"
    End If
  Next
  
  If Right(p, 1) <> "]" Then p = p & "]"
  
  Range("A1").Parse p, Range("B1")
  
End Sub

【76958】Re:VBAで文字列中に「スペース」を挿入し...
発言  kanabun  - 15/4/20(月) 19:58 -

引用なし
パスワード
   ▼初投稿 さん:

>【サンプル】
>A B C 全角文字列D 全角文字列E F

半角スペースで分割したそれぞれの部分文字列が 全角文字列と半角文字列に
分れていたら、その境界に スペースを挿入する。

Sub trial()
  Dim i As Long, j As Long
  Dim ss As String, s As String
  Dim v
  ss = "A B C 全角文字列D 全角文字列E F"
  
  v = Split(ss)
  For i = 0 To UBound(v)
    s = v(i)
    For j = Len(s) To 2 Step -1
     If LenA(Mid$(s, j, 1)) <> LenA(Mid$(s, j - 1, 1)) Then
       v(i) = Left$(s, j - 1) & " " & Mid$(s, j)
       Exit For
     End If
    Next
  Next
  MsgBox Join(v, " ")
End Sub

Private Function LenA(s As String) As Long
  LenA = LenB(StrConv(s, vbFromUnicode))
End Function

結果-----
A B C 全角文字列 D 全角文字列 E F

【76959】Re:VBAで文字列中に「スペース」を挿入し...
発言  β  - 15/4/20(月) 20:06 -

引用なし
パスワード
   ▼初投稿 さん:

>正規表現を使えば、・・・

正規表現では対応できませんね。撤回。

>サンプルです。 A1 にある文字列を B1以降に分割します。

  Range("A1").Parse p, Range("B1")

これを

  Range("A1").Parse p, Range("A1")

にすれば、分割イメージは A1 からセットされます。

【76960】Re:VBAで文字列中に「スペース」を挿入し...
発言  kanabun  - 15/4/20(月) 20:18 -

引用なし
パスワード
   > 「半角スペース」を区切りとしてそれぞれの文字列をセルに代入したい

シートのセルに代入したんでしたね。

>  MsgBox Join(v, " ")

を 以下に変更です。

  v = Split(Join(v))
  Range("B1").Resize(, UBound(v) + 1).Value = v

【76961】Re:VBAで文字列中に「スペース」を挿入し...
発言  β  - 15/4/20(月) 22:00 -

引用なし
パスワード
   ▼初投稿 さん:

ループはなくせないんですが、Parseメソッドに与えるパターンを
無理やり(?)正規表現で作成してみました。

Sub Test2()
  Dim reg As Object
  Dim s As String
  Dim w As Variant
  Dim i As Long
  
  s = Range("A1").Value
  Set reg = CreateObject("VBScript.RegExp")
  reg.Pattern = "(.{1})"
  reg.Global = True
  s = reg.Replace(s, "$1 ")
  w = Split(s)
  ReDim Preserve w(LBound(w) To UBound(w) - 1)
  For i = LBound(w) To UBound(w)
    If LenB(StrConv(w(i), vbFromUnicode)) = 2 Then
      w(i) = 2
    Else
      w(i) = 1
    End If
  Next
  
  s = Join(w, "")
  reg.Pattern = "(2+)"
  s = reg.Replace(s, "[$1]")
  s = Replace(s, "2", "x")
  s = Replace(s, "1", "[x]")
  
  Range("A1").Parse s, Range("A1")
  
End Sub

【76962】Re:VBAで文字列中に「スペース」を挿入し...
お礼  初投稿  - 15/4/21(火) 22:09 -

引用なし
パスワード
   ▼β さん:

お礼が遅くなって申し訳ございません
なぜか書き込みができなくて…

いくつかいただいた方法の中から作成中のコードと組み合わせて
使いやすいほうを参考にさせていただきます。

ありがとうございました


>▼初投稿 さん:
>
>>正規表現を使えば、・・・
>
>正規表現では対応できませんね。撤回。
>
>>サンプルです。 A1 にある文字列を B1以降に分割します。
>
>  Range("A1").Parse p, Range("B1")
>
>これを
>
>  Range("A1").Parse p, Range("A1")
>
>にすれば、分割イメージは A1 からセットされます。

【76963】Re:VBAで文字列中に「スペース」を挿入し...
お礼  初投稿  - 15/4/21(火) 22:11 -

引用なし
パスワード
   ▼kanabun さん:

お礼が遅くなって申し訳ございません
なぜか書き込みができなくて…

いくつかいただいた方法の中から作成中のコードと組み合わせて
使いやすいほうを参考にさせていただきます。

ありがとうございました


>> 「半角スペース」を区切りとしてそれぞれの文字列をセルに代入したい
>
>シートのセルに代入したんでしたね。
>
>>  MsgBox Join(v, " ")
>
>を 以下に変更です。
>
>  v = Split(Join(v))
>  Range("B1").Resize(, UBound(v) + 1).Value = v

【76964】Re:VBAで文字列中に「スペース」を挿入し...
発言  γ  - 15/4/21(火) 22:51 -

引用なし
パスワード
   正規表現を使った例です。

# 正規表現をご存じなければ、うっちゃっておいて、
# 他のかたの回答を参考にしてください。

Sub test()
  Dim reg As Object
  Dim s As String

  s = "A B C 全角文字列D 全角文字列E F"

  Set reg = CreateObject("VBScript.RegExp")
  reg.Pattern = "([^\x01-\x7E\xA1-\xDF]+)(\S)"
  reg.Global = True
  s = reg.Replace(s, "$1 $2")
  
  Debug.Print s ' 出力=> "A B C 全角文字列 D 全角文字列 E F"

End Sub

【76965】Re:VBAで文字列中に「スペース」を挿入し...
発言  β  - 15/4/22(水) 8:21 -

引用なし
パスワード
   ▼γ さん:

なるほど!
勉強になります。

γさんのパターンを拝借して、半角、全角混在のA1の文字列を分割して
A2以降の2行目に半角は1文字1セル、全角は、連続文字1セルに書きこんでみました。

Sub test()
  Dim reg As Object
  Dim s As String
  Dim w As Variant
  
  Rows(2).ClearContents
  s = Range("A1").Value

  Set reg = CreateObject("VBScript.RegExp")
  
  reg.Global = True
  reg.Pattern = "([\x01-\x7E\xA1-\xDF]{1})|([^\x01-\x7E\xA1-\xDF]+)"
  s = reg.Replace(s, "$1 $2 ")
  s = WorksheetFunction.Trim(s)
  w = Split(s)

  Range("A2").Resize(, UBound(w) + 1).Value = w
  
End Sub

【76966】Re:VBAで文字列中に「スペース」を挿入し...
発言  γ  - 15/4/22(水) 23:25 -

引用なし
パスワード
   ▼β さん:
ありがとうございます。

>半角、全角混在のA1の文字列を分割して
ということなら、こんな書き方もあるかと思います。

Sub test()
  Dim reg As Object
  Dim s As String
  Dim w As Variant

  s = "AB C全角文字列D 全角文字列EF"
  Set reg = CreateObject("VBScript.RegExp")
  reg.Global = True
  reg.Pattern = "(\w|[^\x01-\x7E\xA1-\xDF\s]+)(?!\s)"

  s = reg.Replace(s, "$1 ")
  Debug.Print s
  ' =>   "A B C 全角文字列 D 全角文字列 E F "

  s = WorksheetFunction.Trim(s)
  w = Split(s)

  Range("A2").Resize(, UBound(w) + 1).Value = w
End Sub

【76967】Re:VBAで文字列中に「スペース」を挿入し...
質問  β  - 15/4/23(木) 8:27 -

引用なし
パスワード
   ▼γ さん:

もし、お目に留まればご教示をお願いします。

パターンで、(\w|[^\x01-\x7E\xA1-\xDF\s]+) ここまでは理解できました。
そのあとの、(?!\s) の役割が、
( ) でくくっておられますので、これがでてきてもリプレースの対象にはしないで残す。
こういうことなのかなぁと思っていますがそれで、あっていますか?
それと、この 、(?!\s) は、その前の [^\x01-\x7E\xA1-\xDF\s]+)に連続したパターンで
\w ないしは [^\x01-\x7E\xA1-\xDF\s]+)(?!\s)
と考えていいのでしょうか?

で、その中の ? ですが、これは、その前の + に付け加えられている、いわゆる
最短一致のための ? でしょうか。
それなら、 ? は、その前の ( ) 内で +?) でおわらせるように思えますので
きっと解釈が間違っているんだろうなとも思っています。

それと ! ですが、これはメタ文字でしょうか?
手元のメモでは、! は VBAの正規表現メタ文字とは記述されていないのですが
メタ文字だとすれば、全角文字列の最後にスペースがあるものは対象にしないという意味でよろしいでしょうか?


【76980】Re:VBAで文字列中に「スペース」を挿入し...
発言  γ  - 15/4/23(木) 21:11 -

引用なし
パスワード
   (半角英数字一文字または全角文字列)でうしろに\sがないもの、
のつもりです。

今回の説例では、所詮、Trimを使うのであれば、
連続したspaceはいくつあっても問題ないのですが、
一応、正規表現でできるところはしてみようかという積もりでした。

ht tps://msdn.microsoft.com/ja-jp/library/cc392020.aspx
にありますように、(?!pattern)は「否定先読み」と呼ばれているようです。

> (?!pattern)
> pattern で指定しない文字列が続く場合に一致と見なされます (否定先読み)。
> 一致した文字列は記憶されず、後で使用することはできません。
> たとえば、"Windows(?=95|98|NT|2000)" は
> "Windows 3.1" の "Windows" には一致しますが、
> "Windows 2000" の "Windows " には一致しません。
> 先読み処理では、読み進まれた文字は処理済みとは見なされません。
> 一致の検出後、次の検索処理は先読みされた文字列の後からではなく、
> 一致文字列のすぐ後から開始されます。
# "Windows (?=95|98|NT|2000)"の間違いだろうと思いますが。

どうもおじゃましました。

【76981】Re:VBAで文字列中に「スペース」を挿入し...
お礼  β  - 15/4/24(金) 0:12 -

引用なし
パスワード
   ▼γ さん:

ありがとうございます!

(?!pattern) 否定先読み。判定には使われ、かつマッチした値には含まれない。
今後も、パット使えるかどうか心もとないのですが、しっかり覚えておきたいと思います。
手元の、分厚い正規表現の書籍、購入はしたものの、ほとんど、飾ってあるだけの存在でしたが
読み返してみますと、この否定先読みも、(?=pattern)の肯定先読みとともにちゃんと記載されていました。

正規表現については、そのうわっつらを眺めているだけのレベルですが、いつかγさんのように
奥深いところまで修得できればと夢見ています。

998 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free