- ベストアンサー
エクセルの表を別のシートに2列で表示したい
- エクセルの表を別のシートに2列で表示する方法を教えてください。
- 商品名と番号をまとめて同じ列に表示し、どの商品がいくつあるかは別シートのセルで判断する方法を教えてください。
- 左右ほぼ同じ位の行に商品を振り分ける方法を教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
なるべく左右の差が縮まるよう次のように考えてみました。 1.シート1のD列とE列を降順でソートをかける。(下のコードがこれを実行するマクロです。) 2.シート2のA列に一番データ量が多い商品を配置 3.シート2のD列に次にデータ量の多い商品を配置 4.シート2のD列に次にデータ量の多い商品を配置 5.シート2のA列に次にデータ量の多い商品を配置 6.4・5を繰り返す。 勿論例のように左右均等に振り分けられる時は必ず振り分けられるようにマクロを組むことは可能かと思いますが、今の私の知識ではこれが精一杯です。私の知識不足をお許し下さい。 あと、マクロで罫線を自動で引くこともできます。このマクロのコードが必要な時はお知らせ下さい。
その他の回答 (5)
- kazuhiko5681
- ベストアンサー率49% (79/159)
左右のバランス調整を考えた修正マクロを作ってみました。#4の想定と同じく作ってあります。 Sub test() Dim i As Integer Dim j As Integer Dim myNum As Integer Dim myRow1 As Integer Dim myRow2 As Integer For i = 2 To Cells(Rows.Count, 4).End(xlUp).Row If i > 3 Then myRow1 = Worksheets(2).Cells(Rows.Count, 1).End(xlUp).Row myRow2 = Worksheets(2).Cells(Rows.Count, 4).End(xlUp).Row End If For j = 4 To Cells(Rows.Count, 1).End(xlUp).Row myNum = Application.WorksheetFunction.CountIf(Range("A" & j & ":" & "A" & j), Cells(i, 4).Value & "*") If myNum = 1 Then If i = 2 Or (i <> 3 And myRow1 < myRow2) Or (i <> 3 And myRow1 = myRow2) Then If Worksheets(2).Range("A4").Value = "" Then Worksheets(2).Range("A4").Value = Cells(j, 1).Value Worksheets(2).Range("B4").Value = Cells(j, 2).Value Else Worksheets(2).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Cells(j, 1).Value Worksheets(2).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Value = Cells(j, 2).Value End If ElseIf i = 3 Or myRow1 > myRow2 Then If Worksheets(2).Range("D4").Value = "" Then Worksheets(2).Range("D4").Value = Cells(j, 1).Value Worksheets(2).Range("E4").Value = Cells(j, 2).Value Else Worksheets(2).Cells(Rows.Count, 4).End(xlUp).Offset(1, 0).Value = Cells(j, 1).Value Worksheets(2).Cells(Rows.Count, 5).End(xlUp).Offset(1, 0).Value = Cells(j, 2).Value End If End If End If Next j Next i End Sub あなた様のおやりになりたいことが、実現しているはずです。 もし不具合がありましたら、ご遠慮なくお知らせ下さい。
補足
No.4の補足を書いている間に、次の回答が入ってしまいました。 今、試してみたところ No.4の補足に書いたサンプルデータが、 冷蔵庫 8件/洗濯機 9件 電子レンジ 17件/扇風機 3件 パソコン 10件/エアコン 20件 /ワープロ 13件 ---------------------------------- 計 35件/ 45件 でならんでいます。 実際には、半分に出来るので、出来ればNo.4に書いたようになって欲しいです。 無理でしたら、無理と書いて頂ければ諦めます。 よろしくお願いします。 このサンプルマクロはこれから勉強させて頂きます。
- kazuhiko5681
- ベストアンサー率49% (79/159)
早速サンプルマクロを作ってみました。 Aセル/Bセル 冷蔵庫1/50,000 冷蔵庫2/65,000 ・・・ 冷蔵庫8/73,000 洗濯機1/32,000 ・・・ このデータがシート1の4行目から入力されていることを想定しています。 D1セル 冷蔵庫 D2セル 洗濯機 ・・・ このデータがシート1の2行目から入力されていることを想定しています。 書き出すデータはシート2の4行目から書き出されるように設定してあります。 Sub Test() Dim i As Integer Dim j As Integer Dim myNum As Integer For i = 2 To Cells(Rows.Count, 4).End(xlUp).Row For j = 4 To Cells(Rows.Count, 1).End(xlUp).Row myNum = Application.WorksheetFunction.CountIf(Range("A" & j & ":" & "A" & j), Cells(i, 4).Value & "*") If myNum = 1 Then If j Mod 2 = 1 Then If Worksheets(2).Range("A4").Value = "" Then Worksheets(2).Range("A4").Value = Cells(j, 1).Value Worksheets(2).Range("B4").Value = Cells(j, 2).Value Else Worksheets(2).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Cells(j, 1).Value Worksheets(2).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Value = Cells(j, 2).Value End If ElseIf j Mod 2 = 0 Then If Worksheets(2).Range("D4").Value = "" Then Worksheets(2).Range("D4").Value = Cells(j, 1).Value Worksheets(2).Range("E4").Value = Cells(j, 2).Value Else Worksheets(2).Cells(Rows.Count, 4).End(xlUp).Offset(1, 0).Value = Cells(j, 1).Value Worksheets(2).Cells(Rows.Count, 5).End(xlUp).Offset(1, 0).Value = Cells(j, 2).Value End If End If End If Next j Next i End Sub あなた様は、VBAのことをご存知だと思いますので、このコードを実行してみてください。 左右のバランスは考えていませんが、左右にデータが振り分けられて移動するはずです。 左右のバランス調整につきましては、現在思考中です。出来上がり次第お知らせいたしますので、今しばらくお待ち下さい。 なお、実行方法がお解りにならない時はお知らせ下さい。説明させていただきます。
補足
回答ありがとうございます。 が、冷蔵庫は、冷蔵庫で1つの列にしたいのです。 この作業が3ヶ月に1回位あって、現在は (1)まず、商品毎の個数を調べ(ここの部分は、D、Eセルに作りました) (2)全てを足して2で割り、計算して左右に振り分けバランスよく配置し(この部分) (3)罫線を引く(商品別に太線にし一行毎細線) という作業をしています。 ですから、ちょうど半分という訳にはいかないと思うのですが、 出来るだけ、左右が同じ位になるようにしたいのです。 現在のサンプルデータとして、 冷蔵庫 8件、洗濯機 9件、電子レンジ 17件、扇風機 3件、エアコン 20件 パソコン 10件、ワープロ 13件 があります。 これを 冷蔵庫 8件/電子レンジ 17件 洗濯機 9件/扇風機 3件 パソコン 10件/エアコン 20件 ワープロ 13件 ----------------------------------- 計 40件/ 40件 この例では、偶然、左右40件になっていますが、42件と38件位ならよしと思っています。 (それ以上はなるべくならないように・・・) 実際のデータは、(80件)固定ではありません。 もちろん、3ヵ月後には、追加されたり、削除されたりしますので今回の配置にはならなくなります。 ちょっと長くなってしまいましたが、よろしくお願いします。
- imogasi
- ベストアンサー率27% (4737/17069)
#2の者です。「冷蔵庫01」等から数字部分を取り除き 比較しないといけないのが、洩れていました。下記にサブルーチンの一例を載せます。Cell(i,1)とJ列を 比較する時、変換後で比較してください。J列へのセット も変換後の文字列でしてください。 Function suujidel(c As String) a = "0123456789" For i = 1 To Len(Cells(1, 1)) For j = 1 To 9 If Mid(c, i, 1) = Mid(a, j, 1) Then b = Mid(c, 1, i - 1) suujidel = b Exit Function End If Next j Next i suujidel = c End Function '------------- Sub test03() Dim c As String c = Cells(1, 1) a = suujidel(c) MsgBox a End Sub
- imogasi
- ベストアンサー率27% (4737/17069)
少し一般化しています。A列に冷蔵庫、洗濯機のほかに 約250品目以内なら対応します。 (1)A列にテストデータとしてSheet1のA1:A12にa,a,a,a,a,b,a,b,c,c,d,aといれます。 (2)VBEのModule1に下記コードを入れます。 Sub test01() d = Worksheets("sheet1").Range("a1").CurrentRegion.Rows.Count '---初期設定。第1行目分処理。 Cells(1, 10) = Cells(1, 1) 'J列 品名 Cells(1, 11) = 2 'K列 シートインデックス Cells(1, 12) = 1 'L列 書きこみ済み行 Worksheets(2).Cells(1, 1) = Worksheets("sheet1").Cells(1, 1) Worksheets(2).Cells(1, 2) = 1 m = 1 '-----第2行目以下 For i = 2 To d For K = 1 To m If Cells(i, 1) = Cells(K, 10) Then Worksheets(Cells(K, 11)).Cells(Cells(K, 12) + 1, 1) = Worksheets("sheet1").Cells(i, 1) Worksheets(Cells(K, 11)).Cells(Cells(K, 12) + 1, 2) = i Cells(K, 12) = Cells(K, 12) + 1 GoTo p01 End If Next K '---新しい品目見つかった時 m = m + 1 Cells(m, 10) = Cells(i, 1) Cells(m, 11) = Cells(m - 1, 11) + 1 Cells(m, 12) = 1 Worksheets(Cells(m, 11)).Cells(Cells(m, 12), 1) = Worksheets("sheet1").Cells(i, 1) Worksheets(Cells(m, 11)).Cells(Cells(m, 12), 2) = i '----- p01: Next i End Sub 実行すると、Sheet2のA列のA1:A7に aが7つ持ってきています。 Sheet3のA列のA1:A2にbが2つを持ってきています。 Sheet4、Sheet5以下説明省略。 (3)本番で修正すること A.開始行が全て1からになっていますが、Cells(●,○)の●を修正してください。 B.シートのインデックス、記録済み行数をSheet1のJ,K,L行に持っていますが、邪魔な場合は適当な3列にずらし、関係行のCells(●,○)の○を修正してください C.Sheet1のA列のデータしかSheet2以下に移していませんが、B、C・・列でSheet2以下に移す必要列 を、A列を移している直後に書き加えてください。 初期設定の部分と2行目以下の部分と2箇所あります。 D.上記でSheet2等のB列はSheet1の第何行 目から移したかを参考までにセットしています。省いて 下さい。
補足
回答ありがとうございます。 が、よくわかりません。 Sheet3やSheet4がでてくるのですが、1枚のシートへ2列に表示したいのです。 それと、わたしの例にどのように変更したらいいのかもちょっとわかりません。 お手数ですが、そのへんを教えて頂けないでしょうか?
- kazuhiko5681
- ベストアンサー率49% (79/159)
はじめまして。 私でよろしければ、サンプルマクロを作ってみたいと思います。 別シートに2列で表示させたいということですが、サンプルマクロが作りやすくなりますので、別シートの項目名と配置されるセル番地を決めていただけないでしょうか。 お手数をおかけいたしますが、よろしくお願いいたします。
補足
本当は、もっと複雑なので、それをここ載せたらかなり長くなってしまいます。 ですから、別シートの項目名は、 A、Dセルに商品名 B、Eセルに金額 Cセルは空白で、 1行目はタイトル 2行目は作った日付 3行目が項目見出し 4行目からデータの表示 という事でお願いします。 こんな、補足でよろしいでしょうか?
お礼
このリストは優先順位が高い順に書いてあり上から順に振り分けたいので、 1のソートの部分はちょっと使えません。 が、おかげで振り分けのヒントが得られました。 これから、頑張って作ってみようと思います。 長いこと煩わせてしまい、大変すみませんでした。 どうもありがとうございました。