Option Explicit
Public Sub CreateDenpyo()
WriteNum
Sort_By_Torihikisaki
ExeCreateDenpyo
Sort_By_No
End Sub
Private Sub ExeCreateDenpyo()
Denpyosakujo ''ここで伝票削除プロシージャの呼び出し
Dim num As Long
Dim gyo As Long
Dim saki As Long
Dim wFr As Worksheet
Set wFr = Worksheets("main")
Dim wFr1 As Worksheet
Set wFr1 = Worksheets("main1")
Dim wTo As Worksheet
Dim namae As String
Dim ws As Worksheet
Dim dt As Date
For gyo = 2 To wFr.Range("B" & Rows.Count).End(xlUp).Row
If wFr.Range("B" & gyo).Value <> namae Then
If gyo > 2 Then
Keisen
End If
namae = wFr.Range("B" & gyo).Value
wFr1.Copy After:=Sheets(2)
Set wTo = ActiveSheet
wTo.Range("H2").Value = namae
wTo.Name = namae
saki = 16
End If
wTo.Range("E" & saki).Value = wFr.Range("D" & gyo).Value
wTo.Range("F" & saki).Value = wFr.Range("E" & gyo).Value
wTo.Range("H" & saki).Value = wFr.Range("F" & gyo).Value
If wFr.Range("G" & gyo).Value > 0 Then
wTo.Range("I" & saki).Value = wFr.Range("G" & gyo).Value ''借方・貸方の入力先が逆でしたので訂正しました
Else
wTo.Range("J" & saki).Value = wFr.Range("G" & gyo).Value
End If
If gyo = 16 Then
wTo.Range("K" & saki).Value = wFr.Range("G" & gyo).Value
Else
wTo.Range("K" & saki).Value = wFr.Range("G" & gyo).Value + wTo.Range("K" & saki).Offset(-1).Value 'ひとつのセルの指定では ("行" & 変数) と .offset( ) の両方を使うよりどちらかだけにしたほうがよいです。
End If
dt = wFr.Range("C" & gyo).Value
wTo.Range("B" & saki).Value = Right(Year(dt), 2) '’日付の変数を作成しました
wTo.Range("C" & saki).Value = Month(dt)
wTo.Range("D" & saki).Value = Day(dt)
saki = saki + 1
Next
Keisen
wFr.Activate
End Sub
Public Sub Denpyosakujo()
Dim w As Worksheet
Application.DisplayAlerts = False
For Each w In Worksheets
If Left(w.Name, 4) <> "main" Then
w.Delete
End If
Next
Application.DisplayAlerts = True
End Sub
Private Sub WriteNum()
Dim ln As Long
Dim lnMx As Long
Range("A1").Value = "No."
lnMx = Range("B" & Rows.Count).End(xlUp).Row
For ln = 2 To lnMx
Range("A" & ln).Value = ln - 1
Next
End Sub
Private Sub Sort_By_Torihikisaki()
'↓データ件数が可変でも動作するように修正しましょう
Range("A1:G317").Sort Key1:=Range("B1"), Order1:=xlAscending, Header:=xlYes
End Sub
Private Sub Sort_By_No()
'↓データ件数が可変でも動作するように修正しましょう
Range("A1:G317").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes
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 = xlDot
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With .Borders(xlInsideHorizontal)
.LineStyle = xlDot
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
End With
End Sub
Option Explicit
Public Sub CreateDenpyo()
WriteNum
Sort_By_Torihikisaki
ExeCreateDenpyo
Sort_By_No
End Sub
Private Sub ExeCreateDenpyo()
Denpyosakujo ''ここで伝票削除プロシージャの呼び出し
Dim num As Long
Dim gyo As Long
Dim saki As Long
Dim wFr As Worksheet
Set wFr = Worksheets("main")
Dim wFr1 As Worksheet
Set wFr1 = Worksheets("main1")
Dim wTo As Worksheet
Dim namae As String
Dim ws As Worksheet
Dim dt As Date
For gyo = 2 To wFr.Range("B" & Rows.Count).End(xlUp).Row
If wFr.Range("B" & gyo).Value <> namae Then
If gyo > 2 Then
Keisen
End If
namae = wFr.Range("B" & gyo).Value
wFr1.Copy After:=Sheets(2)
Set wTo = ActiveSheet
wTo.Range("H2").Value = namae
wTo.Name = namae
saki = 16
End If
wTo.Range("E" & saki).Value = wFr.Range("D" & gyo).Value
wTo.Range("F" & saki).Value = wFr.Range("E" & gyo).Value
wTo.Range("H" & saki).Value = wFr.Range("F" & gyo).Value
If wFr.Range("G" & gyo).Value > 0 Then
wTo.Range("I" & saki).Value = wFr.Range("G" & gyo).Value ''借方・貸方の入力先が逆でしたので訂正しました
Else
wTo.Range("J" & saki).Value = wFr.Range("G" & gyo).Value
End If
If gyo = 16 Then
wTo.Range("K" & saki).Value = wFr.Range("G" & gyo).Value
Else
wTo.Range("K" & saki).Value = wFr.Range("G" & gyo).Value + wTo.Range("K" & saki-1).Value 'ひとつのセルの指定では ("行" & 変数) と .offset( ) の両方を使うよりどちらかだけにしたほうがよいです。
End If
dt = wFr.Range("C" & gyo).Value
wTo.Range("B" & saki).Value = Right(Year(dt), 2) '’日付の変数を作成しました
wTo.Range("C" & saki).Value = Month(dt)
wTo.Range("D" & saki).Value = Day(dt)
saki = saki + 1
Next
Keisen
wFr.Activate
End Sub
Public Sub Denpyosakujo()
Dim w As Worksheet
Application.DisplayAlerts = False
For Each w In Worksheets
If Left(w.Name, 4) <> "main" Then
w.Delete
End If
Next
Application.DisplayAlerts = True
End Sub
Private Sub WriteNum()
Dim ln As Long
Dim lnMx As Long
Range("A1").Value = "No."
lnMx = Range("B" & Rows.Count).End(xlUp).Row
For ln = 2 To lnMx
Range("A" & ln).Value = ln - 1
Next
End Sub
Private Sub Sort_By_Torihikisaki()
''↓データ件数が可変でも動作するように修正しました
Dim lnMx As Long
lnMx = Range("B" & Rows.Count).End(xlUp).Row
Range("A1:G"& lnMx).Sort Key1:=Range("B1"), Order1:=xlAscending, Header:=xlYes
End Sub
Private Sub Sort_By_No()
''↓データ件数が可変でも動作するように修正しました
Dim lnMx As Long
lnMx = Range("B" & Rows.Count).End(xlUp).Row
Range("A1:G"& lnMx).Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes
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 = xlDot
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With .Borders(xlInsideHorizontal)
.LineStyle = xlDot
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
End With
End Sub
szさんの投稿
(投稿ID: 4890) 添付ファイルのダウンロード権限がありません
宿題を提出いたします。
添削の方を宜しくお願い致します。
マクロ記録やステップインして確認して作成しました。
伝票作成ボタン等を作成する際に、気になったのがフォームコントロールとActiveXコントロールの違いです。
今回は、フォームコントロールボタンを使いました。
こちらのボタンの方がいい等ありましたら、ご教授お願いしたいです。よろしくお願いいたします。
小川慶一さんのコメント
(コメントID: 6848)
こんにちは。
いくつかコメントを入れました。
まずは返送します。
他にも議論すべき点はありますが、まずは、以下にあるコメントを参考のうえ、講座で説明している見本との比較をご自身でしてください。
講座で説明しているものとは異なる手法を使ったものについては、再提出時は、以下を述べてください。
[a] その手法をあえて取ることのメリットは何か
[b] その手法をあえて取ることのデメリットは何か
[c] なぜあえてその手法を取ったのか
たとえば denpyosakusei の中で Denpyosakujo を呼び出さないことについてならば、以下のような感じでしょうか。
[a]
「他のプロシージャを呼び出す」という、より高度な技術を用いないで済む。
書くことが減って、コーディングが楽。
[b]
伝票作成ボタンを2回連続で押したとき、2回目はエラーで停止する。なので、利用者には、「伝票がすでにある場合は、先に『伝票削除』ボタンを押してください」と案内しなくてはならない。
エラーで停止すると「main1 (2)」という名前のシートがゴミとして残るので、手動で削除する手間が発生する。
動作テストのときにもやることがひと手間多く、いちいち面倒。
[c]
([a], [b]比較のうえ、あえてこのやり方で行こうと決めた理由を述べる)
これをやると、よい学びになりますよ。
szさんのコメント
(コメントID: 6850) 添付ファイルのダウンロード権限がありません
見本と自分のコードを比較し修正しました。
そしてメリットデメリットについて考えてみました。
【罫線を別プロシージャにしていなたっか点】
[1-1]&[1-2]
[a]先生の言われる通り、高度なマクロの手法を使わなくても書くことが減って楽だった。
[b]コードの流れが掴みにくく、メンテナンス性が悪い。
[c]あえてこの手法を使ったのではなく、手法を学んでいたものの「とりあえず動く」のを確認した時点で満足してしまい、別プロシージャにした方がいいかもという思いに至らなかった。
【if文内で重複処理していた点】
[2-1]&[2-2]
[a]if文の中で同じコードは必要ないのでメリットはないです。繰り返し作業ということに気付けていなかったです。
[b]コードの流れが掴みにくく、メンテナンス性が悪い。余分なコードを読む必要があるので処理時間が長くなる。
[c]あえてこの手法をとったのではなく、別プロシージャにできるコードも放置していたために、自分自身コードが読みにくかったんだと思います。なぜこうしたのか、今となっては疑問です。
メリットデメリットを比較すると、自分の書いたコードがいかにお粗末なものかがよく分かりました。
プログラミング技術の習得は「分離可能なものをより分離していくもの」でしたね。
分離できるところはないか、という視点で振り返ってみる視点が欠けていました。
小川慶一さんのコメント
(コメントID: 6849)
だいぶ良くなったと思います。
コメントを返送します。
自分で書いて、自分で検討すると、よく学べます☆
szさんのコメント
(コメントID: 6851)
>'ひとつのセルの指定では ("行" & 変数) と .offset( ) の両方を使うよりどちらかだけにしたほうがよいです。
こちらについてですが、どちらかだけにした方が良いのはどうしてなのか分かりません。動作に支障がでるのでしょうか?
小川慶一さんのコメント
(コメントID: 6852)
> >'ひとつのセルの指定では ("行" & 変数) と .offset( ) の両方を使うよりどちらかだけにしたほうがよいです。
> こちらについてですが、どちらかだけにした方が良いのはどうしてなのか分かりません。動作に支障がでるのでしょうか?
動作への支障はないです。
以下ソースコードの[A], [B]を読み比べてみてください。どちらのほうが、より目移りせずに値入力先のセルを見いだせるでしょうか。
また、メンテナンス性についてはどうでしょうか。
発想としては、エクセルワークシート関数とマクロを組み合わせるより、マクロだけのほうがよい。
アクセスとエクセルを組み合わせるより、エクセルだけのほうがよい。
といったことと同様です。同じことを実現するのであれば、ひとつの技術だけで済ませたほうが良いです。
その理由は、使う技術が少ないほうが、集中を向けるべき事項が減ること、メンテナンス性が高いことです。
DPRで言うと、「P」をシンプルにするということです。
https://www.exvba.com/dpr.php
受講生さんのコメント
(コメントID: 6853)
メンテナンス性も高くなると、なるほど。
ありがとうございます。
小川慶一さんのコメント
(コメントID: 6855)
考え方の基本は、やはり、DPRです。
「Pの最適化」ですね。
慣れてくると自然にいろいろと気づけるようにもなるかと思います。