Excel (VBA)

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

 
(指定なし : 指定なし)
月数分行を作成したい
投稿日時: 21/07/08 11:29:08
投稿者: だいふくもち

いつもこちらのコミュニティには大変お世話になっております。
とあるデータの処理を行いたかったのですが行き詰まってしまい、ご相談させていただいた次第です。
さっそくですが、質問させていただきます。
 
下記のような「月数」と「番号」が記入してあるシートを元に、
 
月数 | 番号 |
3 | 10100 |
2 | 20100 |
3 | 30100 |
 
月数分だけ番号の行を増やしたシートを作成したいです。
 
10100
10100
10100
20100
20100
30100
30100
30100
 
上記のデータを作成するために、次のようなマクロを作成してみたのですが、
何故か最終行から300行目…299行目…297行目…と、とびとびで行が作成されてしまいます。
 

Dim i As Long
For i = 2 To 300
    Dim lastRow As Long
    Dim targetRow As Long
    targetRow = 1
    For lastRow = 1 To Worksheets("sheet1").Cells(i, 1).Value '月数
        Worksheets("sheet2").Cells(targetRow, 1).Value = _
        Worksheets("sheet1").Cells(i, 2).Value '番号
        targetRow = targetRow + 1
    Next lastRow
Next i

色々調べてみたのですが、さっぱり原因が分からず考えあぐねております。
どなたか不備に気づかれた方がいらっしゃいましたらご指摘いただけませんでしょうか…?
ここまでご覧いただきありがとうございました。どうぞよろしくお願いいたします。

回答
投稿日時: 21/07/08 11:43:57
投稿者: ハヤシライス

こんにちは
 
ちょっと以下の動作にはならないような気もしますが...

引用:
何故か最終行から300行目…299行目…297行目…と、とびとびで行が作成されてしまいます。

 
ひとまず、
targetRow = 1

が、ループの中にあるので、出力先は番号が変わるたびに、1行目からになってしまっているかと

回答
投稿日時: 21/07/08 13:54:14
投稿者: mattuwan44

Sub test001()
    Dim i As Long
    Dim j As Long
    Dim k As Long
    Dim n As Long
    
    With Worksheets("sheet1")
        j = .Cells(.Rows.Count, ("A")).End(xlUp).Row
    End With
    
    k = 2
    For i = 2 To j
        For n = 1 To Worksheets("sheet1").Cells(i, 1).Value
            Worksheets("sheet2").Cells(k, 1).Value = _
                            Worksheets("sheet1").Cells(i, 2).Value
            k = k + 1
        Next
    Next
End Sub

 
こういうことかしら?
 
Sub test002()
    Dim rngTabe As Range
    Dim r As Range
    Dim n As Long
    Dim ixRow As Long
    
    With Worksheets("sheet1").Range("A1").CurrentRegion
        Set rngTabe = Intersect(.Cells, .Offset(1))
    End With
    
    ixRow = 2
    For Each r In rngTabe.Rows
        n = r.Cells(1).Value
        r.Cells(2).Copy _
            Worksheets("sheet2").Cells(ixRow, 1).Resize(n)
        ixRow = ixRow + n
    Next
End Sub

 
こんな書き方もできそう。。。
 
こういう番号でのセル位置の指定はわけわからなくなるので、
ステップインで1行づつ実行し、
ローカルウィンドウで変数の中身が期待したタイミングで、
期待どおりの値になっているか確認するといいと思います。

投稿日時: 21/07/08 17:51:02
投稿者: だいふくもち

>ハヤシライス様、mattuwan44様
迅速かつ丁寧にご指導いただき本当にありがとうござました!
おかげさまで希望通りのデータを抽出することができました。
よくよく見てみると、ハヤシライス様のおっしゃる通り、
 

targetRow = 1

の位置がおかしく、最新行が毎回振り出しに戻ってしまうせいだとやっと理解できました…
初歩的な内容にも関わらず、教えていただき本当にありがとうございます…!
 
>mattuwan44様
おかげさまでCurrentRegionプロパティやIntersectメソッドというものが
この世に存在していることを初めて認識できました…
そのようなやり方もあるのですね!今回の反省に加え、
またひとつ大きな知識を得ることができました!
 
ローカルウィンドウはただの素敵な飾りと化していたので、
どしどし活用していきたいと思います…!
 
重ねてになりますが、この度は助けていただき本当にありがとうございました!