- ベストアンサー
マクロで並び順・行列を入れ替えて貼り付け
- マクロを使用して複数の棚式の表の並び順・行列を入れ替え、集計表を作成したいと思っています。
- Sheet1が集計表であり、Sheet2~5がそれぞれの棚の表です。
- 具体的な作業手順として、空のシートにSheet2の指定範囲を行列入れ替えで貼り付け、それを一つのリストにしてから集計表に貼り付ける方法を試しています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 >シート1のA1が空白または「連番」と項目が入っていて、A2以降にデータがない場合 まさか、データがないということは、まったく、予想していなかったです。 If Val(.Cells(i,1).Value )>0 Then ~ End If として、A列のデータをチェックする程度しか、今は思いつきません。 With Sh0 For i = 2 To .Range("A65536").End(xlUp).Row If Val(.Cells(i,1).Value )>0 Then ArLists = Array(.Cells(i, 2).Value, .Cells(i, 3).Value, _ .Cells(i, 4).Value, .Cells(i, 5).Value, _ .Cells(i, 9).Value) If IsNumeric(.Cells(i, 6).Value) And _ IsNumeric(.Cells(i, 7).Value) And _ IsNumeric(.Cells(i, 8).Value) Then ListUp2Sheet Shes(.Cells(i, 6).Value), _ .Cells(i, 7).Value, _ .Cells(i, 8).Value, _ ArLists End If End If Next i End With
その他の回答 (4)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 もし、ブレークポイントを置くのでしたら、 ● ListUp2Sheet Shes(.Cells(i, 6).Value), _ .Cells(i, 7).Value, _ .Cells(i, 8).Value, _ ArLists の部分で、ローカルウィンドウをごらんになってみてください。正しく、値が渡されているかです。 もしかしたら、もともと、この部分かもしれませんね。 中抜けというよりも、元の範囲が食い違っている可能性が強いです。 With Sh0 '←シート1 ですね。 For i = 2 To .Range("A65536").End(xlUp).Row ArLists = Array(.Cells(i, 2).Value, .Cells(i, 3).Value, _ .Cells(i, 4).Value, .Cells(i, 5).Value, _ .Cells(i, 9).Value) 今まで、やってきたのですから大きな食い違いというより、おそらくは、コードの最初の設定部分などに問題があることが大きいです。
お礼
ご回答ありがとうございます。 シート1のA1が空白または「連番」と項目が入っていて、 A2以降にデータがない場合はエラーにならないのですが、 A1に項目、A2~A4に連番を振って稼動した所、 ListUp2Sheet Shes(.Cells(i, 6).Value), _ .Cells(i, 7).Value, _ .Cells(i, 8).Value, _ ArLists の部分で「インデックスに有効範囲がありません。」と エラーが出ます。 この部分で問題があるのでしょうか? 度々本当に申し訳ございません。。。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >棚1の1段目B2:E5、棚1の2段目B6:E9 ・・ と続きます。 とありましたが、 「1列5行」=ユニット と 表の一覧の方では、2段目 B7:B11, 3段目 B12:B16 となっていましたので、表のほうを優先させました。 つまり、もし、それが違うと、以下の部分を変えなくてはなりません。 With .Cells((Gyo - 1) * 5 + 2, Retu + 1) '★ここが大事 なお、店名は、一度、入れてしまうと、後は、チェックはされません。 また、渡すデータが増えた場合は、ArLists に含めていくような形にします。また、その変数を、パラメータ配列にすれば、何個でも、自由に付け加えるようになります。 '-------------------------------------------------- '標準モジュール Sub TestMacro2() Dim Sh0 As Worksheet Dim Sh1 As Worksheet Dim Sh2 As Worksheet Dim Sh3 As Worksheet Dim Sh4 As Worksheet Dim i As Integer Dim Shes As New Collection Dim ArLists As Variant Dim LastRow As Long Set Sh0 = Worksheets("Sheet1") '原本 Set Sh1 = Worksheets("Sheet2") '1 Set Sh2 = Worksheets("Sheet3") '2 Set Sh3 = Worksheets("Sheet4") '3 Set Sh4 = Worksheets("Sheet5") '4 Shes.Add Sh1 Shes.Add Sh2 Shes.Add Sh3 Shes.Add Sh4 '1.連番, 2.店名, 3.お勧め, 4.品名, 5.金額, 6.棚番, 7.棚行, 8.棚列, 9.備考 With Sh0 For i = 2 To .Range("A65536").End(xlUp).Row ArLists = Array(.Cells(i, 2).Value, .Cells(i, 3).Value, _ .Cells(i, 4).Value, .Cells(i, 5).Value, _ .Cells(i, 9).Value) If IsNumeric(.Cells(i, 6).Value) And _ IsNumeric(.Cells(i, 7).Value) And _ IsNumeric(.Cells(i, 8).Value) Then ListUp2Sheet Shes(.Cells(i, 6).Value), _ .Cells(i, 7).Value, _ .Cells(i, 8).Value, _ ArLists End If Next i End With Set Sh0 = Nothing: Set Sh1 = Nothing Set Sh2 = Nothing: Set Sh3 = Nothing Set Sh4 = Nothing End Sub Private Sub ListUp2Sheet(sh As Worksheet, ByVal Gyo As Integer, ByVal Retu As Integer, ar As Variant) '1.品名,2.お勧め,3.金額,4.備考" With sh If .Cells(1, 2).Value = "" Then .Cells(1, 2).Value = ar(0) With .Cells((Gyo - 1) * 5 + 2, Retu + 1) '★ここが大事 .Offset(0, 0).Value = ar(2) '品名 .Offset(1, 0).Value = ar(1) 'お勧め .Offset(2, 0).Value = ar(3) '金額 .Offset(3, 0).Value = ar(4) '備考 End With End With End Sub
お礼
お礼が遅くなり、申し訳ございません。 マクロを稼動してみたところ、エラーは発生しないのですが、 商品リストのシートにデータが引っ張られません。 「Private Sub ListUp2sheet・・・」にブレークポイントを 置いたのですが、中段されずにマクロが終わっているので 「Private Sub ListUp2sheet・・・」以降を参照していないようです。 色々と試して見たのですが上手くいかず、 私のスキルでは対応できないようです。。。 折角お時間を割いて作って頂いたのに、申し訳ございません。 ありがとうございました。
補足
素晴らしいマクロをありがとうございます!!! 実際の範囲が違うので、応用してまたご報告させて頂きます。 少しお時間を頂くかもしれませんが。。。^^; 取り急ぎ御礼までm(_ _)m
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 前回の作者です。 集計表 1| 連番 店名 お勧め 品名 金額 棚番 棚行 棚列 備考 2| 1 亜 ● ああ 50 1 2 2 aa 3| 2 亜 いい 80 1 2 3 これが、 <Sheet2> 棚1 | A B C D E -------------------------------------------- マクロ自体は、そんなに難しくないように思いますが、それぞれの数字の意味がどういう対応しているのか、読めないです。 「棚割表の1つのシートに1枠 =5行×10列(仮)」 まず、この意味が分からないです。 1列目は、項目行であり、B1 に、店名が入れるのですから、 それぞれ、1行、1列ずれるわけで、左端上を、「B2」を記入の起点とするかと思います。 『棚行 2 棚列 2』 は、 「C2:C5」(画面ではそう見えます) これが分からないです。『棚行 2 棚列 2』 と、それを結びつけるためには、どうしたらよいのか分かりません。 『棚行 2 棚列 3』 これは、もっと分かりません。バラバラに入れているように見えます。 品名「いい」が、B6 ? 品名の「いい」の金額が、D8 のように見えます。 言い換えると、私は、このようにすれば、意味は分かるとは思いますが、どうも意味が違うようですね。 棚番=Sheet名(または順番) 「1列4行」=ユニット ==================================================== 棚行:1,棚列:1 棚行:1,棚列:2 棚行:1,棚列:3 --------------------------------------------------- B2:B5 C2:C5 D2:D5 ==================================================== 棚行:2,棚列:1 棚行:2,棚列:2 棚行:2,棚列:3 ------------------------------------------------ B6:B9 C6:C9 D6:D9 ==================================================== 棚行:3,棚列:1 棚行:3,棚列:1 棚行:3,棚列:1 --------------------------------------------------- B10:B14 C10:C14 D10:D14 --------------------------------------------------- アドレスで説明すればはっきりするのですが、絵的に、ずれているのか、位置関係が読めません。いずれにしても、マクロで解決するなら、数学的に位置関係を決定をしなければなりません。 >「他」の部分は後でソートか置き換えで削除するので、 >貼り付けの時は残っていても大丈夫です。 それに「他」とは、中途半端な位置にきているようですが、一体どこから来るものなのでしょうか?
補足
ご回答ありがとうございます。 前回も大変お世話になりました。 >「棚割表の1つのシートに1枠 =5行×10列(仮)」 >まず、この意味が分からないです。 ロジック(しかもバラバラな・・・)と#1の補足で お伝えしているのが違うので、余計に混乱させてしまったかもしれません。 申し訳ありません。 まずSheet2~5の1行目は、店名、日付、時間等が入るタイトル的な行に なります。2行目以降に店名等は出てきません。 項目行はなく、ロジックで言うとB2:E5が1段の棚になるので、 それを枠と表現させて頂きました。 棚1の1段目B2:E5、棚1の2段目B6:E9 ・・ と続きます。 実際の1段の項目数、列数は異なりますので、#1の補足では キリがよい所で棚の1段(1枠)=5行×10列 とさせて頂きました。 #この先、棚の1段=5行×10列として、補足させて頂きます。 Wendy02さんがアドレスで表してくださったのが正にその通りです。 棚番=Sheet順番-1(Sheet5には棚4なので4) 「1列5行」=ユニット A1 店名 C1 日付 E1 時間 ==================================================== 棚行:1,棚列:1 棚行:1,棚列:2 棚行:1,棚列:3 --------------------------------------------------- B2:B6 C2:C6 D2:D6 ==================================================== 棚行:2,棚列:1 棚行:2,棚列:2 棚行:2,棚列:3 ------------------------------------------------ B7:B11 C7:C11 D7:D11 ==================================================== 棚行:3,棚列:1 棚行:3,棚列:2 棚行:3,棚列:3 --------------------------------------------------- B12:B16 C12:C16 D12:D16 --------------------------------------------------- 「他」は棚割表で入っている場合があり(全てではありません)、 商品名の行には「商品名」、「他」、「空白」が混在しています。 実際のデータでは空白も含め400点(400ユニット)なので、 現在は棚番号、棚行、棚列は指定して割り付ける形にしています。 範囲が変わる事も考えられるので、その点を Sheetの順番、セルの位置から値を取れないかと思った次第です。 以上の補足でお分かり頂けましたでしょうか? 説明が上手くできず申し訳ありません。 よろしくお願いいたします。
- imogasi
- ベストアンサー率27% (4737/17069)
確認と補足を願います。下記A,B,Cの点。 Sheet1の名前「集計表」は集計して内容なので「集約表」が適当かとおもう。 ーーー ○は対応項目あり、従って代入、Xは対応項目なし、右記の処理をする、という意味。 Sheet1ーーーーSheet2-Sheet5・・ 連番ーーーーーーーーX <ーー自動 店番ーーーーーーーー○ お勧めーーーーーーー○ 品名ーーーーーーーー○ 金額ーーーーーーーー○ 備考ーーーーーーーー○ 棚番ーーーーーーーーX <ーー自動 棚行ーーーーーーーーX <==空白を入れる(A) 棚列ーーーーーーーーX <==空白を入れる(B) ーー (A)(B)は空白でよいか ==== 例えばSheet2で 品名の出現する行を察知するのは、文字列では何も無いですね 5行おきに規則正しく品名が出てきて、終わり行まで、狂うことは無いですね?(C) === 以上A,B,Cについて補足お願いします。
補足
ご回答ありがとうございました。 補足させて頂きます。 まず、おっしゃる通り集計表は不適当ですね^_^; 棚割表の1つのシートに1枠5行×10列(仮)として、10枠(仮)あります。 途中、余分な行見出し等は入っていませんので、 (C)のお答えとしては、狂うことはありません。 そのシートが4つあるので、品名は400まで取れますが、 実際にデータが入っているのは最大100です。 (A)(B)棚行、棚列は必要です。 セル位置から情報が取れないのであれば、 棚割表からブランクを含めて5行×10列を貼り付けた後に、 任意で値を組み込まないといけないかと思っています。 (現在のマクロでは、Sheet1のフォーマットに 棚番、棚行、棚列を割り振り、その脇に貼り付けています) ちなみにお勧めをキーにソートをかけて、 連番は、お勧め以外の品で1~、お勧めで101~となります。 補足としては以上でよろしいでしょうか? 何かございましたら、また補足させて頂きますので、 どうぞ宜しくお願いいたしますm(_ _)m
お礼
お礼が遅くなり、大変申し訳ございません。 残念ながら、やはり上手くいきません。。。 現在頂いているマクロもしっかり応用できるように勉強しないと 今後対応ができないので、今のスキルでは取り入れる事が難しそうです。 折角ご丁寧に対応してくださったのに申し訳ございませんでした。 どうもありがとうございました。