- ベストアンサー
Join関数 引数の配列変数
複数行1列のセルの文字を結合してアクティブセルにセットしようとするとき、以下のステートメントでは (2)でエラーになります。 Join関数ではabが1次元配列でないとエラーですが、(1)で生成されるabは1次元配列にならないのでしょうか? または、それ以外の理由でエラーになるのでしょうか? ご教授を、よろしくお願いいたします。 Public Sub セル文字の結合() Dim ab As Variant ab = Range(Selection.Address).Value ・・・(1) ActiveCell.Value = Join(ab, "") ・・・(2) ・・・・
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
質問のカタチに沿ってやると、一旦配列に納めて、Valiantに代入し Joinを使うことになるようだ。 これ以外のVariantを使った方法が有るかどうかわからない。 こんなことするなら私なら、下記(2)でやる(やってきた。) Sub test11() Dim ab As Variant Dim x() Erase x '---A 配列に値をセット For i = 0 To 4 'A-E 列のデータを対象 ReDim Preserve x(i) x(i) = Range("A1").Offset(0, i) Next i '---B ヴァリアント変数に排列を代入 ab = x '---C Range("G1").Activate ActiveCell.Value = Join(ab, ",") End Sub ーーー 下記(2) Sub test12() s = "" For i = 1 To 5 s = s & Cells(1, i) & "," Next i Range("G2") = Left(s, Len(s) - 1) End Sub ーーー 参考テスト Sub test03() Dim a As Variant Dim b a = Range("A1:A3") '○ Range("C1:C3") = a '○ b = Join(a, ",") 'X Range("D1") = b End Sub ーー 参考テスト Sub test13() a = Array("a", "b", "c") MsgBox Join(a, ",") End Sub 出来ない原因は、エクセルのa = Range("A1:A3")とArray関数でのセットの違いに有るようだ。
その他の回答 (1)
- osamuy
- ベストアンサー率42% (1231/2878)
ウォッチ式でみると、abは2次元配列になってますね。
補足
早速のご回答を ありがとうございます。 (1)のように記述すると、たとえ複数行1列のセルを選択しても「Selection.Addressの選択範囲は1次元配列にはならず強制的に2次元配列になる」という解釈でよろしいのでしょうか? 因みに、下記のステートメントにするとエラーにはならず、うまくいきます。 Public Sub セル文字の結合() Dim ab As Variant ab=Range(Selection.Address).Value・・・(1) ActiveCell.Value = Join(WorksheetFunction.Transpose(ab), "") ・・・・・
補足
ご教授を ありがとうございます。 以下のステートメントで、アクティブシートの任意のセルの文字列を結合してアクティブセルにセットできると思います。 (但し、選択セルが複数行1列か1行複数列限定です:それ以外はエラーとなります) ----------------------------- Public Sub セル文字列の結合() Dim ab As Variant On Error GoTo errMSG If Selection.Columns.Count = 1 Then '複数行1列の場合 ab = Range(Selection.Address).Value ActiveCell.Value = Join(WorksheetFunction.Transpose(ab), "") For Each ab In Selection If ab.Address <> ActiveCell.Address Then ab.ClearContents Next ElseIf Selection.Rows.Count = 1 Then '1行複数列の場合 ab = Range(Selection.Address).Value ab = WorksheetFunction.Transpose(ab) ActiveCell.Value = Join(WorksheetFunction.Transpose(ab), "") For Each ab In Selection 'アクティブセル以外はクリアする If ab.Address <> ActiveCell.Address Then ab.ClearContents Next Else MsgBox "選択範囲エラーです。複数行1列または1行複数列 限定です。", vbOKOnly + vbCritical End If Exit Sub errMSG: MsgBox "エラーが出ましたけど・・・", vbOKOnly End Sub