- ベストアンサー
Excel VBAで複数の列を繋げる方法
- Excel VBAのコードを使用して、複数の列を繋げる方法を説明します。
- 指定されたデータの各行の列を連結して、A列に結果を表示する方法について説明します。
- 最終列や最終行の変化にも対応することができます。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
データの下端、右端は、A列や行1基準では無理がある? UsedRangeならケッコウイイセン、イク、、、 Option Explicit Sub 分かれてる列を繋げる() Const xSeparator = "" Dim Col As Long Dim Row As Long Dim farLow As Long Dim farRight As Long farLow = Cells(Rows.Count, "A").End(xlUp).Row farRight = Cells(1, Columns.Count).End(xlToLeft).Column farLow = ActiveSheet.UsedRange.Rows.Count farRight = ActiveSheet.UsedRange.Columns.Count For Row = 1 To farLow For Col = 2 To farRight Cells(Row, "A").Value = Cells(Row, "A").Value & xSeparator & Cells(Row, Col).Value Next Col Next Row Columns("A").AutoFit End Sub
その他の回答 (5)
- WindFaller
- ベストアンサー率57% (465/803)
こんにちは。 >なぜrowは使わない方が良いのでしょうか? >再度ご回答いただけたら幸いです。 Row は、Rangeなどのオブジェクトのプロパティ名です。Colは、違います。Columnです。 VBAには、予約語という概念がほとんどないので、システム側ではねられることはありません。しかし、一応、システム側で使用しているメソッド、プロパティ、関数などは、コーディングでは、ユーザーが、変数やプロシージャ名、関数などは、かぶらないようにする、というのがコーディング・ルールのひとつです。 ちなみに、変数として、row と小文字にしてしまうと、プロパティ側も、row になってしまいます。 まあ、Office VBA にコーディング・ルールなど、決まったものはないと突っぱねれば、それはそれまでです。時々、そういう方もいらっしゃるようですが、そういう人が、まともなコードを書いているとは思えません。こうしたルールは、システムを開発する時などに、見やすさ(可読性)を重視し、共通したルールで書いたほうが、ミスが少ないし、バグが見つけやすいからです。 ちなみに、私は、Col と Rw と使っていた時期があります。
お礼
ありがとうございました。
- tsubuyuki
- ベストアンサー率45% (699/1545)
あら、ほんとだ^^; 早朝はボケボケでダメですねぇ^^;; Row・Colなど、関数にもありそうなモノは変数名としては避けるべきですね^^; 失礼いたしました^^;;
お礼
Row・Colは関数として使われてるのですか? WindFaller様と同じく、使わない方が良いという事ですか。 以後使わないようにします。
- WindFaller
- ベストアンサー率57% (465/803)
こんにちは。 ご質問のコードを手直してみました。(Test2 というのは、私が考えたオリジナルもある、ということです)ただ、私は、一旦、buf という、テンポラリの変数を置きます。 それと、これは、実情には影響ないはずですが、ワークシートの右端列を入力したものは、認識しないという欠陥があります。なお、変数の「Row」という文字はまずいです。 '// Sub Test2() Dim i As Long Dim j As Long Dim LastR As Long Dim LastC As Long Dim rng As Range Dim buf As String LastR = Cells(Rows.Count, 1).End(xlUp).Row Application.ScreenUpdating = False For i = 1 To LastR LastC = Cells(i, Columns.Count).End(xlToLeft).Column For j = 1 To LastC buf = buf & Trim(Cells(i, j).Value) Next j Cells(i, 1).Value = buf Cells(i, 1).Offset(, 1).Resize(, LastC).ClearContents buf = "" Next i Application.ScreenUpdating = True End Sub
お礼
うまくできました。 複雑なので一つ一つ理解できるように努力します。 なぜrowは使わない方が良いのでしょうか? 再度ご回答いただけたら幸いです。
- tsubuyuki
- ベストアンサー率45% (699/1545)
元のご自身の文を最大限生かすとしたら、 Sub 分かれてる列を繋げる() Dim Col As Long Dim Row As Long For Row = 1 To Range("a65536").End(xlUp).Row For Col = 2 To Cells(Row, 256).End(xlToLeft).Column '(1) Cells(Row, 1) = Cells(Row, 1) & Cells(Row, Col) '(2) Next Col Next Row End Sub こんなのもアリですね。 (1)(2)の部分の違いに注目です。 本当は、 For ◎=○○ To △△ Step □□ と書きます。 「○○から△△まで□□刻みで繰り返し」の意味で、 Stepを省略すると、Step 1(1ずつ加算)として扱われます。 この場合、「○○<△△」の時はスルーしてくれるんです。 例えば、10行目から1行目の順に繰り返したいなら For i=10 To 1 Step -1 などと書いてやると、きっとうまくいきますね。 偶数列だけ・・なんてときは、 For i = 2 to 10 Step 2 なんて書き方も面白いですね。
お礼
元のコードの1を2にしたり、 2を1にしたりするのですね。 For ◎=○○ To △△ Step □□ の文法を覚えるようにします。
- keithin
- ベストアンサー率66% (5278/7941)
こんばんは。 マクロを使うなら、下手に策を凝らすよりベタにやっつけた方が、結局簡単です。 作成例: sub macro1() dim h as range on error resume next for each h in cells.specialcells(xlcelltypeconstants) if h.column <> 1 then cells(h.row, 1) = cells(h.row, 1) & h h.clearcontents end if next end sub
お礼
仕組みはよくわかりませんができました! しかもA列以外のセルも消えました! よかったです。ありがとうございました。
お礼
できました! 色々な方法があってビックリです。