オーロラさんの勉強帳

IT企業勤務。データベース、Excel、Excel VBA、ネットワーク、LinuxなどIT関連のことを主に書いていきます。少しでもお役に立てたら幸いです。

【VBA 練習問題】セルの値を別シートに1列で表示する ~Do While文の練習~

VBAのツールを作ることはあるものの、しばらくコードを書いていないと忘れてしまいます。
自分の勉強のために、練習でコードを書いてみようと思います。


【目次】

練習問題

f:id:auroralights:20210811195053p:plain
上の画像のようにSheet1のデータをSheet2にコピーするVBAを作成したい。
Sheet1のデータの定義は以下の通りです。


<Sheet1のデータの定義>

  • セル「B2」からデータは始まる・データがある行は、必ずB列にデータがある
    (B列にデータがなければその行にデータはない)
  • B列にデータがない行があれば、それ以降の行にもデータは存在しない
  • 複数のデータがある行は、B列から右側の連続した列に順番にデータが入る。
    (データが2つなら、B列C列にデータが入る)


<コピーの順番>
Sheet1からSheet2にコピーするデータの順番は、Sheet1のデータを上の行から1行ずつ(行に複数データがある場合は、左の列から右の列の順番で)、Sheet2のA列に上から順番に入力することとします。


VBAのコード

いろいろな書き方があると思いますが、私は以下のように書きました。
(コメントが煩わしいかもしれません。。。)

Sub oneCol()

    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    
    'Sheet1、Sheet2を変数ws1、ws2に格納
    Set ws1 = ThisWorkbook.Worksheets("Sheet1")
    Set ws2 = ThisWorkbook.Worksheets("Sheet2")

    '繰り返し処理用の変数i,j,kを定義し、初期値を格納
    Dim i As Long: i = 2  '2行目から処理を開始するので、初期値に2を格納
    Dim j As Long: j = 2  'B列から処理を開始するので、初期値に2を格納
    Dim k As Long: k = 1  'Sheet2の1行目からSheet1のデータを入力させるので、初期値1を格納

    Do While ws1.Cells(i, 2) <> ""  '2行目からデータがない行まで繰り返し
        Do While ws1.Cells(i, j) <> ""  'B列からデータがない列まで繰り返し
            ws2.Cells(k, 1) = ws1.Cells(i, j)  'Sheet1のデータをSheet2に入力
            k = k + 1  'Sheet2で次にデータを入力する行を指定するために+1
            j = j + 1  '次の列を指定するために+1
        Loop
        i = i + 1 '次の行を指定するために+1
        j = 2  'B列から処理をスタートするために、2を格納
    Loop

End Sub

考え方

2つの繰り返し処理で考えました。

  • 1つ目の繰り返しは、セル「B2」からB列のデータがない行まで1行ずつ行数をプラスする処理。
  • 2つ目の繰り返しは、1つ目の繰り返しで1行ずつ行数がプラスされるので、その行でB列からデータがない列まで1列ずつプラスする処理。

f:id:auroralights:20210811200615p:plain

上の2つの繰り返しに、Sheet1のデータをSheet2へ入力する処理をプラスしました。


今回は以上となります。