パソコン仕事5倍塾
35,000人を指導した東大卒・元日本IBM社内講師が直伝
MENU
のんのんさんの投稿
(投稿ID: 4018)
Option Explicit Dim cmMax As Long Dim cCnt As Long Dim wMn As Worksheet Dim wMn1 As Worksheet Dim wNs As Worksheet Dim sRetsu As String Dim cNcnt As Long Dim cnMax As Long Sub CreateDenpyo() Call rowAnumbering sRetsu = "B" Call sorting ExeCreateDenpyo Worksheets("main").Select sRetsu = "A" sorting End Sub Sub rowAnumbering() Set wMn = Worksheets("main") cmMax = wMn.Range("B" & Rows.Count).End(xlUp).Row wMn.Range("A1").Value = "No." For cCnt = 2 To cmMax wMn.Range("A" & cCnt).Value = cCnt - 1 Next End Sub Sub sorting() Set wMn = Worksheets("main") cmMax = wMn.Range("B" & Rows.Count).End(xlUp).Row wMn.Sort.SortFields.Clear wMn.Sort.SortFields.Add Key:=Range(sRetsu & "2:" & sRetsu & cmMax), _ SortOn:=xlSortOnValues, _ Order:=xlAscending, _ DataOption:=xlSortNormal With wMn.Sort .SetRange Range("A1:G" & cmMax) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub Sub ExeCreateDenpyo() Call DeleteSheet Set wMn = Worksheets("main") cmMax = wMn.Range("B" & Rows.Count).End(xlUp).Row Set wMn1 = Worksheets("main1") For cCnt = 1 To cmMax If wMn.Range("B" & cCnt).Value <> wMn.Range("B" & cCnt + 1).Value And wMn.Range("B" & cCnt + 1).Value <> "" Then If cCnt <> 1 Then Call keisen End If wMn1.Copy After:=Sheets(2) ActiveSheet.Name = wMn.Range("B" & cCnt + 1).Value Set wNs = Worksheets(ActiveSheet.Name) cNcnt = 16 wNs.Range("B" & cNcnt).Value = Right(Year(wMn.Range("C" & cCnt + 1).Value), 2) wNs.Range("C" & cNcnt).Value = Month(wMn.Range("C" & cCnt + 1).Value) wNs.Range("D" & cNcnt).Value = Day(wMn.Range("C" & cCnt + 1).Value) wNs.Range("E" & cNcnt).Value = wMn.Range("D" & cCnt + 1).Value wNs.Range("F" & cNcnt).Value = wMn.Range("E" & cCnt + 1).Value wNs.Range("H" & cNcnt).Value = wMn.Range("F" & cCnt + 1).Value If wMn.Range("G" & cCnt + 1).Value > 0 Then wNs.Range("I" & cNcnt).Value = wMn.Range("G" & cCnt + 1).Value Else wNs.Range("J" & cNcnt).Value = wMn.Range("G" & cCnt + 1).Value End If wNs.Range("K" & cNcnt).Value = wNs.Range("I" & cNcnt).Value + wNs.Range("J" & cNcnt).Value cNcnt = cNcnt + 1 ElseIf wMn.Range("B" & cCnt).Value = wMn.Range("B" & cCnt + 1).Value And wMn.Range("B" & cCnt + 1).Value <> "" Then wNs.Range("B" & cNcnt).Value = Right(Year(wMn.Range("C" & cCnt + 1).Value), 2) wNs.Range("C" & cNcnt).Value = Month(wMn.Range("C" & cCnt + 1).Value) wNs.Range("D" & cNcnt).Value = Day(wMn.Range("C" & cCnt + 1).Value) wNs.Range("E" & cNcnt).Value = wMn.Range("D" & cCnt + 1).Value wNs.Range("F" & cNcnt).Value = wMn.Range("E" & cCnt + 1).Value wNs.Range("H" & cNcnt).Value = wMn.Range("F" & cCnt + 1).Value If wMn.Range("G" & cCnt + 1).Value > 0 Then wNs.Range("I" & cNcnt).Value = wMn.Range("G" & cCnt + 1).Value Else wNs.Range("J" & cNcnt).Value = wMn.Range("G" & cCnt + 1).Value End If wNs.Range("K" & cNcnt).Value = wNs.Range("I" & cNcnt).Value + wNs.Range("J" & cNcnt).Value + wNs.Range("K" & cNcnt - 1).Value cNcnt = cNcnt + 1 End If If cCnt = cmMax Then Call keisen End If Next End Sub Sub DeleteSheet() Application.DisplayAlerts = False For Each wNs In Worksheets If Left(wNs.Name, 4) <> "main" Then wNs.Delete End If Next Application.DisplayAlerts = True End Sub Sub keisen() cnMax = ActiveSheet.Range("B" & Rows.Count).End(xlUp).Row Range("B16:K" & cnMax).Borders.LineStyle = xlContinuous End Sub
小川慶一さんのコメント
(コメントID: 5579)
Option Explicit 'モジュールレベル変数は、変数宣言の回数を減らす目的で使うものではありません。 '複数プロシージャ間で値の引き渡しをしたいときだけに使います。 '個々のプロシージャ内で完結する処理では使うとメンテナンス性が落ちるためです。 '以下でそういう意味で本当に使っている意味があるのは、 sRetsuだけです。 '発展編1の「モジュールレベル変数」の項目を復習してください。 ogawa Dim cmMax As Long Dim cCnt As Long Dim wMn As Worksheet Dim wMn1 As Worksheet Dim wNs As Worksheet Dim sRetsu As String Dim cNcnt As Long Dim cnMax As Long Sub CreateDenpyo() Call rowAnumbering sRetsu = "B" Call sorting ExeCreateDenpyo Worksheets("main").Select sRetsu = "A" sorting End Sub Sub rowAnumbering() '↓Format関数の活用も検討してください。ogawa Set wMn = Worksheets("main") cmMax = wMn.Range("B" & Rows.Count).End(xlUp).Row wMn.Range("A1").Value = "No." For cCnt = 2 To cmMax wMn.Range("A" & cCnt).Value = cCnt - 1 Next End Sub Sub sorting() Set wMn = Worksheets("main") cmMax = wMn.Range("B" & Rows.Count).End(xlUp).Row wMn.Sort.SortFields.Clear wMn.Sort.SortFields.Add Key:=Range(sRetsu & "2:" & sRetsu & cmMax), _ SortOn:=xlSortOnValues, _ Order:=xlAscending, _ DataOption:=xlSortNormal With wMn.Sort .SetRange Range("A1:G" & cmMax) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub Sub ExeCreateDenpyo() Call DeleteSheet Set wMn = Worksheets("main") cmMax = wMn.Range("B" & Rows.Count).End(xlUp).Row Set wMn1 = Worksheets("main1") '「次の行と違ったら」という条件で、作業対象のセルを cCnt + 1 と表現するか。 '「前の行と違ったら」という条件で、作業対象のセルを cCnt と表現するか。 'というところが見本との違いですね。 '比較すると、提出いただいたプログラムは、記述が面倒なうえ、条件文が見本よりややこしいと感じます。ogawa For cCnt = 1 To cmMax If wMn.Range("B" & cCnt).Value <> wMn.Range("B" & cCnt + 1).Value And wMn.Range("B" & cCnt + 1).Value <> "" Then If cCnt <> 1 Then Call keisen End If wMn1.Copy After:=Sheets(2) ActiveSheet.Name = wMn.Range("B" & cCnt + 1).Value Set wNs = Worksheets(ActiveSheet.Name) cNcnt = 16 '以下は ElseIf 以下で書かれていることと重複している部分については2回書かないで済むような書き方を検討してください。 ogawa wNs.Range("B" & cNcnt).Value = Right(Year(wMn.Range("C" & cCnt + 1).Value), 2) wNs.Range("C" & cNcnt).Value = Month(wMn.Range("C" & cCnt + 1).Value) wNs.Range("D" & cNcnt).Value = Day(wMn.Range("C" & cCnt + 1).Value) wNs.Range("E" & cNcnt).Value = wMn.Range("D" & cCnt + 1).Value wNs.Range("F" & cNcnt).Value = wMn.Range("E" & cCnt + 1).Value wNs.Range("H" & cNcnt).Value = wMn.Range("F" & cCnt + 1).Value If wMn.Range("G" & cCnt + 1).Value > 0 Then wNs.Range("I" & cNcnt).Value = wMn.Range("G" & cCnt + 1).Value Else wNs.Range("J" & cNcnt).Value = wMn.Range("G" & cCnt + 1).Value End If wNs.Range("K" & cNcnt).Value = wNs.Range("I" & cNcnt).Value + wNs.Range("J" & cNcnt).Value cNcnt = cNcnt + 1 ElseIf wMn.Range("B" & cCnt).Value = wMn.Range("B" & cCnt + 1).Value And wMn.Range("B" & cCnt + 1).Value <> "" Then wNs.Range("B" & cNcnt).Value = Right(Year(wMn.Range("C" & cCnt + 1).Value), 2) wNs.Range("C" & cNcnt).Value = Month(wMn.Range("C" & cCnt + 1).Value) wNs.Range("D" & cNcnt).Value = Day(wMn.Range("C" & cCnt + 1).Value) wNs.Range("E" & cNcnt).Value = wMn.Range("D" & cCnt + 1).Value wNs.Range("F" & cNcnt).Value = wMn.Range("E" & cCnt + 1).Value wNs.Range("H" & cNcnt).Value = wMn.Range("F" & cCnt + 1).Value If wMn.Range("G" & cCnt + 1).Value > 0 Then wNs.Range("I" & cNcnt).Value = wMn.Range("G" & cCnt + 1).Value Else wNs.Range("J" & cNcnt).Value = wMn.Range("G" & cCnt + 1).Value End If wNs.Range("K" & cNcnt).Value = wNs.Range("I" & cNcnt).Value + wNs.Range("J" & cNcnt).Value + wNs.Range("K" & cNcnt - 1).Value cNcnt = cNcnt + 1 End If '↓ここでこの処理をするのと、見本のように、取引先が変わるときだけやるのとでは、どちらのほうがより効率的か? ' 例えば、取引先数30件、データ行数100,000だったとしたら? ' 見本のやり方なら30回で済みます。このプログラムでは、100,000回処理をすることになりますね。 ogawa If cCnt = cmMax Then Call keisen End If Next End Sub Sub DeleteSheet() Application.DisplayAlerts = False For Each wNs In Worksheets If Left(wNs.Name, 4) <> "main" Then wNs.Delete End If Next Application.DisplayAlerts = True End Sub Sub keisen() cnMax = ActiveSheet.Range("B" & Rows.Count).End(xlUp).Row Range("B16:K" & cnMax).Borders.LineStyle = xlContinuous End Sub
たった1ヶ月で人生が劇的に変わりました
佐藤信さん
役員クラスの方から高い評価を受けるようになりました。
佐賀県 - 岩本徹さん
今までまったく知らなかったショートカットキーを使いまくっています。
東京都 - 鷹觜慶さん
年齢60才間近、営業で外回りの時間が多い私でも退社時間が1-2時間程度早くなりました。
東京都 - 宗内隆明さん
受講前もすでにパソコン得意でしたが、そんな私でも受講して本当に良かったと思えた講座です。
東京都 - 佐伯とも子さん
ここまで包括的に仕事に役立つ深い学びを受けれた講座は初めてでした
東京都 - 飯田倫子さん
2024年05月01日 14:04
2024年04月30日 17:13
2024年04月27日 15:36
2024年04月25日 07:00
2024年04月23日 21:36
2024年05月01日 18:39
2024年05月01日 18:17
2024年05月01日 17:47
2024年05月01日 15:18
2024年05月01日 15:01
2022年02月24日 10:59
2019年12月23日 05:57
2019年09月20日 12:29
表示できる投稿はありません。
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
2022年02月02日 00:00
2022年02月02日 03:00
2022年02月02日 06:00
2022年02月02日 09:00
2022年02月02日 12:00
2024年02月15日 18:30
2024年02月09日 17:05
2024年01月19日 13:00
2023年12月31日 17:00
2023年12月21日 14:00
2024年05月03日 11:20
2024年05月02日 10:38
2024年05月02日 05:00
2024年05月01日 18:30
2024年04月27日 23:02
のんのんさんの投稿
(投稿ID: 4018)
伝票作成のマクロ作ってみました。
添削よろしくお願いします☆
小川慶一さんのコメント
(コメントID: 5579)
添削を返送します。
コメントを参考にして再度挑戦してください。
> こんにちは。
> 伝票作成のマクロ作ってみました。
> 添削よろしくお願いします☆