Option Explicit
Public Sub Denpyo_Sakusei() '「伝票作成」ボタンに割り当て
No_Saiban
Sort_Torihikisaki
Denpyo_Copy
Sort_No
MsgBox "完了しました。"
End Sub
Public Sub Denpyo_Sakujo() '「伝票削除」ボタンに割り当て
Sheet_Sakujo
MsgBox "削除しました。"
End Sub
Private Sub Denpyo_Copy()
Sheet_Sakujo
Dim wsFm As Worksheet
Dim wsTo As Worksheet
Dim st As String
Dim lnFm As Long
Dim lnFmMx As Long
Dim lnTo As Long
Dim dt As Date
Set wsFm = Worksheets("main")
lnFmMx = wsFm.Range("B" & Rows.Count).End(xlUp).Row
For lnFm = 2 To lnFmMx
If st <> wsFm.Range("B" & lnFm).Value Then
If lnFm > 2 Then
keisen
End If
st = wsFm.Range("B" & lnFm).Value
Sheets("main1").Copy After:=Sheets(2)
Set wsTo = Worksheets("main1 (2)")
wsTo.Name = st
lnTo = 16
End If
dt = wsFm.Range("C" & lnFm).Value
wsTo.Range("B" & lnTo).Value = Format(dt, "yy")
wsTo.Range("C" & lnTo).Value = Format(dt, "mm")
wsTo.Range("D" & lnTo).Value = Format(dt, "dd")
wsTo.Range("E" & lnTo).Value = wsFm.Range("D" & lnFm).Value
wsTo.Range("F" & lnTo).Value = wsFm.Range("E" & lnFm).Value
wsTo.Range("H" & lnTo).Value = wsFm.Range("F" & lnFm).Value
If wsFm.Range("G" & lnFm).Value > 0 Then
wsTo.Range("I" & lnTo).Value = wsFm.Range("G" & lnFm).Value
Else
wsTo.Range("J" & lnTo).Value = wsFm.Range("G" & lnFm).Value
End If
If lnTo = 16 Then
wsTo.Range("K" & lnTo).Value = wsFm.Range("G" & lnFm).Value
Else
wsTo.Range("K" & lnTo).Value = wsTo.Range("K" & lnTo - 1).Value + wsFm.Range("G" & lnFm).Value
End If
lnTo = lnTo + 1
Next
keisen
wsFm.Activate
End Sub
Public Sub Sheet_Sakujo()
Dim ws As Worksheet
Application.DisplayAlerts = False
For Each ws In Worksheets
If Left(ws.Name, 4) <> "main" Then
ws.Delete
End If
Next
Application.DisplayAlerts = True
End Sub
Private Sub No_Saiban()
Dim ln As Long
Dim lnMx As Long
lnMx = Range("B" & Rows.Count).End(xlUp).Row
Range("A1").Value = "No."
For ln = 2 To lnMx
Range("A" & ln).Value = ln
Next
End Sub
Private Sub Sort_Torihikisaki()
ActiveWorkbook.Worksheets("main").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("main").Sort.SortFields.Add _
Key:=Range("B2:B317"), _
SortOn:=xlSortOnValues, _
Order:=xlAscending, _
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("main").Sort
.SetRange Range("A1:G317")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Private Sub Sort_No()
ActiveWorkbook.Worksheets("main").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("main").Sort.SortFields.Add _
Key:=Range("A2:A317"), _
SortOn:=xlSortOnValues, _
Order:=xlAscending, _
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("main").Sort
.SetRange Range("A1:G317")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
Range("A1").Select
End Sub
Private Sub keisen()
Dim lnMx As Long
lnMx = Range("B" & Rows.Count).End(xlUp).Row
With Range("B16:K" & lnMx + 1)
.Borders(xlDiagonalDown).LineStyle = xlNone
.Borders(xlDiagonalUp).LineStyle = xlNone
With .Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With .Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With .Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With .Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With .Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With .Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlHairline
End With
End With
End Sub
受講生さんの投稿
(投稿ID: 4982)
何も見ずにやって2時間半掛かりました。
フィードバックを宜しくお願いいたします。
小川 慶一さんのコメント
(コメントID: 7081)
提出物を確認しました。
とても良くかけていると思います。特に指摘したい点はありません。
まずはお聞きしたいのですが、2時間半かかった理由はどういうところにありそうでしょうか。
そして、どのようにすればそこを短縮できそうでしょうか。
3項目程度挙げていただければと思います。
受講生さんのコメント
(コメントID: 7092)
フィードバックありがとうございます。
作成した時のことを振り返ってみました。
反省点として以下を挙げます。
①見直しに時間を使った
マクロ自体は2時間くらいで仕上がっており、その後動作確認や見直しを行ないました。
テストしながら作成したので、マクロの修正はありませんでした。
細かなところ(変数やサブプロシージャのネーミング、行を空けて見やすくする等)に拘って、時間を使ってしまいました。
課題は「きちんと動くものを作ること」なので、これを意識していればもっと早く終わったと思います。
②考えると手が止まってしまう
頭の中で考えてからアウトプットしていました。
ショートカット講座や実務を通じて、以前より手が動くようになりましたが、量稽古が足りていないと思います。
もう一度基礎編の演習に取り組んでみます。
③手順が細分化できていない
スタート→ゴールに至るまでの手順が大雑把であったため、途中で手順の追加や見直しが発生しました。
最初に考えた手順を更に細分化していれば、想定外の事態を避けられたのではないかと思います。
小川 慶一さんのコメント
(コメントID: 7093)
こんばんは。
投稿ありがとうございます。
> ①見直しに時間を使った
良いことだと思います。
> ②考えると手が止まってしまう
考えることに集中すること自体は悪いことではないです。
> ③手順が細分化できていない
> スタート→ゴールに至るまでの手順が大雑把であったため、途中で手順の追加や見直しが発生しました。
これは、慣れですね。
まだ手についてない技術があるということです。もう2-3回同じ課題に連続して取り組むと、課題を見た瞬間に見えるやるべきことの全体像の解像度があがることかと思います。
試しに、騙されたと思って、この課題を連続で3回くらい書ききってみてください。それから、「スタート→ゴールに至るまでの手順」を思い浮かべてみてください。きっと、その鮮明さにご自身で驚かれることと思います。
完成品のクオリティが高いので、そこは安心です。
ぜひ、やってみてください。それから、もし気が向いたならば、やってみた感想をまた投稿してください。
受講生さんのコメント
(コメントID: 7104)
フィードバック、ありがとうございます。
課題を3回やってみました。
1回目はシートコピー&データ転記のマクロが書き終わったあたりで
迷いましたが、2・3回目は手順や書いているマクロの動作がしっかりと
イメージできました。
また、元データの採番やソートのマクロを作った時に、元に戻すマクロも
ついでに作るなどして、手際良く進められました。
完成までに要した時間は、1回目→90分、2回目→70分、3回目→50分です。
楽しみながら集中力も鍛えられて良かったです。
ありがとうございます。
小川 慶一さんのコメント
(コメントID: 7105)
おはようございます。
> 2・3回目は手順や書いているマクロの動作がしっかりとイメージできました。
> 完成までに要した時間は、1回目→90分、2回目→70分、3回目→50分です。
> 楽しみながら集中力も鍛えられて良かったです。
よいですね。
集中力がついた感じと同時に、書き上げるのに必要な集中力の水準がどんどん下がっていったことも感じられたのではないでしょうか。
あるマクロを書き上げるのに必要な集中力のレベルが下がると、その分、そのパターンを応用していろいろなことをできるようになります。
> 元に戻すマクロもついでに作るなどして、手際良く進められました。
↑これなどは、まさにその顕れですね。
実は、この「伝票作成」の課題だけでなく、ご提供している演習は、すべて、こういう感じでやっていただきたいのです。
楽に書き上げられるマクロのレパートリーが増えれば増えるほど、現場でエクセルファイルを見るたびにつぎつぎとアイデアが沸いてどんどんマクロを書けるようになります。
「『試行錯誤しながらの2時間半』だけでモヤモヤした感想だけを抱いたまま知識だけを追い求める」か、「全体像を感じながら課題をサラサラと解けるようになる楽しみを味わいつつ学び続ける」かで、得られる成果は大きく変わります。
ぜひ、今回得られたその感覚を活かして、他の演習も楽しみつつとりくんでみてください。
この「伝票作成」の課題も、全体のプロセスで改善できそうな点があるようでしたら、まだまだ所要時間つめられると思います。
いけるところまで行ってみてください☆