[[20190310152129]] 『マクロで繰り返しを行いたい』(むらい) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロで繰り返しを行いたい』(むらい)

初めて質問させていただきます。

A列  |B列
りんご|1
みかん|3
いちご|5

とエクセルに入力し、ボタンを押すと

D列
りんご
みかん
みかん
みかん
いちご
いちご
いちご
いちご

というようにA列で指定した言葉をB列に入力した回数繰り返し出力する方法が分からず質問させていただきました。
よろしくお願いいたします。

< 使用 Excel:Office365、使用 OS:Windows10 >


1個ずつ繰り返すのならわかりますか。
2こずつ繰り返すのならわかりますか。

(マナ) 2019/03/10(日) 15:47


1個ずつ、2こずつの例です。
理解できますか。
これをB列の数値ずつに応用してみてください。
 Option Explicit

 Sub test()
    Dim k As Long
    Dim n As Long

    n = 1
    For k = 1 To Cells(Rows.Count, "A").End(xlUp).Row
        Cells(k, "A").Copy Cells(n, "D")
        n = n + 1
    Next

 End Sub

 Sub test2()
    Dim k As Long
    Dim n As Long

    n = 1
    For k = 1 To Cells(Rows.Count, "A").End(xlUp).Row
        Cells(k, "A").Copy Cells(n, "D").Resize(2)
        n = n + 2
    Next

 End Sub

(マナ) 2019/03/10(日) 16:51


マナ様

ありがとうございます。

上記とは少し異なる条件ですが、
「あああ」シートA列にフルーツ名を入れ、F列に個数を記入し、
「いいい」シートC列にフルーツ名を入れるというのを下記のようなマクロを作ったのですが、
For i = 1 To wS1.Range("F2")と書いているため、F2の数値しか拾ってこれていません。

Sub 受講講座選択画面ID追加()

    Dim i As Long, wS1 As Worksheet, wS2 As Worksheet
    Set wS1 = Worksheets("あああ")
    Set wS2 = Worksheets("いいい")

    'フルーツを入れる
    For i = 1 To wS1.Range("F8")
        For j = 8 To wS1.Cells(Rows.Count, "A").End(xlUp).Row
        wS2.Cells(Rows.Count, "C").End(xlUp).Offset(1) = wS1.Cells(j, "A")
        Next j
    Next i
End Sub

F8に「2」を入れた場合、

りんご
みかん
りんご
みかん

という出力結果になってしまっています。
上記のようではなく、
りんご|1
を処理したあとに
みかん|3
を処理する。
というように書き換える方法を考えているのですが、うまく考えられないため、アドバイスをいただければと思い書き込みしました。
よろしくお願いいたします。
(むらい) 2019/03/10(日) 17:00


個数は wS1.Cells(j, "F").Value で求めることができます。

値を入れる範囲を広げるには、Resizeプロパティを利用できます。

(マナ) 2019/03/10(日) 17:10


test2の貼り付け位置を
End(xlUp)で求める記述に書き換えました。
これならば理解できますか。
 Sub test3()
    Dim k As Long

    For k = 1 To Cells(Rows.Count, "A").End(xlUp).Row
        Cells(k, "A").Copy Cells(Rows.Count, "D").End(xlUp).Offset(1).Resize(2)
    Next

 End Sub

Resize(2) が個数です。

(マナ) 2019/03/10(日) 17:41


マナ様

ありがとうございます。
下記のようなマクロで実行できました!

    For i = 8 To wS1.Cells(Rows.Count, "A").End(xlUp).Row
        For j = 1 To wS1.Cells(i, "F").Value
        wS1.Cells(i, "A").Copy wS2.Cells(Rows.Count, "C").End(xlUp).Offset(1)
        Next j
    Next i

1点質問ですが、

値を入れる範囲を広げるには、Resizeプロパティを利用できます。

こちらがいまいちわかっておりません。
サイズ変更した後のセル範囲を返しますということは分かるのですが、どう利用するかが思いつきません。
お教えいただければ幸いです。
よろしくお願いいたします。
(むらい) 2019/03/10(日) 17:49


例えばA1を、D1:D3の3セルにコピーするとき
手作業だと、3回コピペを繰り返しませんよね。

1)A1をコピー
2)D1:D3を選択して貼り付け

で、同じ値を一回でペーストしませんか。
マクロでも同じです。

range("A1").copy range("D1:D3")

これで、3セルに1回でコピペできます。

この、
range("D1:D3")

を。Resizeを使うと

Range("D1"),Resize(3)

このようになります。

>For j = 1 To wS1.Cells(i, "F").Value

Resizeを使えば、ループが不要になると言うことです。

(マナ) 2019/03/10(日) 19:30


マナ様

何度もありがとうございます。
なるほど、そういうことなんですね。
理解ができました。
お陰様でスッキリした状態でこちら解決できました。
本当にありがとうございました。

(むらい) 2019/03/10(日) 19:37


ちなみに、Copyメソッドを使うことは必須ではないので。
test3は、これでもよいです。
  Sub test4()
    Dim k As Long
    For k = 1 To Cells(Rows.Count, "A").End(xlUp).Row
    ells(Rows.Count, "A").End(xlUp).Row
        Cells(Rows.Count, "D").End(xlUp).Offset(1).Resize(2).Value = Cells(k, "A").Value
    Next

 End Sub

(マナ) 2019/03/10(日) 20:27


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.