Python Program Introduction Site

Excel自動化

 

仕事を片っ端から自動化しませんか?

それが出来たらどんなにいいか?

そう思うのは私だけではないと思います。

新聞店で働いているあなたも、毎日毎日の配達していて

もっと効率よく働き「自分の自由に使える時間を増やしたい!」

と思ったことは一度や二度ではないと思います。

今回、紹介する動画はExcel VBAを使って

①配達

・本誌、諸紙の定数|休み(曜日休みも含む)|

入り(即入も含む)|止め(即止めも含む)|試読

②集金

・毎日の配達と連動させ消込業務をボタン一つで解決

③区域の個々の数、全体の総数が自動で求められる。

入力した瞬間、数えることなく数がでます。

この他にも個人的に利用している機能があるのですが

それは、またいつか紹介します。

動画で紹介できなかった、次の月、次の年への自動での移動。

祝日、振替休日の仕組みは機会があったらご紹介いたします。

 
空白行が存在するため、この形にしました。
 
下が「増減ボタン」日々の増減のVBAの一部です。
実際はこれらをまとめた==========で囲んだ形でできています。
つまり、これらはタダの部品だということです。
しかも流用可能な。

Sub pro_q()
Dim i As Integer
Set Ws1 = Sheets(“process”)
Set Ws3 = Sheets(“iri_tome”)

For i = 6 To 36 ‘日付の最後の行までループ

Ws1.Range(“Q” & i) = Ws1.Range(“D1”) _
– WorksheetFunction.CountIfs(Ws1.Range(“D6:D36”), “朝”, Ws1.Range(“F6:F36”), “<=” & Ws1.Range(“O” & i)) _
+ WorksheetFunction.CountIfs(Ws1.Range(“D6:D36”), “朝”, Ws1.Range(“H6:H36”), “<” & Ws1.Range(“O” & i)) _
– WorksheetFunction.CountIfs(Ws3.Range(“A4:A34”), “朝”, Ws3.Range(“C4:C34”), “<=” & Ws1.Range(“O” & i)) _
– WorksheetFunction.CountIfs(Ws3.Range(“A4:A34”), “ヨ”, Ws3.Range(“C4:C34”), “<=” & Ws1.Range(“O” & i)) _
+ WorksheetFunction.CountIfs(Ws3.Range(“A4:A34”), “朝”, Ws3.Range(“D4:D34”), “<=” & Ws1.Range(“O” & i)) _
+ WorksheetFunction.CountIfs(Ws3.Range(“A4:A34”), “ヨ”, Ws3.Range(“D4:D34”), “<=” & Ws1.Range(“O” & i)) _
– Ws1.Range(“AP” & i)

‘(本日の朝刊実配数) = (朝刊定数) – (中止期間中数) – (即止数) + (即入数)

Next i
End Sub


Sub pro_r()
Dim i As Integer
Set Ws1 = Sheets(“process”)
Set Ws3 = Sheets(“iri_tome”)

For i = 6 To 36 ‘日付最後の行までループ
Ws1.Range(“R” & i) = Ws1.Range(“D2”) _
– WorksheetFunction.CountIfs(Ws1.Range(“C6:C36”), “夕”, Ws1.Range(“G6:G36”), “<=” & Ws1.Range(“O” & i)) _
+ WorksheetFunction.CountIfs(Ws1.Range(“C6:C36”), “夕”, Ws1.Range(“I6:I36”), “<” & Ws1.Range(“O” & i)) _
– WorksheetFunction.CountIfs(Ws3.Range(“A4:A34”), “ヨ”, Ws3.Range(“C4:C34”), “<=” & Ws1.Range(“O” & i)) _
+ WorksheetFunction.CountIfs(Ws3.Range(“A4:A34”), “ヨ”, Ws3.Range(“D4:D34”), “<=” & Ws1.Range(“O” & i)) _
– Ws1.Range(“AQ” & i)

‘(本日の夕刊実配数) = (夕刊定数) – (夕刊中止数)
Next i
End Sub


Function getDateWeekNum(myYear As Long, myMonth As Long, _
myWeekday As VbDayOfWeek, weekNum As Integer) As Date
Dim firstWeekday As Integer ‘ 指定した年月の1日の曜日番号
Dim Sabun As Integer ‘ 曜日番号の差分

‘ 指定した年月の1日の曜日番号求める
firstWeekday = Weekday(DateSerial(myYear, myMonth, 1))

‘1日の曜日番号と求めたい曜日番号の差分を求める
Sabun = myWeekday – firstWeekday
If myWeekday < firstWeekday Then
Sabun = Sabun + 7
End If

‘ 目的の日付データを求めて返す
getDateWeekNum = Year(DateSerial(myYear, myMonth, 1 + Sabun + 7 * (weekNum – 1))) & “/” & Month(DateSerial(myYear, myMonth, 1 + Sabun + 7 * (weekNum – 1))) & “/” & Day(DateSerial(myYear, myMonth, 1 + Sabun + 7 * (weekNum – 1)))
End Function

====================

Sub shori()

pro_c
pro_c2
pro_d
pro_d2
pro_e
pro_e2

pro_f
pro_f2
pro_g
pro_g2
pro_h
pro_h2
pro_i
pro_i2
pro_j
pro_j2
・・・

End Sub

==================================
 
【次月へ】次の月へ自動更新
 

Sub next_month1()

Set Ws1 = Sheets(“process”)
Set Ws2 = Sheets(“take”)

Set Ws4 = Sheets(“process2”)
Set Ws5 = Sheets(“tom2”)

Set Ws8 = Sheets(“balance”)

‘まず『take』シートの年月日表示を更新する
Ws2.Range(“A2”) = Ws1.Range(“B1”) + Int(Ws1.Range(“B2”) / 12)
Ws2.Range(“B2”) = (Ws2.Range(“B2”) Mod 12) + 1
Ws2.Range(“C2”) = 1


If WorksheetFunction.CountIf(Ws1.Range(“W19:W25”), Ws1.Range(“B2”)) = 1 Then

Ws2.Range(“D2”) = 31

ElseIf WorksheetFunction.CountIf(Ws1.Range(“X19:X25”), Ws1.Range(“B2”)) = 1 Then

Ws2.Range(“D2”) = 30

Else: Ws2.Range(“D2”) = 28 + Ws1.Range(“AA19”)

End If
End Sub


Sub next_month2()
Dim i, j As Integer
Set Ws1 = Sheets(“process”)
Set Ws2 = Sheets(“take”)
Set Ws4 = Sheets(“process2”)

Ws1.Range(“O6:U40”) = “”
Ws1.Range(“Y6:Y40”) = “”
Ws4.Range(“O6:S40”) = “”
Ws4.Range(“Y6:Y40”) = “”

‘次に『process』『process』シートのO列に日にち、Y列に『年/月/日』を1日から月末まで入力する
For i = 6 To Ws2.Range(“D2”) + 5
Ws1.Range(“O” & i) = i – 5
Ws1.Range(“Y” & i) = Ws1.Range(“B1”) & “/” & Ws1.Range(“B2”) & “/” & (i – 5)
Ws4.Range(“O” & i) = i – 5
Ws4.Range(“Y” & i) = Ws4.Range(“B1”) & “/” & Ws4.Range(“B2”) & “/” & (i – 5)
Next i

‘P列にはO列の日にちに対する曜日を入力する
For j = 6 To Ws2.Range(“D2”) + 5
Ws1.Range(“P” & j) = WorksheetFunction.Weekday(DateValue(Ws1.Range(“Y” & j)))
Ws4.Range(“P” & j) = WorksheetFunction.Weekday(DateValue(Ws4.Range(“Y” & j)))
Next j

For k = 6 To Ws2.Range(“D2”) + 5
Select Case Ws1.Range(“P” & k).Value

Case 1

Ws1.Range(“P” & k) = “日”

Case 2

Ws1.Range(“P” & k) = “月”

Case 3

Ws1.Range(“P” & k) = “火”

Case 4

Ws1.Range(“P” & k) = “水”

Case 5

Ws1.Range(“P” & k) = “木”

Case 6

Ws1.Range(“P” & k) = “金”

Case 7

Ws1.Range(“P” & k) = “土”

End Select
Next k
End Sub

==============================
Sub jigetsu_he()

Dim i As Integer
Set Ws8 = Sheets(“balance”)
Set Ws1 = Sheets(“process”)
Set Ws4 = Sheets(“process2”)
Set Ws9 = Sheets(“back_up”)

back_up
zengetsu_zan
next_month1
next_month2
next_month3
next_month4
holiday

For i = 6 To 20
If Ws8.Range(“A” & i) <> “” Then

Ws8.Range(“J” & i) = Ws8.Range(“B2”) & “*” & _
Ws8.Range(“C” & i) & “*” & _
(Ws8.Range(“F” & i) – Ws9.Range(“D2”))

End If
Next i

Ws1.Range(“B6:B36”) = “”
Ws4.Range(“B6:B36”) = “”

End Sub

============================
 
 
マクロ記録は相対的で
 
①アクティブなページ、
②セレクトしたセル
 
に対して
他のセルは相対的にどの位置になるかを記録していきます。
これにチョット手を加えることによって、作業を自動化することが出来ます。
 
例えばSUMIF()関数を使用しているとして、納品先別に請求額を出すことが出来ます。
これを「請求書作成マクロ」と連動させてやれば、
日ごろの入力後は、特別なことは何一つ必要ありません。
 
ただ一つのボタンを「ポン」押すだけで請求書が作成できてしまいます。
非常に便利な機能ですが、実行には以下の注意が必要です。
 
マクロを実行する際はこの①、②の二つを常に同じにしなければいけません。
それを怠ると、想定していない結果を招いてしまいます。
取り返しがつかないほどです。
注意しましょう。
 
これに対してVBAにはそのような問題は発生しません。
それは最初から①も②も明示的に指定しているからです。
 
このように
 
マクロ記録=相対的
VBA=絶対的(明示的)
 
にアクティブなシート、およびアクティブなセルを扱うことを頭に入れて
プログラミングするように心がけましょう。
 

 


 

 

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

python3X