Option Explicit
'全体処理
Sub Main()
Denpyyo_Delete
Print_Set
No_Add
Torihikisaki_Asccending_Order
Denpyo_Create
No_Asccending_Order
No_Delete
End Sub
'取引先毎に伝票作成
Sub Denpyo_Create()
Denpyyo_Delete
Dim WFm As Worksheet
Dim WTo As Worksheet
Dim CFm As Long
Dim CFmMax As Long
Dim CName As String
Dim CSum As Long
Dim Cnt As Long
Dim Dt As Date
Set WFm = Worksheets("main")
CFmMax = WFm.Range("B65536").End(xlUp).Row
Cnt = 16
For CFm = 2 To CFmMax
If CName <> WFm.Range("B" & CFm).Value Then
If CFm <> 2 Then
Denpyo_DrawLine
End If
Cnt = 16
CName = WFm.Range("B" & CFm).Value
Sheets("main1").Copy After:=Worksheets(Worksheets.Count)
Worksheets(Worksheets.Count).Name = CName
Set WTo = ActiveSheet
End If
WTo.Range("H" & Cnt).Value = WFm.Range("F" & CFm).Value
WTo.Range("E" & Cnt).Value = WFm.Range("D" & CFm).Value
WTo.Range("F" & Cnt).Value = WFm.Range("E" & CFm).Value
Dt = WFm.Range("C" & CFm).Value
WTo.Range("B" & Cnt).Value = Right(Year(Dt), 2)
WTo.Range("C" & Cnt).Value = Month(Dt)
WTo.Range("D" & Cnt).Value = Day(Dt)
CSum = WFm.Range("G" & CFm).Value
If CSum < 0 Then
WTo.Range("J" & Cnt).Value = CSum
Else
WTo.Range("I" & Cnt).Value = CSum
End If
WTo.Range("K" & Cnt).Value = WTo.Range("K" & Cnt - 1).Value + CSum
Cnt = Cnt + 1
Next
Denpyo_DrawLine
End Sub
'mainシートのNoを追加
Sub No_Add()
Dim WFm As Worksheet
Dim CFmMax As Long
Set WFm = Worksheets("main")
CFmMax = WFm.Range("B65536").End(xlUp).Row
WFm.Range("A1").Value = "No"
WFm.Range("A2").FormulaR1C1 = "1"
WFm.Range("A3").FormulaR1C1 = "2"
WFm.Range("A2:A3").AutoFill Destination:=WFm.Range("A2:A" & CFmMax)
End Sub
'取引先名称を昇順
Sub Torihikisaki_Asccending_Order()
Dim WFm As Worksheet
Dim CFmMax As Long
Set WFm = Worksheets("main")
CFmMax = WFm.Range("B65536").End(xlUp).Row
WFm.Range("A1:G" & CFmMax).Sort _
Key1:=WFm.Range("B1"), _
Order1:=xlAscending, _
Header:=xlYes
End Sub
'NOを昇順
Sub No_Asccending_Order()
Dim WFm As Worksheet
Dim CFmMax As Long
Set WFm = Worksheets("main")
CFmMax = WFm.Range("B65536").End(xlUp).Row
WFm.Range("A1:G" & CFmMax).Sort _
Key1:=WFm.Range("A1"), _
Order1:=xlAscending, _
Header:=xlYes
End Sub
'伝票を削除
Sub Denpyyo_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 Wks
Application.DisplayAlerts = True
End Sub
' 課題2 A列のデータ全て削除
Sub No_Delete()
Dim WFm As Worksheet
Set WFm = Worksheets("main")
WFm.Columns("A:A").ClearContents
End Sub
'伝票の線を引く
Sub Denpyo_DrawLine()
Dim CFmMax As Long
CFmMax = ActiveSheet.Range("B65536").End(xlUp).Row
With Range("B16:K" & CFmMax).Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With Range("B16:K" & CFmMax).Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With Range("B16:K" & CFmMax).Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With Range("B16:K" & CFmMax).Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With Range("B16:K" & CFmMax).Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With Range("B16:K" & CFmMax).Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
End With
End Sub
'課題[1] プリンター設定のみ
'シート毎に設定すると手間がかかるので最初の型sheet(main1)にて印刷形式を設定
Sub Print_Set()
'印刷設定
With Worksheets("main1").PageSetup
.PrintArea = "B:K" '印刷範囲の設定
.Zoom = False '倍率をクリア
.FitToPagesWide = 1 '横方向に1ページに収める
.FitToPagesTall = 1 '縦方向に1ページに収める
.Orientation = xlPortrait '印刷:縦向き
.CenterHeader = "&B&A&20" '中央ヘッダーにsheet名と同じ名前を記載
.RightHeader = "&D" '右ヘッダーへ当日日付
.CenterFooter = "- " & "&P" & " -" 'フッターの設定
End With
'印刷プレビュー
'Worksheets("main1").PrintPreview
End Sub
Option Explicit
'全体処理
Sub Main()
Denpyyo_Delete
Print_Set
No_Add
Torihikisaki_Asccending_Order
Denpyo_Create
No_Asccending_Order
No_Delete
End Sub
'取引先毎に伝票作成
Sub Denpyo_Create()
Denpyyo_Delete
Dim WFm As Worksheet
Dim WTo As Worksheet
Dim CFm As Long
Dim CFmMax As Long
Dim CName As String
Dim CSum As Long
Dim Cnt As Long
Dim Dt As Date
Set WFm = Worksheets("main")
CFmMax = WFm.Range("B65536").End(xlUp).Row
Cnt = 16
For CFm = 2 To CFmMax
If CName <> WFm.Range("B" & CFm).Value Then
If CFm <> 2 Then
Denpyo_DrawLine
End If
Cnt = 16
CName = WFm.Range("B" & CFm).Value
Sheets("main1").Copy After:=Worksheets(Worksheets.Count)
Worksheets(Worksheets.Count).Name = CName
Set WTo = ActiveSheet
End If
WTo.Range("H" & Cnt).Value = WFm.Range("F" & CFm).Value
WTo.Range("E" & Cnt).Value = WFm.Range("D" & CFm).Value
WTo.Range("F" & Cnt).Value = WFm.Range("E" & CFm).Value
Dt = WFm.Range("C" & CFm).Value
'以下の日付変換部分は、format関数で書くのもよいです ogawa
WTo.Range("B" & Cnt).Value = Right(Year(Dt), 2)
WTo.Range("C" & Cnt).Value = Month(Dt)
WTo.Range("D" & Cnt).Value = Day(Dt)
CSum = WFm.Range("G" & CFm).Value
If CSum < 0 Then
WTo.Range("J" & Cnt).Value = CSum
Else
WTo.Range("I" & Cnt).Value = CSum
End If
WTo.Range("K" & Cnt).Value = WTo.Range("K" & Cnt - 1).Value + CSum
Cnt = Cnt + 1
Next
Denpyo_DrawLine
End Sub
'mainシートのNoを追加
Sub No_Add()
Dim WFm As Worksheet
Dim CFmMax As Long
Set WFm = Worksheets("main")
CFmMax = WFm.Range("B65536").End(xlUp).Row
WFm.Range("A1").Value = "No"
WFm.Range("A2").FormulaR1C1 = "1"
WFm.Range("A3").FormulaR1C1 = "2"
WFm.Range("A2:A3").AutoFill Destination:=WFm.Range("A2:A" & CFmMax) 'うまいですね!(^^* ogawa
End Sub
'取引先名称を昇順
'↓プロシージャ名、わかりやすくてよいです (^^ ogawa
Sub Torihikisaki_Asccending_Order()
Dim WFm As Worksheet
Dim CFmMax As Long
Set WFm = Worksheets("main")
CFmMax = WFm.Range("B65536").End(xlUp).Row '"B" & rows.count でもOK。 ogawa
'途中開業しているものはインデントを入れましょう。
'以下の要領。 ogawa
'WFm.Range("A1:G" & CFmMax).Sort _
' Key1:=WFm.Range("B1"), _
' Order1:=xlAscending, _
' Header:=xlYes
WFm.Range("A1:G" & CFmMax).Sort _
Key1:=WFm.Range("B1"), _
Order1:=xlAscending, _
Header:=xlYes
End Sub
'NOを昇順
Sub No_Asccending_Order()
Dim WFm As Worksheet
Dim CFmMax As Long
Set WFm = Worksheets("main")
CFmMax = WFm.Range("B65536").End(xlUp).Row
WFm.Range("A1:G" & CFmMax).Sort _
Key1:=WFm.Range("A1"), _
Order1:=xlAscending, _
Header:=xlYes
End Sub
'伝票を削除
Sub Denpyyo_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 Wks
Application.DisplayAlerts = True
End Sub
' 課題2 A列のデータ全て削除
Sub No_Delete()
Dim WFm As Worksheet
Set WFm = Worksheets("main")
WFm.Columns("A:A").ClearContents
End Sub
'伝票の線を引く
Sub Denpyo_DrawLine()
Dim CFmMax As Long
CFmMax = ActiveSheet.Range("B65536").End(xlUp).Row
'以下のような書き方もありです ogawa
With Range("B16:K" & CFmMax)
With .Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With .Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With .Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With .Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With .Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With .Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
End With
End With
' With Range("B16:K" & CFmMax).Borders(xlEdgeLeft)
' .LineStyle = xlContinuous
' .Weight = xlThin
' End With
' With Range("B16:K" & CFmMax).Borders(xlEdgeTop)
' .LineStyle = xlContinuous
' .Weight = xlThin
' End With
' With Range("B16:K" & CFmMax).Borders(xlEdgeBottom)
' .LineStyle = xlContinuous
' .Weight = xlThin
' End With
' With Range("B16:K" & CFmMax).Borders(xlEdgeRight)
' .LineStyle = xlContinuous
' .Weight = xlThin
' End With
' With Range("B16:K" & CFmMax).Borders(xlInsideVertical)
' .LineStyle = xlContinuous
' .Weight = xlThin
' End With
' With Range("B16:K" & CFmMax).Borders(xlInsideHorizontal)
' .LineStyle = xlContinuous
' .Weight = xlThin
' End With
End Sub
'課題[1] プリンター設定のみ
'シート毎に設定すると手間がかかるので最初の型sheet(main1)にて印刷形式を設定
Sub Print_Set()
'マクロでやってもよいですが、エクセルの表側の操作で予めこの設定は済ませておいてもよいです。
'どちらで行くかは状況次第です。プログラムを実行するまでどういう書式にするか確定していない場合はご提案の方法も良いと思います。 ogawa
'印刷設定
With Worksheets("main1").PageSetup
.PrintArea = "B:K" '印刷範囲の設定
.Zoom = False '倍率をクリア
.FitToPagesWide = 1 '横方向に1ページに収める
.FitToPagesTall = 1 '縦方向に1ページに収める
.Orientation = xlPortrait '印刷:縦向き
.CenterHeader = "&B&A&20" '中央ヘッダーにsheet名と同じ名前を記載
.RightHeader = "&D" '右ヘッダーへ当日日付
.CenterFooter = "- " & "&P" & " -" 'フッターの設定
End With
'印刷プレビュー
'Worksheets("main1").PrintPreview
End Sub
受講生さんの投稿
(投稿ID: 4855)
下記課題を提出します。添削のほどよろしくお願いいたします。
追記:
A列のデータを初期化するやり方はわかりましたが、課題1の印刷設定がいまいちわかりませんでした。
とりあえず、googleで調べながらヘッダーにシート名、ヘッダーに番号を挿入、といった設定をしました。
小川 慶一さんのコメント
(コメントID: 6808)
添削を返送します。
> A列のデータを初期化するやり方はわかりましたが、課題1の印刷設定がいまいちわかりませんでした。
> とりあえず、googleで調べながらヘッダーにシート名、ヘッダーに番号を挿入、といった設定をしました。
いただいたもので良いと思います。
あとは、自動記録しつつヘッダー・フッターをいじり、できあがったソースを見てみることです。
最初は生成されるコードの量に圧倒されますが、ほとんどいじらなかった場合は生成されたコードのほとんどの部分は不要です。ですので、不要そうな部分をコメントアウトして動作させて、としつつ動作確認していきます。
書き方不明な部分については、まずは自動記録してみるのが簡単かと思います。
それでも分からない場合は、生成されたコードを参照しつつ、コード内の気になるキーワードで google検索、ですね。
ひきつづき、学習お楽しみください☆
> 小川さん いつもお世話になっております。
>
> 下記課題を提出します。添削のほどよろしくお願いいたします。
>
> 追記:
> A列のデータを初期化するやり方はわかりましたが、課題1の印刷設定がいまいちわかりませんでした。
> とりあえず、googleで調べながらヘッダーにシート名、ヘッダーに番号を挿入、といった設定をしました。