« プティポワのローストチキンとロアールのクリスマスケーキ | トップページ | 昭和区ラテン化計画の会in鈴松 »

2012年12月28日 (金)

おれはまだ・・・!

どこか狂わされたけれど、まだ、大丈夫だと思います・・・

Sub 書留郵便物受領証&書留差出票印刷()
Dim s As Integer
Dim i As Integer
Dim k As Integer
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Application.ScreenUpdating = False
Set ws2 = Sheets("書留郵便物受領証")
Set ws1 = Sheets("Sheet1")
s = WorksheetFunction.RoundUp(WorksheetFunction.CountA(Sheet1.Range("B2:B1021")) / 10, 0) * 10
For i = 1 To s Step 10
For k = 6 To 15
   ws2.Cells(k, 2) = ws1.Cells(i + k - 5, 2) '送付先転記
   ws2.Cells(k, 5) = ws1.Cells(i + k - 5, 3) '金額転記
  Next
  Worksheets("書留郵便物受領証").PrintOut
Next
Worksheets("書留差出票").PrintOut , Copies:=2
Range("A3").Select
Application.ScreenUpdating = True
End Sub

Sub データ登録()
Dim i As Integer
Dim k As Integer
Dim b As Integer
Dim E As Integer
Application.ScreenUpdating = False
k = WorksheetFunction.CountA(Sheet1.Range("b:b")) - 1 '送付先の個数
E = WorksheetFunction.CountA(Sheet1.Range("c:c")) - 1 '金額の入力個数
b = Sheets("データ").Range("B65536").End(xlUp).Offset(0).Row 'データシートの入力最終行
If E <> k Then
MsgBox ("金額の入力を点検してください。")
Else
For i = 1 To k
Sheets("データ").Cells(b + i, 2) = Sheets("sheet1").Cells(i + 1, 2)  '送付先名
Sheets("データ").Cells(b + i, 3) = Sheets("sheet1").Cells(i + 1, 3)  '金額
Sheets("データ").Cells(b + i, 4) = Sheets("sheet1").Cells(i + 1, 4)  '種別
Sheets("データ").Cells(b + i, 5) = Now  '日付
Sheets("データ").Cells(b + i, 1) = Sheets("データ").Cells(b - 1 + i, 1).Value + 1 '通し番号
   Next
i = i + 1
End If
Application.ScreenUpdating = True
End Sub

今回の仕事の中で非常に役立った構文です。
sheet1というシートのB列にあて先の名前、C列に金額(書留速達)、D列に種類(どういう目的の文書かを選択)を入力し、フォームで作成したボタンを押下すれば、郵便局に提出する書留郵便物受領証とその控えがその数量にあわせ、10件単位で印刷され、そのつどの書留差出票も印刷し、データというシートにどんどん登録され、最終的な件数、金額が自動に集計できるというものです。
あて先の名前は、種類別のシートで作成したデータをコピペすればいいし、金額はだいたい660円、触って重いものは計量するし、種類は4種、フィルすれば簡単だ。
はんこ押し、名簿のチェックなど、手作業による事務がてんこ盛りのとき、書留郵便物受領証まで手書きしていると、ミスが多く発生し、配達員の方を待たせたり、ひいてはクライアントに大迷惑の可能性がある。
このシステムだと集配の時間ぎりぎりまでためておき、集配に見えた瞬間にボタンを押せるので、事務がたまらないし、最終的にはこの件数を元に国に請求することになる金額なので、計算だけはきちんとせねばならない。
基本は、for next構文で転記しつつ印刷し、別シートにデータを蓄積するということなんだが、ひとつのポイントは
s = WorksheetFunction.RoundUp(WorksheetFunction.CountA(Sheet1.Range("B2:B1021")) / 10, 0) * 10
という関数を利用したプログラムである。
この構文は、B列にある入力個数を10単位で切り上げて、21個なら3枚の書留郵便物受領証を使うということを表現している。
これをネストしたfor next構文で10単位ずつ転記して印刷する。
また、登録の方では
b = Sheets("データ").Range("B65536").End(xlUp).Offset(0).Row
の構文がポイントである。
データシートのB列の最終行から空白セルをとばし、次の空白セル位置を表現している。
つまり、この行からデータを転記していけばいいのだ。
自分の実感では、この事務にかかる時間と人は以前に比べると5分の1だ。開発時間を考慮しても、元は完全に引いているし、何しろ精度が高い。あとは、イレギュラーな入力に対する防御だが、随分へったし、次のスパンまでに更に改良できるだろう。基本はこれでいいと思う。
かなり集中して作ったんで、仕事がらみなんだけれど、公開します。
なんか結局職人仕事なんだよなあ。
でも、共有できて、もっといいものができれば、いいなあと思う。
関数のプログラム化、ネストした構文、データの積み上げ。応用も効くよ。
2月には、PCの研修講師もする予定だし、少し頭を整理しよう。

« プティポワのローストチキンとロアールのクリスマスケーキ | トップページ | 昭和区ラテン化計画の会in鈴松 »

身辺雑記」カテゴリの記事

コメント

スゴ! 売れるわ!!
o1211さんがどうも静かだと思ったら、こんなことやってたん。お疲れさまです。

sinoさん、こんなことしてました。
office系のよさは、仕事の間尺にぴったりあわせられるところですね。成果物は完全に特化してますが、手法は限りなく応用できます。
今の自分の課題は、もっとシンプルな俳句のようなプログラム作成とメンテナンス、引継ぎの容易さです。
一定の理解があれば、誰でも改善でき、発展できる、こんなオープンなシステム設計を目指しています。

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/574941/56408260

この記事へのトラックバック一覧です: おれはまだ・・・!:

« プティポワのローストチキンとロアールのクリスマスケーキ | トップページ | 昭和区ラテン化計画の会in鈴松 »