Excel VBA質問箱 IV

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

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


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

【66312】複数セルの文字を連結する けい 10/8/20(金) 15:03 質問[未読]
【66313】Re:複数セルの文字を連結する Jaka 10/8/20(金) 15:49 発言[未読]
【66314】Re:複数セルの文字を連結する kanabun 10/8/20(金) 16:36 発言[未読]
【66315】Re:複数セルの文字を連結する kanabun 10/8/20(金) 16:39 発言[未読]
【66324】Re:複数セルの文字を連結する けい 10/8/23(月) 10:12 質問[未読]
【66317】Re:複数セルの文字を連結する kanabun 10/8/20(金) 17:20 発言[未読]
【66318】Re:複数セルの文字を連結する けい 10/8/20(金) 18:45 質問[未読]
【66319】Re:複数セルの文字を連結する kanabun 10/8/20(金) 19:27 発言[未読]
【66320】Re:複数セルの文字を連結する Yuki 10/8/21(土) 12:46 発言[未読]
【66321】Re:複数セルの文字を連結する kanabun 10/8/21(土) 20:00 発言[未読]
【66325】Re:複数セルの文字を連結する けい 10/8/23(月) 10:17 質問[未読]

【66312】複数セルの文字を連結する
質問  けい  - 10/8/20(金) 15:03 -

引用なし
パスワード
   お世話になります。
行の中に入っている文字を","カンマで区切って連結したいのですが、
良い方法を教えてください。

最大45列あり、少ないものは1列しか文字が入っていません。
B列から右に向かって空白になるまで文字を連結して、A列に結果を出したい場合は
どのようにしたらできますでしょうか。

A列      B列  C列  D列  E列・・・・・・・・・・・・
AAA,BB,CCC  AAA  BB   CCC
EE      EE
FF,GGG    FF   GGG

よろしくお願いいたします。

【66313】Re:複数セルの文字を連結する
発言  Jaka  - 10/8/20(金) 15:49 -

引用なし
パスワード
   中途半端に。
これを応用してみてください。

MsgBox Join(Application.Transpose(Application.Transpose(Range("B1:K1").Value)), ",")

って、書いたけど、ベタにやっても変わらないかも。

【66314】Re:複数セルの文字を連結する
発言  kanabun  - 10/8/20(金) 16:36 -

引用なし
パスワード
   ▼けい さん:
おじゃまします。

>最大45列あり、少ないものは1列しか文字が入っていません。
>B列から右に向かって空白になるまで文字を連結して、A列に結果を出したい場合

列数不定なので、けっこうめんどいですね

すくなくともB列だけは全行データが入っているとして、
2例ほど。

Sub Try1()
 Dim r As Range
 Dim i As Long
 Dim v, u
Dim t&
t = timeGetTime()

 Set r = Range("B1", Cells(Rows.Count, 2).End(xlUp)).Resize(, 20)
 ReDim v(1 To r.Rows.Count, 0)
 For i = 1 To UBound(v)
   For Each u In WorksheetFunction.Index(r.Rows(i).Value, 0#)
    If IsEmpty(u) Then Exit For
    v(i, 0) = v(i, 0) & u & ","
   Next
   v(i, 0) = Left$(v(i, 0), Len(v(i, 0)) - 1)
 Next
 Cells(1).Resize(r.Rows.Count).Value = v
 
Debug.Print "'try1", timeGetTime() - t
End Sub


Sub Try2()
 Dim r As Range
 Dim ss As String
 Dim v, vv, i As Long
Dim t&
t = timeGetTime()
 
 Set r = Range("B1").CurrentRegion
 With Intersect(r, r.Offset(, 1))
   .Copy
   With GetObject("new:1C3B4210-F441-11CE-B9EA-00AA006B1A69")
     .GetFromClipboard
     v = Split(Replace(.GetText, vbTab, " "), vbCrLf)
   End With
   Application.CutCopyMode = True
   ReDim vv(1 To UBound(v), 0)
   For i = 0 To UBound(v) - 1
     vv(i + 1, 0) = Replace(Application.Trim(v(i)), " ", ",")
   Next
 End With
 Range("A1").Resize(i).Value = vv
     
Debug.Print "'try2", timeGetTime() - t
End Sub

なお、2つ目の
>   With GetObject("new:1C3B4210-F441-11CE-B9EA-00AA006B1A69")

Microsoft Forms 2.0 Object Library に参照設定してあれば、

   With New DataObject

ですみます。

もっと良い方法がありそうですが...

【66315】Re:複数セルの文字を連結する
発言  kanabun  - 10/8/20(金) 16:39 -

引用なし
パスワード
   ↑あ、すみません。

> TimeGetTime()

の入っている行は 速度計測用で、消し忘れです。

もし、利用されるなら、
モジュールの先頭に

Private Declare Function timeGetTime Lib "winmm.dll" () As Long

の宣言を入れていおてください。

【66317】Re:複数セルの文字を連結する
発言  kanabun  - 10/8/20(金) 17:20 -

引用なし
パスワード
   なんどもスミマセン m(_ _)m

Try2() のほう、範囲設定がマズかったです。

Sub Try2_訂正()
 Dim r As Range
 Dim ss As String
 Dim v, vv, i As Long
 
 Columns(1).ClearContents
 Range("B1").CurrentRegion.Copy
 With GetObject("new:1C3B4210-F441-11CE-B9EA-00AA006B1A69")
   .GetFromClipboard
   v = Split(Replace(.GetText, vbTab, " "), vbCrLf)
 End With
 Application.CutCopyMode = True
 ReDim vv(1 To UBound(v), 0)
 For i = 0 To UBound(v) - 1
   vv(i + 1, 0) = Replace(Application.Trim(v(i)), " ", ",")
 Next
 Range("A1").Resize(i).Value = vv

End Sub

【66318】Re:複数セルの文字を連結する
質問  けい  - 10/8/20(金) 18:45 -

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

色々とお力をありがとうございます。
Try2_訂正の方でうまくいきそうな感じなのですが、
半角スペースの入っている文字がセルに入っている場合に
半角スペースの間にもカンマが入ってしまいました。

これを防ぐ方法がありますでしょうか?
後日でかまいませんので、もし何か案がありましたら
ご回答をお願いいたします。


>なんどもスミマセン m(_ _)m
>
>Try2() のほう、範囲設定がマズかったです。
>
>Sub Try2_訂正()
> Dim r As Range
> Dim ss As String
> Dim v, vv, i As Long
> 
> Columns(1).ClearContents
> Range("B1").CurrentRegion.Copy
> With GetObject("new:1C3B4210-F441-11CE-B9EA-00AA006B1A69")
>   .GetFromClipboard
>   v = Split(Replace(.GetText, vbTab, " "), vbCrLf)
> End With
> Application.CutCopyMode = True
> ReDim vv(1 To UBound(v), 0)
> For i = 0 To UBound(v) - 1
>   vv(i + 1, 0) = Replace(Application.Trim(v(i)), " ", ",")
> Next
> Range("A1").Resize(i).Value = vv
>
>End Sub

【66319】Re:複数セルの文字を連結する
発言  kanabun  - 10/8/20(金) 19:27 -

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

>半角スペースの入っている文字がセルに入っている場合に
>半角スペースの間にもカンマが入ってしまいました。
>
>これを防ぐ方法がありますでしょうか?

あぁー、データの中に半角スペースがあることがあるんですか。
それだと、この方法は使えないですね。

ちなみに Try1()ならSpace入ってても大丈夫かと思いますが、
Try1 のほうは お気に召さなかったですか?

【66320】Re:複数セルの文字を連結する
発言  Yuki  - 10/8/21(土) 12:46 -

引用なし
パスワード
   ▼けい さん:
>お世話になります。
>行の中に入っている文字を","カンマで区切って連結したいのですが、
>良い方法を教えてください。

こんにちは
一旦CSVファイルに保存してセルに書き出してみました。

Sub Macro1()
  Dim strCsv As String
  Dim io   As Integer
  Dim buf()  As Byte
  Dim i    As Long
  Dim L  As Long
  Dim v  As Variant
  
  ' Work用のCSVファイル名(Full Path) 適宜変更して下さい。
  strCsv = ThisWorkbook.Path & "\TEMP.csv"
  
  Application.DisplayAlerts = False
  ThisWorkbook.Sheets("Sheet1").Copy
  With ActiveWorkbook
    .Worksheets(1).Columns(1).Delete Shift:=xlToLeft
    .SaveAs Filename:=strCsv, _
        FileFormat:=xlCSV, CreateBackup:=False
    .Close False
  End With
  Application.DisplayAlerts = False
  
  io = FreeFile
  Open strCsv For Binary Lock Read As #io
    ReDim buf(LOF(io) - 3)
    Get #io, , buf
  Close #io
  Kill strCsv
  
  sD = StrConv(buf, vbUnicode)
  Do
    L = Len(sD)
    sD = Replace(sD, "," & vbCrLf, vbCrLf)
  Loop Until L = Len(sD)
  
  v = Split(sD, vbCrLf)
  With ThisWorkbook.Sheets("Sheet1")
    .Columns(1).ClearContents
    .Range("A1").Resize(UBound(v) + 1).Value = Application.Transpose(v)
  End With
End Sub

【66321】Re:複数セルの文字を連結する
発言  kanabun  - 10/8/21(土) 20:00 -

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

>一旦CSVファイルに保存してセルに書き出してみました。

Yukiさんの考え方、おもしろい。
まねをして、 連続するTAB+行末コード("\t+$") を改行コードに
変換してみました。オン・メモリーで。

Sub Try2_改定()
 Dim ss As String
 Dim v
 Dim regEx As Object
 
 Set regEx = CreateObject("VBScript.RegExp")
 regEx.Pattern = "\t+$"
 regEx.Global = True
 regEx.MultiLine = True
 
 Columns(1).ClearContents
 Range("B1").CurrentRegion.Copy
 With GetObject("new:1C3B4210-F441-11CE-B9EA-00AA006B1A69")
   .GetFromClipboard
   ss = regEx.Replace(.GetText, vbCr)
   ss = Replace(ss, vbTab, ",")
   v = Split(ss, vbCrLf)
 End With
 Application.CutCopyMode = True
 Range("A1").Resize(UBound(v)).Value = Application.Transpose(v)

End Sub

【66324】Re:複数セルの文字を連結する
質問  けい  - 10/8/23(月) 10:12 -

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

ご回答をありがとうございました。

Try1の方で試してみました。
結果は、B列にしか文字が入っていなかった場合で、他に連結する文字が
なかった場合でも、文字の後に",,,,,,"と複数カンマが入ってしまいました。
一番連結する文字が多かった列の数の同じ分だけ、カンマが入ってしまうようです。
もう少しプログラムを解読してこれを解決できればとは思いますが
どこを直したらよいのか、もしヒントがあればお願いいたします。

【66325】Re:複数セルの文字を連結する
質問  けい  - 10/8/23(月) 10:17 -

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

Try2_改定の実行しましたら、目的のとおりのものができました。
いろいろとお知恵をいただきありがとうございました。

>
>>一旦CSVファイルに保存してセルに書き出してみました。
>
>Yukiさんの考え方、おもしろい。
>まねをして、 連続するTAB+行末コード("\t+$") を改行コードに
>変換してみました。オン・メモリーで。
>
>Sub Try2_改定()
> Dim ss As String
> Dim v
> Dim regEx As Object
> 
> Set regEx = CreateObject("VBScript.RegExp")
> regEx.Pattern = "\t+$"
> regEx.Global = True
> regEx.MultiLine = True
> 
> Columns(1).ClearContents
> Range("B1").CurrentRegion.Copy
> With GetObject("new:1C3B4210-F441-11CE-B9EA-00AA006B1A69")
>   .GetFromClipboard
>   ss = regEx.Replace(.GetText, vbCr)
>   ss = Replace(ss, vbTab, ",")
>   v = Split(ss, vbCrLf)
> End With
> Application.CutCopyMode = True
> Range("A1").Resize(UBound(v)).Value = Application.Transpose(v)
>
>End Sub

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