Excel VBA質問箱 IV

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

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


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

【29915】21〜20日のサイクルの処理について Mi 05/10/16(日) 13:58 質問[未読]
【29917】Re:21〜20日のサイクルの処理について かみちゃん 05/10/16(日) 14:15 発言[未読]
【29927】Re:21〜20日のサイクルの処理について Hirofumi 05/10/16(日) 17:32 発言[未読]
【29918】Re:21〜20日のサイクルの処理について Hirofumi 05/10/16(日) 14:49 回答[未読]
【29920】Re:21〜20日のサイクルの処理について Hirofumi 05/10/16(日) 15:30 回答[未読]
【29921】Re:21〜20日のサイクルの処理について Hirofumi 05/10/16(日) 15:40 回答[未読]
【29923】Re:21〜20日のサイクルの処理について Hirofumi 05/10/16(日) 15:55 回答[未読]
【29930】Re:21〜20日のサイクルの処理について Mi 05/10/16(日) 19:23 お礼[未読]

【29915】21〜20日のサイクルの処理について
質問  Mi  - 05/10/16(日) 13:58 -

引用なし
パスワード
   1ケ月のサイクルが21〜20日で、
21日から20日がワンサイクルの月次決算の会社です。
一度教えていただいたつもりですが、分からないことが発生しました。
このサイクルでファイルをフォルダーに収納しています。

このコードでClngの必要性があるのでしょうか?無くっても良いような
気がするのですが・・・
Clngはどのような役割をしているのでしょうか?

ご存知でしたら教えてください。

  Dim dt1   As Date
  Dim dt2   As Date

  dt1 = Cells(4, 4).Value
  dt2 = dt1
  If Day(dt1) > 20 Then
    dt2 = DateSerial(Year(dt1), Month(dt1) + 1, Day(dt1))
    dt2 = DateSerial(Year(dt2), Month(dt2) + CLng(Day(dt1) <> Day(dt2)), Day(dt2))
  End If

   On Error Resume Next
  ActiveWorkbook.SaveAs Filename:= _
   "U:\AAA" & Format(dt2, "e-m") & "月分\BB明細表" & _
   Format(Date, "mm-dd") & ".xls"
  On Error GoTo 0

【29917】Re:21〜20日のサイクルの処理について
発言  かみちゃん  - 05/10/16(日) 14:15 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>1ケ月のサイクルが21〜20日で、
>21日から20日がワンサイクルの月次決算の会社です。
>一度教えていただいたつもりですが、分からないことが発生しました。

どこが見たことのあるご質問ですね。
ここの掲示板で知った内容であれば、できれば、参照した投稿内容のリンクを教えていただけませんか?

>このコードでClngの必要性があるのでしょうか?無くっても良いような
>気がするのですが・・・

なぜそう思われたのですか?
 MsgBox (Day(dt1) <> Day(dt2))
 MsgBox CLng(Day(dt1) <> Day(dt2))
 MsgBox CInt(Day(dt1) <> Day(dt2))
を比較してみてください。

>Clngはどのような役割をしているのでしょうか?

ヘルプを調べられましたか?

【29918】Re:21〜20日のサイクルの処理について
回答  Hirofumi  - 05/10/16(日) 14:49 -

引用なし
パスワード
   何を目的として作った物か?、またどんなデータが入るかが善く解らないので
間違って居たらゴメンなさい

  Dim dt1   As Date
  Dim dt2   As Date
  
  'dt1に日付を取得
  dt1 = Cells(4, 4).Value
  'dt2にdt1の値をコピー
  dt2 = dt1
  'もし、dt1の日付が20日を超えるなら
  If Day(dt1) > 20 Then
    'dt2にCells(4, 4)の翌月の同日の日付を設定
    dt2 = DateSerial(Year(dt1), Month(dt1) + 1, Day(dt1))
    'もしCells(4, 4)のとdt2が同日で無いなら同月、同日なら翌月の同日日付を設定
    '?Clngが無意味のでは無く、上記行で、dt1、dt2共同日としているので
    '「CLng(Day(dt1) <> Day(dt2))」は常に「-1」と成る為、
    'dt2 = DateSerial(Year(dt2), Month(dt2) - 1, Day(dt2))としても同じ?
    '意味は、dt1とdt2が常に同年、同月、同日と成ります
    dt2 = DateSerial(Year(dt2), Month(dt2) + CLng(Day(dt1) <> Day(dt2)), Day(dt2))
  End If
  '結論として、「dt1 = Cells(4, 4).Value」〜「End If」までを
  'dt2 = Cells(4, 4).Valueの1行に置き換えても同じ様な結果に成る気がします?

   On Error Resume Next
  ActiveWorkbook.SaveAs FileName:= _
   "U:\AAA" & Format(dt2, "e-m") & "月分\BB明細表" & _
   Format(Date, "mm-dd") & ".xls"
  On Error GoTo 0

検証として、以下の様なユーザー定義関数にしてテストします

Public Function Sample(dt1 As Variant) As Variant

'  Dim dt1   As Date
  Dim dt2   As Date
  
'  dt1 = Cells(4, 4).Value
  dt2 = dt1
  If Day(dt1) > 20 Then
    dt2 = DateSerial(Year(dt1), Month(dt1) + 1, Day(dt1))
    dt2 = DateSerial(Year(dt2), Month(dt2) + CLng(Day(dt1) <> Day(dt2)), Day(dt2))
  End If

  Sample = dt2
  
End Function

シートのA1から下に適当に20日を跨ぐ様に日付を入れます
B1に「=Sample(A1)」と入れ、日付と同じ行までコピーします

尚、「CLng(Day(dt1) <> Day(dt2))」は何を行っているかと言うと
「Day(dt1) <> Day(dt2)」の部分は、当然、値が「Day(dt1) = Day(dt2)」ならFalseが返り、
「Day(dt1) <> Day(dt2)」ならTrueが返ります
此れを、CLngでキャストすると、CLng(True)は-1を、CLng(False)は0を返します

【29920】Re:21〜20日のサイクルの処理について
回答  Hirofumi  - 05/10/16(日) 15:30 -

引用なし
パスワード
   ゴメン、比較演算の勘違い

>    '?Clngが無意味のでは無く、上記行で、dt1、dt2共同日としているので
>    '「CLng(Day(dt1) <> Day(dt2))」は常に「-1」と成る為、
>    'dt2 = DateSerial(Year(dt2), Month(dt2) - 1, Day(dt2))としても同じ?
>    '意味は、dt1とdt2が常に同年、同月、同日と成ります
>    dt2 = DateSerial(Year(dt2), Month(dt2) + CLng(Day(dt1) <> Day(dt2)), Day(dt2))

上記は間違い、以下の様です

    '?Clngが無意味のでは無く、上記行で、dt1、dt2共同日としているので
    '「CLng(Day(dt1) <> Day(dt2))」は常に「0」と成る為、
    'dt2 = DateSerial(Year(dt2), Month(dt2) - 0, Day(dt2))としても同じ?
    '意味は、dt1とdt2が常に同年、翌月、同日と成ります
    dt2 = DateSerial(Year(dt2), Month(dt2) + CLng(Day(dt1) <> Day(dt2)), Day(dt2))

因って、

>  '結論として、「dt1 = Cells(4, 4).Value」〜「End If」までを
>  'dt2 = Cells(4, 4).Valueの1行に置き換えても同じ様な結果に成る気がします?

此れも間違い

  '結論として、
  'dt2 = DateSerial(Year(dt2), Month(dt2) + CLng(Day(dt1) <> Day(dt2)), Day(dt2))
  'を
  'dt2 = DateSerial(Year(dt2), Month(dt2), Day(dt2))
  'としても同じと思われます

【29921】Re:21〜20日のサイクルの処理について
回答  Hirofumi  - 05/10/16(日) 15:40 -

引用なし
パスワード
   ゴメン、もう一つ忘れてました

もう一つユーザー定義関数(以下の物)を作り


Public Function Sample2(dt1 As Variant) As Variant

'  Dim dt1   As Date
  Dim dt2   As Date
 
'  dt1 = Cells(4, 4).Value
  dt2 = dt1
  If Day(dt1) > 20 Then
    dt2 = DateSerial(Year(dt1), Month(dt1) + 1, Day(dt1))
    dt2 = DateSerial(Year(dt2), Month(dt2), Day(dt2))
  End If

  Sample2 = dt2
 
End Function

C1にA列を参照する様に「=Sample2(A1)」として、、日付と同じ行までコピーして
B列、C列を比べてください

【29923】Re:21〜20日のサイクルの処理について
回答  Hirofumi  - 05/10/16(日) 15:55 -

引用なし
パスワード
   ゴメン、ボケが来ているかな?
よく考えたら、結論として

>    dt2 = DateSerial(Year(dt1), Month(dt1) + 1, Day(dt1))



>    dt2 = DateSerial(Year(dt2), Month(dt2) + CLng(Day(dt1) <> Day(dt2)), Day(dt2))

は、同じ結果に成るので、
    dt2 = DateSerial(Year(dt2), Month(dt2) + CLng(Day(dt1) <> Day(dt2)), Day(dt2))
の行自体無意味と成ります

【29927】Re:21〜20日のサイクルの処理について
発言  Hirofumi  - 05/10/16(日) 17:32 -

引用なし
パスワード
   元はここみたい
 
[#20843] Re:フォルダー(該当月21日〜翌月20日サイクル)のファイル作成について 

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=20843;id=excel

【29930】Re:21〜20日のサイクルの処理について
お礼  Mi  - 05/10/16(日) 19:23 -

引用なし
パスワード
   ▼かみちゃん Hirofumi さん:

色々とご指導ありがとうございました。
参考にさせていただきます。

Clngに関してもう少し勉強してまた質問させていただくかも
しれません。
その折にはよろしくお願いします。

意味は大体分かりましたが、あえてこのコードを使う必要性
が分からないので・・・今しばらく勉強します。
かみちゃんの記述いただきましたMsgBoxの表示も良く分かりました。
ありがとうございました。

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