Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


13157 / 13644 ツリー ←次へ | 前へ→

【6737】修正個所を教えてください(期間計算) m070504 03/7/30(水) 12:31 質問
【6757】Re:修正個所を教えてください(期間計算) 角田 03/7/31(木) 16:00 回答

【6737】修正個所を教えてください(期間計算)
質問  m070504  - 03/7/30(水) 12:31 -

引用なし
パスワード
   勤務期間を計算するに当たって、お願いがあります。
フォームに、採用日・退職日を入力し、
コマンドボタンを押すと、期間が表示されるようにしたいと思いました。
(採用日と退職日も含まれるようにする)

下記のVBAをネット上で見つけたのですが、
打ち込みましたところ、エラーが出て、計算されません。
私の解読力では、「picture1.cls」の意味も分かりませんでした。
フォームは、採用日・退職日・期間表示場所をtextboxにし、
それぞれ、Text1,Text2,picture1と名前を変えました。

どのようにすれば、動きますでしょうか。
何分初心者なので、よろしくお願いいたします。

Private Sub Command2_Click()
 Dim sd As String, ed As String
  Dim y As Integer, m As Integer, d As Integer
  
  sd = Text1.Text
  ed = Text1.Text
  
  Call kikan2(sd, ed, y, m, d)
  
  picture1.cls
  picture1.Print y; "年"; m; "月"; d; "日"
  
End Sub

Private Sub kikan2(sd As String, ed As String, y As Integer, m As Integer, d As Integer)
Dim sdv As Variant, edv As Variant
Dim sdy As Integer, sdm As Integer, sdd As Integer
Dim edy As Integer, edm As Integer, edd As Integer
Dim sd2 As String, ed2 As String
Dim sn As Integer, sn2 As Integer
Dim en As Integer
Dim sn3 As Integer

If sd = "" Or ed = "" Then Exit Sub
sdv = DateValue(sd): edv = DateValue(ed)
If sdv > edv Then Exit Sub

sdy = Year(sdv): sdm = Month(sdv): sdd = Day(sdv)
edy = Year(edv): edm = Month(edv): sdd = Day(edv)
If sdy = 0 And sdm = 0 And sdd = 0 Then Exit Sub
If edy = 0 And edm = 0 And edd = 0 Then Exit Sub
sn = Day(DateValue(DateSerial(sdy, sdm + 1, 1)) - 1)
sn2 = sn - sdd + 1
sn3 = DateDiff("d", sd, DateSerial(sdy, sdm + 1, sdd))

en = Day(DateValue(ed) + 1)

y = edy - sdy
m = edm - sdm
d = sn2 + edd

If sdd = 1 Then
d = d - sn2
Else
  If y = 1 And m = 0 Then
  d = edd - sdd + 1
  Exit Sub
  End If
  m = m - 1
End If

If en = 1 Then
d = d - edd
m = m + 1
End If

If d > sn3 Then
d = d - sn3
m = m + 1
End If

If m < 0 Then
m = 12 + m
y = y - 1
End If

If m = 12 Then
m = m - 12
y = y + 1
End If

【6757】Re:修正個所を教えてください(期間計算)
回答  角田 WEB  - 03/7/31(木) 16:00 -

引用なし
パスワード
   こんにちは。
>下記のVBAをネット上で見つけたのですが
引用する場合は、ちゃんと出典を提示してください。
ましてや、コードを丸々全部なら絶対に!
それが利用させてもらう側のマナーです。
検索したら↓のようですが‥‥‥
http://ww4.enjoy.ne.jp/~yaayaa/
http://ww4.enjoy.ne.jp/~yaayaa/main41.html

>sdy = Year(sdv): sdm = Month(sdv): sdd = Day(sdv)
>edy = Year(edv): edm = Month(edv): sdd = Day(edv)
コピペを間違えてますね。2行目の[sdd]は[edd]ですよ。

>下記のVBAをネット上で見つけたのですが、
>私の解読力では、「picture1.cls」の意味も分かりませんでした。
そのコードはVBAではなく、VBのものです。
VBAには『ピクチャボックス』というコントロールは有りません。

> picture1.cls
> picture1.Print y; "年"; m; "月"; d; "日"
ピクチャボックスコントロール[picture1]に対して
表示をクリアしてから、[y 〜]以降の内容を表示  という意味です

>どのようにすれば、動きますでしょうか
とりあえずは、picture1 の代わりに、TextBox2 を用意して
Private Sub Command2_Click()
Dim sd As String, ed As String
Dim y As Integer, m As Integer, d As Integer
  sd = Text1.Text
  ed = Text1.Text
  Call kikan2(sd, ed, y, m, d)
  TextBox2.Value = y & "年" & m & "月" & d & "日"
End Sub
とすれば動くでしょう。ただし、その結果が、m070504さんの期待通りの結果
かどうかは判りません。

パッと見たところ
 ・開始月と終了月の端数日数合計で「日数」
 ・両端の端数日数部分を除いた、真ん中の「正味の暦通りの【月】」の
  数から「y年mヶ月」
 ・「日数」が31日を越えていたら、「月」にシフトアップ
という計算方法のようです。
m070504さんの会社の就業期間の計算方法に合っていますか?
少なくとも、標準の期間計算方法である民法の規定には合っていません。
ただし、m070504さんの会社の規則に合っているのなら、何ら問題はありません。
期間計算は「当事者間での取り決め」に合っているかどうかが基本ですから。

期間計算については下記を読んで下さい。
http://www.h3.dion.ne.jp/~sakatsu/period_topic.htm

民法に即した期間計算マクロは↓で出来ます。
http://www.h3.dion.ne.jp/~sakatsu/Excel_Tips05.htm
>採用日と退職日も含まれるように
↓の『+1』を外せば「初日算入」になります
>>dtm起算日 = 開始日 + 1  '民法規定[初日 不算入]

ただし、期間計算、特に就業期間の計算は会社によって様々ですから、
就業規則または、担当者に先ずは確認する事ですね。
「月半ばの入社/退社」でも『その月丸々1ヶ月と見故す』という規則の
所もありますし‥‥‥

13157 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free