[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『コードを短くしたい』(林太郎)
お世話になります。
こちらの掲示板を拝見して、マクロを作りました。
Sub 結合()
Dim a As Integer Dim na1 As String, na2 As String For a = 2 To Range("A" & Rows.Count).End(xlUp).Row
na1 = Cells(a, 1).Value na2 = Cells(a, 2).Value na3 = Cells(a, 3).Value na4 = Cells(a, 4).Value na5 = Cells(a, 5).Value na6 = Cells(a, 6).Value na7 = Cells(a, 7).Value ・ ・ ・ na50 = Cells(a, 50).Value
Cells(a, 55).Value = na1 & na2 & na3 & na4 & na5 & na6 & na7・・・・na50 Next a End Sub
参考にした掲示板は2列だけだったので
スリムなコードだったのですが
50列分となると長いコードになってしまいます。
投稿
[[20080423113105]] 『文字列結合について』(万年太郎)
について...
スリムにする方法がありましたら教えてください。
宜しくお願いいたします。
< 使用 Excel:Excel2007、使用 OS:Windows7 >
Sub test()
Dim r As Range Dim v As Variant
For Each r In Range(Range("A2"), Cells(Rows.Count, "A").End(xlUp)).Resize(, 50).Rows With WorksheetFunction v = .Transpose(.Transpose(r.Value)) r.EntireRow.Cells(55).Value = Join(v, "") End With Next End Sub
※文字列を繋ぐのはVBAのJoin関数を使ったらいいと思います。
(まっつわん) 2018/06/09(土) 13:51
こんなにスリムになって感激です。
頂いたコードで教えていただきたいのですが、
Dim v As で Variant とされていますが
String(任意の長さの文字列) ではなく Variant(すべてのデータ)
にされたのはどうしてなのでしょうか?
初歩的な質問でしたら、すいません。
(林太郎) 2018/06/09(土) 17:49
Sub test()
Dim r As Range Dim v As Variant For Each r In Range(Range("A2"), Cells(Rows.Count, "A").End(xlUp)).Resize(, 50).Rows With WorksheetFunction v = .Transpose(.Transpose(r)) End With r.EntireRow.Cells(55).Value = Join(v, "") Next End Sub
〜〜〜〜〜<ヘルプより抜粋>〜〜〜〜
Join 関数
関連項目 使用例 アプリケーション情報
機能
配列に含まれる各要素の内部文字列を結合して作成される文字列を返します。
〜〜〜〜〜<抜粋終わり>〜〜〜〜〜〜〜
Join関数は「一次元配列を結合して文字列にします。」
なので、セルの値の羅列をまずは一次配列にする必要があります。
ここで、
Transpose関数はシート上でセルに入れて使う関数です。
〜〜〜〜<ヘルプから抜粋>〜〜〜〜〜
Excel 開発者用リファレンス
WorksheetFunction.Transpose メソッド
すべて表示すべて表示
すべて非表示すべて非表示
配列の縦方向と横方向のセル範囲の変換を行います。Transpose メソッドは、配列 (配列: 複数の結果を返す数式や、行および列範囲に入力された引数をまとめて処理する数式に使用される。
〜〜〜〜<抜粋終わり>〜〜〜〜
セル範囲の値を行列を入れ替えて配列で返します。
2重にしているので、元に戻りますが、なぜか一次元配列で答えが返ってきます。
ちなみに、
v = rとしても配列で受け取れますが、二次元配列になってしまうので、
join関数で結合できません。
WorksheetFunction.Transpose(WorksheetFunction.Transpose(r))
と、2重に入れ替えると一次元配列になるという手品みたいなテクニックがあるようです^^;
なので、配列を受け取るために何でも代入できるVariant型の変数を用意してます。
他にはIndex関数でも一次元配列を一括で返せます。
(まっつわん) 2018/06/09(土) 18:11
その情報が自分のために必要なのですから。
聞かぬは一生の恥ですぞ^^
ただし、できれば、Web上で検索してみてください。
最初は思う情報を検索できないかも知れませんが、
エクセルVBAの情報は山ほどありますので、
大抵のことは調べればわかります。
僕もネットで調べて回答することもあります。
検索が上手になるのも、必要なスキルです。
(まっつわん) 2018/06/09(土) 18:24
まず自分がしたいことと調べられるスキルが必要なんだと実感しました。
何ができるか分かっていなかったので、したい事も無かったのですが
こちらのサイトを見れば見るほど色々なことが出来るんだという
可能性を感じてしまい、これからどんどん調べて、どんどん
質問させて頂きたいと思います!
本当にありがとうございました。
(林太郎) 2018/06/10(日) 17:28
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.