アプリ版:「スタンプのみでお礼する」機能のリリースについて

添付の左表から右表を作成するマクロを作りたいのです

【個数が1以上の商品のものを個数分行コピーするという内容のマクロを組みたいのです。】

配列に格納して、配列最終要素まで取るところまではできたのですが、
【個数の値が1以上の場合、その数量分をコピーして次の商品の個数が1以上ならコピーする】
というプログラムの書き方がわからず途中で止まってしまっています。

どなたかおわかりのかたがおられましたらご教示お願いできないでしょうか。

よろしくお願いいたします


★途中まで作成したプログラム。
Sub Macro1()

i = 0
Count = 0
Maxrow = Range("D6").End(xlDown).Row '最終行取得
Set myRange = ActiveSheet.Range(Cells(6, 4), Cells(Maxrow, 4))
myArray = myRange
Count = UBound(myArray) '配列に値が入っている最後の要素番号取得
While (i <= Count)
   ここをどう書けばいいのかわからなくて困っています。
Wend
End Sub

「個数が1以上の行を個数分行コピーするマク」の質問画像

A 回答 (5件)

行数の予測が立ちにくいとかならこんな方法も。



Sub megu()
Dim myAl As Object
Dim r As Range, i As Integer

Set myAl = CreateObject("System.Collections.ArrayList")

For Each r In Range("C6", Cells(Rows.Count, "C").End(xlUp))
For i = 1 To r.Offset(, 1).Value

myAl.Add (Array(r.Value, r.Offset(, 1).Value))

Next
Next

Range("G5:H5").Value = Range("C5:D5").Value

With Application
Range("G6").Resize(myAl.Count, 2).Value = .Transpose(.Transpose(myAl.ToArray()))
End With

Set myAl = Nothing

End Sub

ただしWin10の場合ですとこちらも関係するかも。(PDFファイルです)
https://www.e-reverse.com/uploads/Windows10.NETF …
    • good
    • 0
この回答へのお礼

ありがとうございます。

fujillinさんのアルゴリズムを元に、皆様の助言を元にあれから作成していたところ今できました。

コード提示もいただきありがとうございました。

お礼日時:2020/04/20 00:32

>【個数が1以上の商品のものを個数分行コピーするという内容のマクロを組みたいのです。


これについては、配列を使う必要はないと思いますよ。
配列の使いどころとして、セル範囲への入出力時やランダムアクセスが必要な場合などと思います。
この場合、セル範囲への入出力時に有効と思いますが、Excelの機能などを使用する方が容易で速い場合がありますよ。

もし、配列の学習を兼ねと言うなら、ベタに(Forで)画像のG~Hに書き出す処理を書いてみましょう。
その処理は、配列を使用した時のそれに近いと思います。

Set myRange = ActiveSheet.Range(Cells(6, 4), Cells(Maxrow, 4))
myArray = myRange

後からmyRangeを使用しないなら、
初めから、myArray = ActiveSheet.Range(Cells(6, 3), Cells(Maxrow, 4)) 
要素数が予測できるなら、範囲全てにしても良いかと思います。
    • good
    • 0
この回答へのお礼

配列を使う必要はなかったのですか。
ネットで調べてたら、列 配列格納みたいな記事がヒットしたので、配列でやるのがいいのかと思い組んでました。

頂いたコードを元に作成してみたいと思います。

お礼日時:2020/04/19 23:16

こんにちは



ご提示とは別の考え方ですが、方法と手順をご参考までに。

1)最終行を求め、6行目までStep-1で以下を下からループ
2-1)指定行数=1なら何もしない
2-2)>1の場合、処理中の行の下に、指定行-1 行分をコピー挿入

ループ終了で、処理終了
    • good
    • 0
この回答へのお礼

ありがとうございます。
「1)最終行を求め、」ここまではわかったんですが、私も最終行は出す必要があるよね。って思ったので最終行を取るとこまで書いたのです。
ただ、1)・・・「6行目までStep-1で以下を下からループ」これは上に上っていってるんでしょうか。上に登る意味がつかめないので、底から考えてみたいと思います。

お礼日時:2020/04/19 23:15

こんぱくさん。

思考の順番が間違ってますよ!!
ループ内で行うべき処理内容を決めてから、ループに入る前に、何を準備すべきかを考えるべきです。

今回の処理において、ループ内で行うべき処理をざっくり書いてみました。
もし、このロジックが納得できるようであれば、この処理に合わせて、事前準備、および、ループのロジックを考えてみて下さい。
ちなみに、ループ内で行の追加や削除を行う場合、下から上に向かって処理した方が、簡単な場合が多いです。その辺もよく考えてみて下さい。

以下、ループ内の参考ロジックです。

With Range("C6:D6")
.Copy
.Resize(1).Insert Shift:=xlDown
End With
    • good
    • 1
この回答へのお礼

アルゴリズムで、一行挿入したら元の行もずれて下に行って。
「あれ?そうなったら結局どう処理したらいいんだ?元の格納された値をどう足して処理する?」
ってなって、アルゴリズムが全然思いつかなくて進まなくなってしまったんです。

参考ロジックでまた考えてみたいと思います。

お礼日時:2020/04/19 23:12

配列に入れてどうこうするってのは、この質問は課題ですか?(なぜ配列に入れるのか?との疑問から)


仮に課題ですと使用できる手段に制限(習った・習ってない)があるでしょうから、そこが不明確ですと回答も意味をなさないかと。
    • good
    • 0
この回答へのお礼

学校の課題とかではなくて、エクセルの事務処理を簡単にするマクロを作ろうとしたのです。

ただどうしてもそのループ部分のアルゴリズムが解決できなくて、今回投稿させていただいたのです。

お礼日時:2020/04/19 23:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!