プロが教えるわが家の防犯対策術!

シート1のAセルに[商品名+番号]が入っていてBセルに値段が入っていて、
80行位並んでいます。
Aセル/Bセル
冷蔵庫1/50,000
冷蔵庫2/65,000
・・・
冷蔵庫8/73,000
洗濯機1/32,000
・・・

D1セル 冷蔵庫
D2セル 洗濯機
・・・
E1セル = =IF(D1="","",COUNTIF($A$1:$A$80,D1&"*"))
E2セル = =IF(D1="","",COUNTIF($A$1:$A$80,D2&"*"))
・・・
このリストを別シートに2列で表示したいのですが、
(1)左右どちらに表示されてもかまわないが、冷蔵庫は冷蔵庫でまとめて同じ列に表示する
(2)商品名や番号は追加されたり削除されたりするのでどの商品がいくつあるかはEセルで判断する
(3)左右ほぼ、同じ位の行になるように商品を振り分ける。

としたいのですが、どのようにしたらいいでしょうか?
マクロで構いませんので(他の方法は思いつかないです)アドバイス等でも結構ですので、教えてください。
何かわからない所があったら質問してください。
よろしくお願いします。

A 回答 (6件)

はじめまして。



私でよろしければ、サンプルマクロを作ってみたいと思います。
別シートに2列で表示させたいということですが、サンプルマクロが作りやすくなりますので、別シートの項目名と配置されるセル番地を決めていただけないでしょうか。

お手数をおかけいたしますが、よろしくお願いいたします。

この回答への補足

本当は、もっと複雑なので、それをここ載せたらかなり長くなってしまいます。

ですから、別シートの項目名は、
A、Dセルに商品名
B、Eセルに金額
Cセルは空白で、
1行目はタイトル
2行目は作った日付
3行目が項目見出し
4行目からデータの表示
という事でお願いします。
こんな、補足でよろしいでしょうか?

補足日時:2002/10/15 11:14
    • good
    • 0

少し一般化しています。

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列に表示したいのです。

それと、わたしの例にどのように変更したらいいのかもちょっとわかりません。
お手数ですが、そのへんを教えて頂けないでしょうか?

補足日時:2002/10/15 11:33
    • good
    • 0

#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
    • good
    • 0

早速サンプルマクロを作ってみました。


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ヵ月後には、追加されたり、削除されたりしますので今回の配置にはならなくなります。

ちょっと長くなってしまいましたが、よろしくお願いします。

補足日時:2002/10/15 21:19
    • good
    • 0

左右のバランス調整を考えた修正マクロを作ってみました。

#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に書いたようになって欲しいです。
無理でしたら、無理と書いて頂ければ諦めます。

よろしくお願いします。
このサンプルマクロはこれから勉強させて頂きます。

補足日時:2002/10/15 21:26
    • good
    • 0

なるべく左右の差が縮まるよう次のように考えてみました。



1.シート1のD列とE列を降順でソートをかける。(下のコードがこれを実行するマクロです。)
2.シート2のA列に一番データ量が多い商品を配置
3.シート2のD列に次にデータ量の多い商品を配置
4.シート2のD列に次にデータ量の多い商品を配置
5.シート2のA列に次にデータ量の多い商品を配置
6.4・5を繰り返す。

勿論例のように左右均等に振り分けられる時は必ず振り分けられるようにマクロを組むことは可能かと思いますが、今の私の知識ではこれが精一杯です。私の知識不足をお許し下さい。
あと、マクロで罫線を自動で引くこともできます。このマクロのコードが必要な時はお知らせ下さい。
    • good
    • 0
この回答へのお礼

このリストは優先順位が高い順に書いてあり上から順に振り分けたいので、
1のソートの部分はちょっと使えません。
が、おかげで振り分けのヒントが得られました。
これから、頑張って作ってみようと思います。
長いこと煩わせてしまい、大変すみませんでした。
どうもありがとうございました。

お礼日時:2002/10/16 02:30

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