• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:複数の列を繋げてA列に入れたい VBA)

Excel VBAで複数の列を繋げる方法

このQ&Aのポイント
  • Excel VBAのコードを使用して、複数の列を繋げる方法を説明します。
  • 指定されたデータの各行の列を連結して、A列に結果を表示する方法について説明します。
  • 最終列や最終行の変化にも対応することができます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

データの下端、右端は、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

TTSSAHJ
質問者

お礼

できました! 色々な方法があってビックリです。

その他の回答 (5)

回答No.6

こんにちは。 >なぜrowは使わない方が良いのでしょうか? >再度ご回答いただけたら幸いです。 Row は、Rangeなどのオブジェクトのプロパティ名です。Colは、違います。Columnです。 VBAには、予約語という概念がほとんどないので、システム側ではねられることはありません。しかし、一応、システム側で使用しているメソッド、プロパティ、関数などは、コーディングでは、ユーザーが、変数やプロシージャ名、関数などは、かぶらないようにする、というのがコーディング・ルールのひとつです。 ちなみに、変数として、row と小文字にしてしまうと、プロパティ側も、row になってしまいます。 まあ、Office VBA にコーディング・ルールなど、決まったものはないと突っぱねれば、それはそれまでです。時々、そういう方もいらっしゃるようですが、そういう人が、まともなコードを書いているとは思えません。こうしたルールは、システムを開発する時などに、見やすさ(可読性)を重視し、共通したルールで書いたほうが、ミスが少ないし、バグが見つけやすいからです。 ちなみに、私は、Col と Rw と使っていた時期があります。

TTSSAHJ
質問者

お礼

ありがとうございました。

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.5

あら、ほんとだ^^; 早朝はボケボケでダメですねぇ^^;; Row・Colなど、関数にもありそうなモノは変数名としては避けるべきですね^^; 失礼いたしました^^;;

TTSSAHJ
質問者

お礼

Row・Colは関数として使われてるのですか? WindFaller様と同じく、使わない方が良いという事ですか。 以後使わないようにします。

回答No.3

こんにちは。 ご質問のコードを手直してみました。(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

TTSSAHJ
質問者

お礼

うまくできました。 複雑なので一つ一つ理解できるように努力します。 なぜrowは使わない方が良いのでしょうか? 再度ご回答いただけたら幸いです。

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.2

元のご自身の文を最大限生かすとしたら、 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 なんて書き方も面白いですね。

TTSSAHJ
質問者

お礼

元のコードの1を2にしたり、 2を1にしたりするのですね。 For ◎=○○ To △△ Step □□  の文法を覚えるようにします。

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.1

こんばんは。 マクロを使うなら、下手に策を凝らすよりベタにやっつけた方が、結局簡単です。 作成例: 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

TTSSAHJ
質問者

お礼

仕組みはよくわかりませんができました! しかもA列以外のセルも消えました! よかったです。ありがとうございました。

関連するQ&A