Option Explicit
Dim gst_retu As String
Public Sub main()
'「main」と[main1]シート以外のワークシートを削除する
sh_delete
'追加課題1:プリンターのヘッダーとフッター、印刷範囲の設定をする
shmain1_print_setting
'「No.」の列に番号を割り振る
shmain_no_assign
'取引先名称で並べ替える
gst_retu = "B"
shmain_asc_sort
'取引先名称ごとに伝票を作成する
denpyo_create
'「No.」の列を並べ替える
gst_retu = "A"
shmain_asc_sort
'追加課題[2]:A列のデータ全てを削除する
shmain_no_delete
End Sub
Private Sub shmain_asc_sort()
Dim wfm_sh As Worksheet
Dim cfm_mx As Long
Set wfm_sh = Worksheets("main")
cfm_mx = wfm_sh.Range("B1048576").End(xlUp).Row
wfm_sh.Range("A1:G" & cfm_mx).Sort _
Key1:=wfm_sh.Range(gst_retu & 1), _
Order1:=xlAscending, _
Header:=xlYes
End Sub
Private Sub shmain_no_assign()
Dim wfm_sh As Worksheet
Dim cfm_gyo As Long
Dim cfm_mx As Long
Set wfm_sh = Worksheets("main")
cfm_mx = wfm_sh.Range("B1048576").End(xlUp).Row
wfm_sh.Range("A2").FormulaR1C1 = "1"
wfm_sh.Range("A3").FormulaR1C1 = "2"
wfm_sh.Range("A2:A3").AutoFill Destination:=wfm_sh.Range("A2:A" & cfm_mx)
End Sub
Private Sub denpyo_create()
Dim wfm_sh As Worksheet
Dim wto_sh As Worksheet
Dim stfm_torihikisaki As String
Dim cfm_gyo As Long
Dim cfm_mx As Long
Dim cto_cnt As Long
Dim cfm_kingaku As Long
Dim dtfm As Date
Set wfm_sh = Worksheets("main")
cfm_mx = wfm_sh.Range("B1048576").End(xlUp).Row
For cfm_gyo = 2 To cfm_mx
If stfm_torihikisaki <> wfm_sh.Range("B" & cfm_gyo).Value Then
If cfm_gyo > 2 Then
denpyo_rasenn_draw
End If
cto_cnt = 16
stfm_torihikisaki = wfm_sh.Range("B" & cfm_gyo).Value
Sheets("main1").Copy After:=Worksheets(Worksheets.Count)
Set wto_sh = ActiveSheet
wto_sh.Name = stfm_torihikisaki
End If
wto_sh.Range("E" & cto_cnt).Value = wfm_sh.Range("D" & cfm_gyo).Value
wto_sh.Range("F" & cto_cnt).Value = wfm_sh.Range("E" & cfm_gyo).Value
wto_sh.Range("H" & cto_cnt).Value = wfm_sh.Range("F" & cfm_gyo).Value
dtfm = wfm_sh.Range("C" & cfm_gyo).Value
wto_sh.Range("B" & cto_cnt).Value = Format(dtfm, "yy")
wto_sh.Range("C" & cto_cnt).Value = Format(dtfm, "mm")
wto_sh.Range("D" & cto_cnt).Value = Format(dtfm, "dd")
cfm_kingaku = wfm_sh.Range("G" & cfm_gyo).Value
If cfm_kingaku > 0 Then
wto_sh.Range("I" & cto_cnt).Value = cfm_kingaku
Else
wto_sh.Range("J" & cto_cnt).Value = cfm_kingaku
End If
wto_sh.Range("K" & cto_cnt).Value = wto_sh.Range("K" & cto_cnt - 1).Value + cfm_kingaku
cto_cnt = cto_cnt + 1
Next
denpyo_rasenn_draw
wfm_sh.Activate
End Sub
Private Sub denpyo_rasenn_draw()
Dim cto_mx As Long
cto_mx = Range("K1048576").End(xlUp).Row + 1
With Range("B16:K" & cto_mx).Borders
.Item(xlEdgeLeft).LineStyle = xlContinuous
.Item(xlEdgeTop).LineStyle = xlContinuous
.Item(xlEdgeBottom).LineStyle = xlContinuous
.Item(xlEdgeRight).LineStyle = xlContinuous
.Item(xlInsideVertical).LineStyle = xlContinuous
.Item(xlInsideHorizontal).LineStyle = xlContinuous
End With
End Sub
Private Sub shmain1_print_setting()
Dim wmain1_sh As Worksheet
Set wmain1_sh = Worksheets("main1")
With wmain1_sh.PageSetup
'追加課題[1]-1
'[1]-1 伝票用テンプレートには、以下の欠点がありますので、マクロの中でそれを修正してくださ
い。
'1. ヘッダー、フッターが挿入されていない
' 中央ヘッダーに、シート名が中央に配置され、そのフォントサイズが16に設定する
.CenterHeader = "&A&16"
' 右ヘッダー現在の日付を設定する
.RightHeader = "&D"
' 中央フッターに「ページ番号と総ページ数」を設定する
.CenterFooter = "&P / &N"
'追加課題[1]-2
'2. 印刷範囲の設定が狭くこのままでは、どの取引先の伝票も印刷時に実データが印刷されません。
' ページの方向を縦に設定
.Orientation = xlPortrait
' 用紙のサイズをA4に設定
.PaperSize = xlPaperA4
' 印刷範囲を設定(B列からK列までの列)
.PrintArea = "B:K"
'横方向に1ページに収める
.FitToPagesWide = 1
'縦方向に1ページに収める
.FitToPagesTall = 1
End With
End Sub
Private Sub shmain_no_delete()
'追加課題[2]
'[2] すべての処理が終わった後、A列で並べ替え、(shmain_asc_sortで並び替え済み。)
'そして、A列のデータ全てを削除します。
'(つまり、シートmainの状態は、マクロ実行前とまったく同じに戻します)
Dim wfm_sh As Worksheet
Dim cfm_gyo As Long
Dim cfm_mx As Long
Set wfm_sh = Worksheets("main")
cfm_mx = wfm_sh.Range("B1048576").End(xlUp).Row
wfm_sh.Range("A2:A" & cfm_mx).ClearContents
End Sub
Public Sub sh_delete()
Dim wks As Worksheet
Application.DisplayAlerts = False
For Each wks In Worksheets
If Left(wks.Name, 4) <> "main" Then
wks.Delete
End If
Next
Application.DisplayAlerts = True
End Sub
受講生さんの投稿
(投稿ID: 5508)
追加課題2件やってみましたので、ご確認お願いします。
●追加課題1件目
[1] 伝票用テンプレートには、以下の欠点がありますので、マクロの中でそれを修正してください。
1. ヘッダー、フッターが挿入されていない
2. 印刷範囲の設定が狭くこのままでは、どの取引先の伝票も
印刷時に実データが印刷されません。
●追加課題2件目
[2] すべての処理が終わった後、A列で並べ替え、
そして、A列のデータ全てを削除します。
(つまり、シートmainの状態は、マクロ実行前とまったく同じに戻します)
所感
印刷設定に関してはネットで調べたり、手探りでやってみましたので、
自信はあまりないです が、会社毎の伝票作成に入る前の段階で( denpyo_createより前)
main1シートのテンプレの印刷設定( ヘッダー、フッタ ー、 印刷範囲)をするプログラム
( shmain1_print_setting)で組んでみました。
小川 慶一さんのコメント
(コメントID: 8269)
shmain1_print_setting で行っている作業については、マクロでなくテンプレートの設定を直接編集してしまうほうが良いでしょう。
いただいたものでも、良いと言えばよいかと思います。ただ、マクロ実行の都度このプロシージャが実行されてしまうので、その分都度のパフォーマンスが落ちます。。
受講生さんのコメント
(コメントID: 8270)
>shmain1_print_setting で行っている作業については、マクロでなくテンプレートの設定を直接編集してしまう>ほうが良いでしょう。
こちらは盲点でした。事前にmain1シートのテンプレを手動で印刷設定していれば、余分に印刷設定用のコードを書く必要ありませんでした・・・。マクロのパフォーマンスが落ちないようにすることも視野に入れてまいります。