[[20230318090059]] 『列方向(のデータをE結合する』(いつもはROMの人) ページの最後に飛ぶ

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

 

『列方向(のデータをE結合する』(いつもはROMの人)

列方向(A列・B列・C列)のデータをE列へ結合する場合は下記のコードですが

3列と決まっていない場合は、どのように変更すれば良いですか?
(書き出しは、最終列の2つ右とします  例: FならH)
'
Sub test() '列方向の文字列結合

    Dim Temp01(), Temp02(), Temp03(), Array01(), Str() As Variant
    Dim I, lRow As Long

    lRow = Cells(Rows.Count, "C").End(xlUp).Row 'C列の最終列を取得します。

    Array01 = Range("A1:C" & lRow) 'A1〜C列の最終行までデータを2次元配列で登録します。

    Temp01 = WorksheetFunction.Index(WorksheetFunction.Transpose(Array01), 1) 'A列のデータをTemp01へ分割
    Temp02 = WorksheetFunction.Index(WorksheetFunction.Transpose(Array01), 2) 'B列のデータをTemp01へ分割
    Temp03 = WorksheetFunction.Index(WorksheetFunction.Transpose(Array01), 3) 'C列のデータをTemp01へ分割

    ReDim Str(UBound(Temp01)) 'Strの配列をA列の配列件数で再定義

    For I = 1 To UBound(Temp01)  'A列のデータ分繰り返します。
        Str(I - 1) = Temp01(I) & "-" & Temp02(I) & "-" & Temp03(I)  '分割したA列・B列・C列のデータを再結合。
    Next I

    Range("E1:E" & UBound(Temp01)) = WorksheetFunction.Transpose(Str)  'E列に結合したデータを全て書き出し。

End Sub

コード書き始めましたが以下ではうまく処理できません。

'----------------------------------------------
Sub test2() '文字列結合

    Dim Temp(), Ary(), Str(), moji() As Variant
    Dim i As Long, ii, iii As Long
    Dim Lver, Lhor As Long
    Dim ws1, ws2 As Worksheet

    Set ws2 = Sheets("Sheet1")
    Set ws2 = Sheets("Sheet2")

    Lver = ws2.Cells(Rows.Count, "A").End(xlUp).Row          'A列の最終列を取得
    Lhor = ws2.Cells(1, Columns.Count).End(xlToLeft).Column  'A列の最終列を取得

    ''A1〜使用している最終レンジまでのデータを2次元配列で登録
    Ary = Range(Cells(1, 1), Cells(Lver, Lhor))

    ReDim Temp(1 To Lhor)

    For i = 1 To Lhor

        Temp = WorksheetFunction.Index(WorksheetFunction.Transpose(Ary), i) 'データをTempへ分割
    Next

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


よくわかりませんが、こういうことですか?
 Sub test()
     Dim ws As Worksheet
     Dim Lver, Lhor As Long, adr As String
     Set ws = Sheets("Sheet1")
     Lver = ws.Cells(Rows.Count, "A").End(xlUp).Row          'A列の最終行を取得
     Lhor = ws.Cells(1, Columns.Count).End(xlToLeft).Column  'A列の最終列を取得
     adr = ws.Range("A1").Resize(, Lhor).Address(0, 0)
     With ws.Cells(1, Lhor + 2).Resize(Lver)
         .Formula = "=TEXTJOIN(""-"",TRUE," & adr & ")"
         .Value = .Value
     End With
 End Sub

 >Dim Lver, Lhor As Long
 >Dim ws1, ws2 As Worksheet
 これだと、Lverとws1はvariant型になります。(variant型なのでコードは動く)

 Dim Lver  As Long, Lhor As Long
 変数一つに対して型を宣言する必要があります。

(フォーキー) 2023/03/18(土) 09:34:57


フォーキーさんコードをありがとうございます。

すごくスマートな短いコードになるのですね。

コードで不明点がありましたので教えてください。

> .Value = .Value
  無くても書き出しは行われますがなぜわざわざ書く必要があるのですか?
  
  
教えてもらったコードでは、2回めを実行するとLhorが更新されるので書き出し先も
更新されて更に2つ先になります。
(実行する回数が増えるとどんどん書き出し先が右に移動する)

複数回実行しても書き出し先は、最初の最終列の2つ右に固定したいです。
(いつもはROMの人) 2023/03/18(土) 11:08:19


Lhor = ws2.Cells(1, Columns.Count).End(xlToLeft).Column

Lhor = ws2.[A1].Currentregion.Columns.Count
としてはどうですか?

>無くても書き出しは行われますがなぜわざわざ書く必要があるのですか?
その後利用しないのであれば、
式を残すより値に変換したほうが、処理効率や容量の節約などの面で有効と考えられたのでしょうね。

(山河) 2023/03/18(土) 12:52:14


山河さん、アドバイスありがとうございます。

後ろからチェックせずに前方から最終列を取得するに変更して
書き出しセルの問題は解決しました。

.Value = .Valueは、式のママではなく値に変換しているのですね。
見た目は同じなので気が付きませんでした。

皆様のアドバイスで解決しました。

(いつもはROMの人) 2023/03/18(土) 14:03:53


コメント返信:

[ 一覧(最新更新順) ]


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