プロが教える店舗&オフィスのセキュリティ対策術

 複数行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)
・・・・

A 回答 (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列か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

補足日時:2008/12/13 00:09
    • good
    • 0

ウォッチ式でみると、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), "")
  ・・・・・

補足日時:2008/12/12 02:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!