Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Excel 2016)
文字列の連結を繰返し
投稿日時: 20/05/05 01:43:37
投稿者: fukukato

初めて質問します。
VBA勉強中の初心者です。
 
ExcelシートのA,B,C列の文字列を連結してD列に表示をA列セルが空白になる(最終行)まで繰り返しの
VBAを作成しています。
  A  B  C  D
1 あ  A  1
2 い  B  2
3 う  C  3
     ↓
  A  B  C  D
1 あ  A  1 あA1
2 い  B  2 いB2
3 う  C  3 うC3
 
文字列の連結は下記の内容で作成しましたが
 Dim str As String
    str = Range("A1") & Range("B1") & Range("C1")
     
    Range("D1").Value = str
 
A列が空白(最終行)になるまで上記の連結を繰返す場合、For Nextの繰返しでできるのでしょうか?
毎回データが違うため最終行が変動します。色々調べたのですが可変型のためよくわかりませんでした。
申し訳ありませんがご教示お願い致します。

回答
投稿日時: 20/05/05 09:47:12
投稿者: WinArrow
投稿者のウェブサイトに移動

(1)A列のデータの入っている最終行を求める方法
 
Dim LastRow As Long
 
With ActiveSheet
    LastRow = .Range("A" & .ROws.Count).End(xlup).Row
End With
 
(2)D列セルに文字列結合の「値」を代入する方法
➀ループを使う方法
Dim RowX As Long
    With Activesheet
        For Rowx = 1 To LastROw
           .cells(Rowx, "D").Value = .Cells(Rowx, "A").Value & .Cells(Rowx, "B").Value & .Cells(Rowx, "C").Value
        Next
    End WIth
 
AD列セルに、一発で数式を代入する方法
    With ActiveSheet
         .Range(.Range("D1"), ,Range("D" & LastRow)).Formula = "=A1&B1&C1"
    End With
 
 

回答
投稿日時: 20/05/05 10:31:12
投稿者: MMYS

fukukato さんの引用:

    Dim str As String
    str = Range("A1") & Range("B1") & Range("C1")
     
    Range("D1").Value = str

上記のコードは下記のように書き換え出来ます。
 
    Dim str As String
    Dim r As Long
    r = 1
    str = Cells(r, "A").Value & Cells(r, "B").Value & Cells(r, "C").Value
    Cells(r, "D").Value = str

さて、上記のコートですが、1行目しか処理しませんね。
そこで、1行から3行までにForループで対応するよう修正します。
 
    Dim str As String
    Dim r As Long
    For r = 1 To 3
        str = Cells(r, "A").Value & Cells(r, "B").Value & Cells(r, "C").Value
        Cells(r, "D").Value = str
    Next

これで、3行目まで出来るようになりました。
で、データが 4行だったらどうしましよう。こんな風に考えました。
 
    Dim str     As String
    Dim r       As Long
    Dim lastRow As Long
    
    lastRow = 4 '←最終行
    For r = 1 To lastRow
        str = Cells(r, "A").Value & Cells(r, "B").Value & Cells(r, "C").Value
        Cells(r, "D").Value = str
    Next

最終行を変数にして 4行目まて処理してます。しかし、データの増減に対応してません。
あと一歩です。なんらかの方法で最終行が分かれば自動化できます。
 
    Dim str     As String
    Dim r       As Long
    Dim lastRow As Long
    
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row
    For r = 1 To lastRow
        str = Cells(r, "A").Value & Cells(r, "B").Value & Cells(r, "C").Value
        Cells(r, "D").Value = str
    Next

最終行の求め方は上記ですが、なぜ、そう書くのでしょう?
 
最終行を知りたい。は定石の質問です。
「vba 最終行」で検索して下さい。例えば、下記リンク。
 
https://excel-ubara.com/excelvba1/EXCELVBA318.html
http://officetanaka.net/excel/vba/tips/tips130.htm

投稿日時: 20/05/06 00:07:57
投稿者: fukukato

WinArrow様 
 ご回答ありがとうございます‼
 最終行の求め方からのループの方法勉強になりました。
 一気に数式を代入する方法まで教えていただき、その方法もあったんだと新たな発見です。
 一気に代入する方法だと後でマクロ確認する際に、簡潔なのでほかの人が見ても解読しやすいですね。
 教えていただいた方法を参考に作成してみます!

投稿日時: 20/05/06 00:22:11
投稿者: fukukato

MMYS様
 ご回答ありがとうございます‼
 段階を踏んでの丁寧な解説、とても分かりやすくて勉強になりました☆
 色々ネットで調べても解りづらくて、文字の連結、最終行のとり方それぞれの方法がわかっても
 それをどうやって一つにしていいのかが解らなかったのですが、理解することができました。
 教えていただいた方法を参考に作成してみます。