複数行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)
・・・・
No.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
No.1
- 回答日時:
ウォッチ式でみると、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), "")
・・・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) VBA 特定の列に入っているテキストをコピペ 2 2023/06/14 11:24
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) Sheet1のA列にコードB列にメアド、Sheet2のB列にコード一覧とD列にメアド一覧があり、Sh 3 2022/10/19 11:57
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Visual Basic(VBA) 最終列の右へSUM関数を作成するため下記コードを実行しましたが、最終列「10月28日」が上書きされて 3 2022/12/05 20:32
- Visual Basic(VBA) 配列の勉強をしています。使用する変数の意味、検索条件の書き方が難しいです。 2 2022/09/15 14:06
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
ListViewで、非表示列って作れ...
-
VBA 1次元配列を2次元に追加する
-
VBのFunctionで、配列を引数...
-
for each の現在の配列ポインタ...
-
2次元動的配列の第一引数のみを...
-
VLOOKUP関数で、一番下...
-
特定のセル範囲で4文字以上入力...
-
VB2008: CSV を二次元配列に読...
-
配列変数の添字が範囲外ですと...
-
VBAで多次元配列のインデックス...
-
COBOL 2次元配列について
-
ExcelVBA functionについて
-
配列内の内容を全て表示する方法
-
VBA Match関数の限界
-
VBAで近似曲線の係数取得
-
コントロール配列のループ
-
AES暗号にて、AES_set_encrypt_...
-
OutlookVBAでサブフォルダ一括作成
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列数式の解除
-
VBA 1次元配列を2次元に追加する
-
2つ以上の変数を比較して最大数...
-
特定のセル範囲で4文字以上入力...
-
VBのFunctionで、配列を引数...
-
Excel-VBAの配列「Public Const...
-
for each の現在の配列ポインタ...
-
subの配列引数をoptionalで使う...
-
VB6 配列を初期化したい
-
Dim は何の略ですか?
-
ListViewで、非表示列って作れ...
-
配列変数の添字が範囲外ですと...
-
VBAで近似曲線の係数取得
-
2次元動的配列の第一引数のみを...
-
[Excel2000_VBA] 型が一致しま...
-
ArrayListの初期値に二次元配列...
-
OutlookVBAでサブフォルダ一括作成
-
VLOOKUP関数で、一番下...
-
AES暗号にて、AES_set_encrypt_...
-
ヤマ括弧でくくられたテキスト...
おすすめ情報