不特定のデータ数ですから、関数は使う気になりませんね。下記VBAを書いてみました。
●データが入力されているシート="Sheet1"。請求書フォーマットのあるシート="Sheet2" とします。
Sheet1のE列に連番を振ります。ソートしたデータを元に戻すためです。
Sheet1のデータを商品名、売上日、伝票番号の優先キー順で並べます。(商品名は最優先です。後は自由)
Sheet2がどのような形か分かりませんので勝手に想定しました。
商品名
AAA04
売上日 伝票番号 請求額
2001/7/ 9 1021 61,600
2001/7/12 1020 46,700
2001/7/14 1027 12,200 のように想定し、
商品名の下のセルに範囲名:trsSyohin(上図のAAA04の場所)
売上日の下のセルに範囲名:trsData(上図の2001/7/ 9の場所)
Sheet1のA1(商品名という表題が入っている?)に範囲名:DataTop を付けます。
●Sheet2にコントロールツールボックスからボタンを貼り付けます。
(表示→ツールバー→Visual Basic)
●ツール→マクロ→Visual Basic Editor でVBE画面に移り、Sheet2のコードウインドウに貼り付けます。
Private Sub CommandButton1_Click()
DataTensou
End Sub
●次は標準モジュールを挿入し(挿入→標準モジュール)貼り付け
Public dataNum As Long 'データ個数
Public rgDt As Range 'データ基準セル
Public rgTsyo, rgTdat As Range '商品転記セル、データ転記基準セル
Public cot As Long 'カウンタ
Public newSyohin As String '読み込んだ商品名
Public TensoNum As Long '転記した個数
Public endFlg As Boolean 'データ終了フラグ
Public Sub DataTensou()
Set rgDt = Range("DataTop") 'データ基準セル
Set rgTsyo = Range("trsSyohin") '商品転記セル
Set rgTdat = Range("trsData") 'データ転記基準セル
'
With rgTdat '書き込み済みデータを消去
If TensoNum > 0 Then
Range(.Cells(1, 1), .Cells(TensoNum, 3)).ClearContents
End If
End With
'
dataNum = Worksheets("Sheet1").UsedRange.Rows.Count - 1
With rgDt
TensoNum = 0 '転記した個数をクリア
newSyohin = .Offset(cot + 1, 0) '今度転記する商品名
rgTsyo.Offset(0, 0) = newSyohin
While newSyohin = .Offset(cot + 1, 0) And cot <= dataNum
rgTdat.Offset(TensoNum, 0) = .Offset(cot + 1, 1)
rgTdat.Offset(TensoNum, 1) = .Offset(cot + 1, 2)
rgTdat.Offset(TensoNum, 2) = .Offset(cot + 1, 3)
TensoNum = TensoNum + 1
cot = cot + 1
Wend
End With
'
If cot > dataNum Then
MsgBox "終了しました"
cot = 0: TensoNum = 0: endFlg = True
Else
'どちらかの「'」をはずすとプレビューか印刷を実行
'ActiveSheet.PrintPreview 'プレビュー(印刷範囲を設定すること)
'ActiveSheet.PrintOut '印刷(印刷範囲を設定すること)
End If
End Sub
Public Sub PrintALL() '全印刷
While endFlg = False
DataTensou
Wend
endFlg = False
End Sub
ボタンを押す毎に商品名単位で転記します。終われば、最初から繰り返せます。
自動印刷やボタン1発で全印刷とか・・・いろいろできそうです。(参考に書きました)
いつも長くなってしまう・・・デハ。
お礼
追加でご回答本当にありがとうございました。 これで、毎月の処理が楽になります。