[[20180609132504]] 『コードを短くしたい』(林太郎) ページの最後に飛ぶ

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

 

『コードを短くしたい』(林太郎)

お世話になります。

こちらの掲示板を拝見して、マクロを作りました。

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


(まっつわん)さん
早速ありがとうございます!
Join関数、初めて知りました。

こんなにスリムになって感激です。

頂いたコードで教えていただきたいのですが、
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


(まっつわん)さん
丁寧に説明いただいて、ありがとうございました!
WEBで検索して調べてみていましたが、複雑過ぎて
(調べた結果の説明文がわからなくて
またその単語を調べて頭が追いつかなくなってしまいました。。。)
教えていただいた説明、凄くわかりやすかったです。
そして(まっつわん)さんでも、調べたりすることがあるのだとVBAの
奥深さに驚きました。

まず自分がしたいことと調べられるスキルが必要なんだと実感しました。
何ができるか分かっていなかったので、したい事も無かったのですが
こちらのサイトを見れば見るほど色々なことが出来るんだという
可能性を感じてしまい、これからどんどん調べて、どんどん
質問させて頂きたいと思います!

本当にありがとうございました。
(林太郎) 2018/06/10(日) 17:28


コメント返信:

[ 一覧(最新更新順) ]


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