Sub deleteDenpyo()
Dim ws As Worksheet
Application.DisplayAlerts = False
For Each ws In Worksheets
If ws.Name <> "main" And ws.Name <> "main1" Then
ws.Delete
End If
Next
Application.DisplayAlerts = True
End Sub
Sub createDenpyo()
deleteDenpyo
Dim wFm As Worksheet
Dim wTo As Worksheet
Set wFm = Worksheets("main")
'日付の昇順に番号振る
Dim gyoMax As Long
gyoMax = wFm.Range("B" & Rows.Count).End(xlUp).Row
Dim gyo As Long
For gyo = 2 To gyoMax
wFm.Range("A" & gyo).Value = gyo - 1
Next
'B列ソート
wFm.Range("A2:G317").Sort Key1:=wFm.Range("B1"), Order1:=xlAscending, Header:=xlYes
'伝票作成
Dim gyoTo As Long
For gyo = 2 To gyoMax
'取引先名称が違えばシートを作る
If wFm.Range("B" & gyo).Value <> wFm.Range("B" & gyo - 1).Value Then
If ActiveSheet.Name <> "main" Then
keisen
End If
Sheets("main1").Copy After:=Sheets(2)
Set wTo = Sheets("main1 (2)")
wTo.Name = wFm.Range("B" & gyo).Value
gyoTo = 16
End If
'シートを作成後、データを投入していく
wTo.Range("B" & gyoTo).Value = Mid(Year(wFm.Range("C" & gyo).Value), 3)
wTo.Range("C" & gyoTo).Value = Month(wFm.Range("C" & gyo).Value)
wTo.Range("D" & gyoTo).Value = Day(wFm.Range("C" & gyo).Value)
wTo.Range("E" & gyoTo).Value = wFm.Range("D" & gyo).Value
wTo.Range("F" & gyoTo).Value = wFm.Range("E" & gyo).Value
wTo.Range("H" & gyoTo).Value = wFm.Range("F" & gyo).Value
If wFm.Range("G" & gyo).Value > 0 Then
wTo.Range("I" & gyoTo).Value = wFm.Range("G" & gyo).Value
Else
wTo.Range("J" & gyoTo).Value = wFm.Range("G" & gyo).Value
End If
If gyoTo = 16 Then
wTo.Range("K" & gyoTo).Value = wTo.Range("I" & gyoTo).Value + wTo.Range("J" & gyoTo).Value
Else
wTo.Range("K" & gyoTo).Value = wTo.Range("K" & gyoTo - 1).Value + wTo.Range("I" & gyoTo).Value + wTo.Range("J" & gyoTo).Value
End If
gyoTo = gyoTo + 1
Next
keisen
End Sub
Sub keisen()
Dim gyoToMax
gyoToMax = Range("B" & Rows.Count).End(xlUp).Row
Range("B16:K" & gyoToMax).Select
With Range("B16:K" & gyoToMax)
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 = xlHairline
End With
With .Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlHairline
End With
End With
End Sub
For Next構文のアレンジとして、「初回だったらスキップ」、「ループを抜けた直後に追加処理」というのはよく使います。今後に向けて参考にしてください。 次の機会に活かしてください。
並べ替えのところのミスがやや痛い!しかしあとはとてもよくできています。
'並べ替えのところが惜しい!(後述)
'しかし、全体に、とてもよく書けています。センスのよさがうかがえます v(^^* ogawa
Sub deleteDenpyo()
Dim ws As Worksheet
Application.DisplayAlerts = False
For Each ws In Worksheets
If ws.Name <> "main" And ws.Name <> "main1" Then
ws.Delete
End If
Next
Application.DisplayAlerts = True
End Sub
Sub createDenpyo()
deleteDenpyo
Dim wFm As Worksheet
Dim wTo As Worksheet
Set wFm = Worksheets("main")
'日付の昇順に番号振る
Dim gyoMax As Long
gyoMax = wFm.Range("B" & Rows.Count).End(xlUp).Row
'Autofillを使えないか?検討してみてください。 ogawa
Dim gyo As Long
For gyo = 2 To gyoMax
wFm.Range("A" & gyo).Value = gyo - 1
Next
'B列ソート
'以下はも題です。2行目から317行目で header:=xlyes だと、並べ替えされる範囲は、3行目から317行目です。
'並べ替えする範囲はA1:G317とするか、header:=xlno とするかでないと。
'(いただいたコード内容だと動作確認時にエラーで止まるはずなので、投稿前に気づくはずなのですが。。)
wFm.Range("A2:G317").Sort Key1:=wFm.Range("B1"), Order1:=xlAscending, Header:=xlYes
'伝票作成
Dim gyoTo As Long
For gyo = 2 To gyoMax
'取引先名称が違えばシートを作る
If wFm.Range("B" & gyo).Value <> wFm.Range("B" & gyo - 1).Value Then
If ActiveSheet.Name <> "main" Then
keisen
End If
Sheets("main1").Copy After:=Sheets(2)
Set wTo = Sheets("main1 (2)")
wTo.Name = wFm.Range("B" & gyo).Value
gyoTo = 16
End If
'シートを作成後、データを投入していく
wTo.Range("B" & gyoTo).Value = Mid(Year(wFm.Range("C" & gyo).Value), 3)
wTo.Range("C" & gyoTo).Value = Month(wFm.Range("C" & gyo).Value)
wTo.Range("D" & gyoTo).Value = Day(wFm.Range("C" & gyo).Value)
wTo.Range("E" & gyoTo).Value = wFm.Range("D" & gyo).Value
wTo.Range("F" & gyoTo).Value = wFm.Range("E" & gyo).Value
wTo.Range("H" & gyoTo).Value = wFm.Range("F" & gyo).Value
If wFm.Range("G" & gyo).Value > 0 Then
wTo.Range("I" & gyoTo).Value = wFm.Range("G" & gyo).Value
Else
wTo.Range("J" & gyoTo).Value = wFm.Range("G" & gyo).Value
End If
If gyoTo = 16 Then
wTo.Range("K" & gyoTo).Value = wTo.Range("I" & gyoTo).Value + wTo.Range("J" & gyoTo).Value
Else
wTo.Range("K" & gyoTo).Value = wTo.Range("K" & gyoTo - 1).Value + wTo.Range("I" & gyoTo).Value + wTo.Range("J" & gyoTo).Value
End If
gyoTo = gyoTo + 1
Next
keisen 'インデント位置注意。細かいですが。一段深すぎかと ogawa
End Sub
Sub keisen()
Dim gyoToMax
gyoToMax = Range("B" & Rows.Count).End(xlUp).Row
Range("B16:K" & gyoToMax).Select '←これなくても動きます。selectは基本排除。 ogawa
'↓エクセレント。美しいです。よく書けていますね v(^^* ogawa
With Range("B16:K" & gyoToMax)
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 = xlHairline
End With
With .Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlHairline
End With
End With
End Sub
'初回かどうかを判定するための変数をひとつ作り、初回にその値を変えます。元の値のままなら初回と判定。値が変わっていたら2回目と判定。こういうときは、変数はBoolean型で宣言します。True/Falseで判定することになります。
Sub hoge()
Dim b As Boolean '[*1]の条件分岐用。[*]1にはじめて来たときはFalse,2回目以降のときは[*2]を通ったあとなので、Trueが入っていることになる。
Dim c As Long
b = False 'Boolean型の変数の初期値はFalseだからこの行は無くても可。
For c = 2 To 317
If 今調べている行と直前の行でセルに入っている値が違ったら Then
If b = True Then '[*1]この条件分岐にはじめて来るときは b の値は False。2回目以降は[*2]を通ったあとなのでTrueです。
罫線を引く処理
Else
b = True '[*2]初回のみここに来る。変数bの値をFalseからTrueに変える。
End If
新規シート作成
新規作成したシートのシート名編集
データ転記先行を指定する変数の値を16行目にする
End If
データ転記
データ転記先行を指定する変数の値を1増やす
Next
罫線を引く処理
End Sub
Sub hoge_new()
Dim bShokai As Boolean '初回かどうかの判定用。[*1]に来たとき、はじめて来たときは True ,2回目以降のときは[*2]を通ったあとなので、 False が入っていることになる。
Dim c As Long
bShokai = True
For c = 2 To 317
If 今調べている行と直前の行でセルに入っている値が違ったら Then
If bShokai = True Then '[*1]初回だったら
bShokai = False '[*2]変数bShokaiの値を True から False に変える。初回のみここに来る。
Else
'ここに来たということは初回ではないということ。
罫線を引く処理
End If
新規シート作成
新規作成したシートのシート名編集
データ転記先行を指定する変数の値を16行目にする
End If
データ転記
データ転記先行を指定する変数の値を1増やす
Next
罫線を引く処理
End Sub
Sub hoge_new()
> Dim bShokai As Boolean '初回かどうかの判定用。[*1]に来たとき、はじめて来たときは True ,2回目以降のときは[*2]を通ったあとなので、 False が入っていることになる。
> Dim c As Long
>
> bShokai = True
>
> For c = 2 To 317
>
> If 今調べている行と直前の行でセルに入っている値が違ったら Then
>
> If bShokai = True Then '[*1]初回だったら
> bShokai = False '[*2]変数bShokaiの値を True から False に変える。初回のみここに来る。
> Else
> 'ここに来たということは初回ではないということ。
> 罫線を引く処理
> End If
>
> 新規シート作成
> 新規作成したシートのシート名編集
> データ転記先行を指定する変数の値を16行目にする
> End If
>
> データ転記
> データ転記先行を指定する変数の値を1増やす
>
> Next
>
> 罫線を引く処理
>End Sub
受講生さんの投稿
(投稿ID: 1917)
昨年12月から受講開始した発展編の視聴が一通り終了しましたので、
年明けからフォローアップメールセミナーの伝票作成マクロに取り掛かってきました。
発展編での学びを定着させるのにとても勉強になっております。
実務の方でも非常に役に立っており、大変感謝致しております。
この伝票作成マクロの動画を通じて、withブロックの中身を置換でシンプルに修正する方法が
大変参考になりました。
またテスト時のブレークポイントの設定についても良い復習となり、
実務の方で活かしていきたいと実感しました。
以下に宿題を投稿させて頂きます。
先生の動画を視聴した直後に作成しましたので、殆ど先生のコードと違わないとは思いますが、
いざ自分で作ってみるとなると、罫線を引くタイミングが難しくて、
特にmainシートに罫線が引かれてしまう時の回避策がどうしても思いつかず、
単純に、”シート名がmainでなければ”、という表現となってしまいましたが・・・(・∀・;)
よろしくお願いいたします。
ゲストさんのコメント
(コメントID: 3293)
投稿ありがとうございます。全体にとてもよく書けていると思います。
>いざ自分で作ってみるとなると、罫線を引くタイミングが難しくて、
>特にmainシートに罫線が引かれてしまう時の回避策がどうしても思いつかず、
>単純に、”シート名がmainでなければ”、という表現となってしまいましたが・・・(・∀・;)
↑それでもよいですが、「初回でなければ」という考え方でもよいです。では、初回かどうかを判定するには?→答え:「For Next構文の変数の値がカウンターの最初の値だったら」てことです。
For Next構文のアレンジとして、「初回だったらスキップ」、「ループを抜けた直後に追加処理」というのはよく使います。今後に向けて参考にしてください。
次の機会に活かしてください。
並べ替えのところのミスがやや痛い!しかしあとはとてもよくできています。
>小川先生、いつも大変お世話になっております。
>
>昨年12月から受講開始した発展編の視聴が一通り終了しましたので、
>年明けからフォローアップメールセミナーの伝票作成マクロに取り掛かってきました。
>発展編での学びを定着させるのにとても勉強になっております。
>実務の方でも非常に役に立っており、大変感謝致しております。
>
>この伝票作成マクロの動画を通じて、withブロックの中身を置換でシンプルに修正する方法が
>大変参考になりました。
>またテスト時のブレークポイントの設定についても良い復習となり、
>実務の方で活かしていきたいと実感しました。
>
>以下に宿題を投稿させて頂きます。
>先生の動画を視聴した直後に作成しましたので、殆ど先生のコードと違わないとは思いますが、
>いざ自分で作ってみるとなると、罫線を引くタイミングが難しくて、
>特にmainシートに罫線が引かれてしまう時の回避策がどうしても思いつかず、
>単純に、”シート名がmainでなければ”、という表現となってしまいましたが・・・(・∀・;)
>よろしくお願いいたします。
受講生さんのコメント
(コメントID: 3300)
罫線を引くタイミングにつきまして、
>「初回でなければ」という考え方でもよいです。では、初回かどうかを判定するには?→答え:「For Next構文の変数の値がカウンターの最初の値だったら」てことです。
>For Next構文のアレンジとして、「初回だったらスキップ」、「ループを抜けた直後に追加処理」というのはよく使います。今後に向けて参考にしてください。
大変勉強になりました!「初回でなければ」という意味での
If gyo<2 Then
keisen
だったのですね(・∀・)!!まったく閃きませんでした。
何故3行目以降なら罫線設定なのかということにばかりとらわれておりました。
大変スッキリ致しました☆次の宿題作成のときにきちんと理解して書けそうです。
他にも細やかなご指導ありがとうございました。今後の参考となりました。
他の受講生さんの投稿等も参考にして、スッキリしたシンプルなコードが書けるように励みたいと思います(・∀・)
それでは失礼いたします。
小川慶一 さん:
>受講生 さん:
>
>投稿ありがとうございます。全体にとてもよく書けていると思います。
>
>>いざ自分で作ってみるとなると、罫線を引くタイミングが難しくて、
>>特にmainシートに罫線が引かれてしまう時の回避策がどうしても思いつかず、
>>単純に、”シート名がmainでなければ”、という表現となってしまいましたが・・・(・∀・;)
>
>↑それでもよいですが、「初回でなければ」という考え方でもよいです。では、初回かどうかを判定するには?→答え:「For Next構文の変数の値がカウンターの最初の値だったら」てことです。
>
>For Next構文のアレンジとして、「初回だったらスキップ」、「ループを抜けた直後に追加処理」というのはよく使います。今後に向けて参考にしてください。
>次の機会に活かしてください。
>
>並べ替えのところのミスがやや痛い!しかしあとはとてもよくできています。
>
>
>
>
>
>>小川先生、いつも大変お世話になっております。
>>
>>昨年12月から受講開始した発展編の視聴が一通り終了しましたので、
>>年明けからフォローアップメールセミナーの伝票作成マクロに取り掛かってきました。
>>発展編での学びを定着させるのにとても勉強になっております。
>>実務の方でも非常に役に立っており、大変感謝致しております。
>>
>>この伝票作成マクロの動画を通じて、withブロックの中身を置換でシンプルに修正する方法が
>>大変参考になりました。
>>またテスト時のブレークポイントの設定についても良い復習となり、
>>実務の方で活かしていきたいと実感しました。
>>
>>以下に宿題を投稿させて頂きます。
>>先生の動画を視聴した直後に作成しましたので、殆ど先生のコードと違わないとは思いますが、
>>いざ自分で作ってみるとなると、罫線を引くタイミングが難しくて、
>>特にmainシートに罫線が引かれてしまう時の回避策がどうしても思いつかず、
>>単純に、”シート名がmainでなければ”、という表現となってしまいましたが・・・(・∀・;)
>>よろしくお願いいたします。
>
ゲストさんのコメント
(コメントID: 3302)
おはようございます。
>大変勉強になりました!「初回でなければ」という意味での
>If gyo<2 Then
> keisen
>だったのですね(・∀・)!!まったく閃きませんでした。
応用範囲の広い考え方です。
ぜひご活用ください。
ほかにもいろいろなやり方があります。たとえば以下。
理屈はこれのほうが分かりやすいかも?僕は変数をむやみに増やすのは好きではないのでこの方法は採りませんが、参考まで。
>小川先生、早速添削ご指導くださいましてありがとうございました。
>罫線を引くタイミングにつきまして、
>
>>「初回でなければ」という考え方でもよいです。では、初回かどうかを判定するには?→答え:「For Next構文の変数の値がカウンターの最初の値だったら」てことです。
>>For Next構文のアレンジとして、「初回だったらスキップ」、「ループを抜けた直後に追加処理」というのはよく使います。今後に向けて参考にしてください。
>
>大変勉強になりました!「初回でなければ」という意味での
>If gyo<2 Then
> keisen
>だったのですね(・∀・)!!まったく閃きませんでした。
>何故3行目以降なら罫線設定なのかということにばかりとらわれておりました。
>大変スッキリ致しました☆次の宿題作成のときにきちんと理解して書けそうです。
>他にも細やかなご指導ありがとうございました。今後の参考となりました。
>他の受講生さんの投稿等も参考にして、スッキリしたシンプルなコードが書けるように励みたいと思います(・∀・)
>それでは失礼いたします。
>
>
>
>小川慶一 さん:
>
>>受講生 さん:
>>
>>投稿ありがとうございます。全体にとてもよく書けていると思います。
>>
>>>いざ自分で作ってみるとなると、罫線を引くタイミングが難しくて、
>>>特にmainシートに罫線が引かれてしまう時の回避策がどうしても思いつかず、
>>>単純に、”シート名がmainでなければ”、という表現となってしまいましたが・・・(・∀・;)
>>
>>↑それでもよいですが、「初回でなければ」という考え方でもよいです。では、初回かどうかを判定するには?→答え:「For Next構文の変数の値がカウンターの最初の値だったら」てことです。
>>
>>For Next構文のアレンジとして、「初回だったらスキップ」、「ループを抜けた直後に追加処理」というのはよく使います。今後に向けて参考にしてください。
>>次の機会に活かしてください。
>>
>>並べ替えのところのミスがやや痛い!しかしあとはとてもよくできています。
ゲストさんのコメント
(コメントID: 3305)
ちょい直してみた。このほうが可読性高いかな。変数名はこのくらい分かりやすいほうが良いですね。
受講生さんのコメント
(コメントID: 3309)
いつも大変お世話になっております。
早速フォロー下さりありがとうございます。
ループの初回の回避策の別解、大変勉強になります!(・∀・)☆
"true"か"false"か、で条件分岐させる方法をとると、後からコードを見返しても分かりやすいですね。
とても応用が効きそうなので、今後活用していきたいと思います!
つい一つのやり方を身につけると、そればかりに凝り固まってしまいがちでして、別解のご教示は大変ありがたいです(・∀・)
今後ともよろしくお願いいたします。失礼いたします。
小川慶一 さん:
>受講生 さん:
>
>ちょい直してみた。このほうが可読性高いかな。変数名はこのくらい分かりやすいほうが良いですね。
>
>