Excel VBA質問箱 IV

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

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


5667 / 13645 ツリー ←次へ | 前へ→

【49561】ファイルの更新日時を更新したくない とよだ 07/6/11(月) 11:10 質問[未読]
【49568】Re:ファイルの更新日時を更新したくない neptune 07/6/11(月) 16:44 発言[未読]
【49570】Re:ファイルの更新日時を更新したくない とよだ 07/6/11(月) 16:55 発言[未読]
【49576】Re:ファイルの更新日時を更新したくない ハチ 07/6/11(月) 18:11 発言[未読]
【49577】Re:ファイルの更新日時を更新したくない とよだ 07/6/11(月) 19:34 発言[未読]
【49579】Re:ファイルの更新日時を更新したくない yuu1 07/6/11(月) 23:07 回答[未読]
【49580】Re:ファイルの更新日時を更新したくない neptune 07/6/11(月) 23:08 発言[未読]
【49585】Re:ファイルの更新日時を更新したくない とよだ 07/6/12(火) 9:27 お礼[未読]
【49590】Re:ファイルの更新日時を更新したくない とよだ 07/6/12(火) 10:59 お礼[未読]

【49561】ファイルの更新日時を更新したくない
質問  とよだ  - 07/6/11(月) 11:10 -

引用なし
パスワード
   すみません。お世話になります。

計画書を作成するプログラムがあります(アドインで作成しました)
プログラム内で雛形をコピーし計画書を作成しています。

作成された計画書の中には少しだけThisWorkbookにプログラムを記述してます。
今回その箇所に不具合が見つかり記述し直す事になりました。

しかし、ここで問題があります。
コーディングを変更し保存しますと
当然、ファイルの更新日時が変更となってしまします。
シート内にある数値や文章は既にユーザのモノです。
ユーザによっては日付管理をしている方もいらっしゃいます。

ので、更新日時が変更することはマズイとなりました。
そこで、

’パーソナルコントロールボタンに設定したマクロ
Public Sub SetLastDate()
Dim FileName As String
Dim FilePath As String
Dim LastUpdateDate As Date
’初期値セット
FileName = ActiveWorkbook.FullName
FilePath = ActiveWorkbook.Path

If FilePath <> vbNullString Then
  ’前回の更新日時取得
  LastUpdateDate = FileDateTime(FileName)
  ’シートを閉じる
  ActiveWorkbook.Close
  ’ファイルの最終更新日の変更
  Call LsSetFileTime(FilePath, LastUpdateDate)
End If
End Sub


’ファイルの最終更新日の変更の関数(APIを使用しています)
Sub LsSetFileTime(TempFile As String, wDateTime As Date)
  Dim RtnCd As Long, hFile As Long
  Dim lpCreationTime As FILETIME
  Dim lpLastAccessTime As FILETIME
  Dim lpLastWriteTime As FILETIME
  Dim lpLocalFileTime As FILETIME
  Dim lpSystemTime As SYSTEMTIME
  
  '設定する日時をセット
  With lpSystemTime
    .wYear = Year(wDateTime)
    .wMonth = Month(wDateTime)
    .wDay = Day(wDateTime)
    .wHour = Hour(wDateTime)
    .wMinute = Minute(wDateTime)
    .wSecond = Second(wDateTime)
  End With
  'システム時刻をファイル時刻に変換する
  RtnCd = SystemTimeToFileTime(lpSystemTime, lpLocalFileTime)
  'ローカル時間を UTC に変換する
  RtnCd = LocalFileTimeToFileTime(lpLocalFileTime, lpLastWriteTime)
  'ファイルハンドルを得る
  hFile = CreateFileLong(TempFile, GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0)
  'ファイルの時刻を設定
  RtnCd = SetFileTimeLong(hFile, 0, 0, lpLastWriteTime)
  'ファイルハンドルを開放
  RtnCd = CloseHandle(hFile)
End Sub


を記述しましたが、前回の更新日時取得方法が悪いのか?
閉じるタイミングが悪いのか?
更新日時が通常通りのシステム日付となってしまいます。
すみませんがアドバイスをお願い致します。

【49568】Re:ファイルの更新日時を更新したくない
発言  neptune  - 07/6/11(月) 16:44 -

引用なし
パスワード
   ▼とよだ さん:
こんにちは

ActiveWorkbookの更新日時を変更しないと言うことですよね?
閉じると当然更新日時は新しくなるが、それを元に戻す処理ですよね。

何年も前にこれと同じ事がどこかで書かれていたような・・・??

UPされている処理自体は至ってまっとうな気がするんですが・・?

ただ、CreateFileなどでFileHANDLEを取得するとその時点で、
更新日かアクセス日かは忘れましたが、勝手に変更されたような
記憶もあります。

解消にはAPIじゃなくほかのものを使ったような記憶が・・・完全に忘れてます。

根性があれば、調べてみますが、最近根性がないのでご自分でも調べてください。
わかったら教えてくださいね。私もわかったら書き込みます。

【49570】Re:ファイルの更新日時を更新したくない
発言  とよだ  - 07/6/11(月) 16:55 -

引用なし
パスワード
   >’パーソナルコントロールボタンに設定したマクロ
>Public Sub SetLastDate()
> ・
> ・(中略)
> ・
>  ’前回の更新日時取得
>  LastUpdateDate = FileDateTime(FileName)

  ↑ここがどうしてもファイルOPEN日時を取得するので
  Dim FSO
  Set FSO = CreateObject("Scripting.FileSystemObject")
  LastUpdateDate = FSO.GetFile(FileName).DateLastModified
  
  に変更してみましたが、やはりファイルOPEN日時を取得してきました。

  そこで、「前回の更新日時取得」以降の
  ソースが動作していないか確かめる為に、元のソースに戻し

>  LastUpdateDate = FileDateTime(FileName)
  Stop
  ↑ ここにStopを入れ
  イミデェエイトで
  LastDate=#2006/06/30# ←テスト日付
  を実行しましたところ、テスト日付が更新日時となり
  ThisWorkbookに変更したソースはちゃんと保存されていました。

「前回の更新日時取得」には
記述タイミングが必要なのでしょうか?

【49576】Re:ファイルの更新日時を更新したくない
発言  ハチ  - 07/6/11(月) 18:11 -

引用なし
パスワード
   ▼とよだ さん:

ファイルを開いた時点で、更新日時=開いた日時になるみたいですね。
デスクトップあたりに新規xlsファイルを作成して試してみるとわかります。
保存せずに終了すると元の日時に戻るようです。

方法としては「開く前に値を保存しておく」か、

あくまで案ですが・・
1、別名で保存して
2、更新日時を取得したら
3、元のファイルに上書きして保存
4、取得した日時情報を書き込む

ですかね?
かなり面倒ですね・・・

【49577】Re:ファイルの更新日時を更新したくない
発言  とよだ  - 07/6/11(月) 19:34 -

引用なし
パスワード
   ▼ハチさん、neptuneさん

お返事ありがとうございます。

どうやら、ファイルを閉じている状態で
FileName="O:\temp\計画書保存\AB\07AA001.xls"
Set FSO = CreateObject("Scripting.FileSystemObject")
LastUpdateDate = FSO.GetFile(FileName).DateLastModified

これだとちゃんと更新日時をとってきます。

いろいろ試したソースです。
'案1(APIを使う)
'  Dim Makedate As Date, AccessDate As Date, LastDate As Date
'  Call LsGetFileTime(FileName, Makedate, AccessDate, LastDate)
※ファイルOPENしていると日付の取得はダメでした。閉じてると取得します。

'案2(関数を使う)
'  Dim LastDate As Date
'  LastDate = FileDateTime(FileName)
'案3("Scripting.FileSystemObject"を使う)
'  Dim FSO
'  Dim LastDate As Date
'  Set FSO = CreateObject("Scripting.FileSystemObject")
'  LastDate = FSO.GetFile(FileName).DateLastModified

どれも、撃沈しました。どれもOPEN日付が好きみたいです。


今回プログラムを変更しなければ、ならないファイルがざっと500弱あり

ハチさんのを見て閃いたのが
「ファイル情報取得(構造体)」のようなマクロを作成しようと思います。
"Scripting.FileSystemObject"を利用して
該当するExcelファイル情報の構造体(ファイル名、更新日時)を用意して
コントロールボタン(マクロ名:SetLastDate)を押下した時に
構造体からファイル名をマッチングして更新日時を取得し
LastUpdateDateにセットしようかと思います。

なんだかちょっと泥臭いソースになってしまいます。(笑

「保存をキャンセルすると前回の更新日時に戻る」って事は、
プロパティか設定がどっかにあるはずなんですよね?
正当な取得方法がわかると便利だと思いますので、
今後の参考にお教え頂くと幸いです。

【49579】Re:ファイルの更新日時を更新したくない
回答  yuu1  - 07/6/11(月) 23:07 -

引用なし
パスワード
   こんにちは。
開く前(閉じている時)に更新日時を取得しておけば良いとおもいますが...

どうしても開いてから更新日時を取得する理由があるのでしょうか。
方法はありますが、上記が簡単です。

【49580】Re:ファイルの更新日時を更新したくない
発言  neptune  - 07/6/11(月) 23:08 -

引用なし
パスワード
   こんにちは

開いたら
プロパティから取得できませんか?
以下はExcelBookのプロパティを列挙しますが、その中に、
Last print date
Creation date
Last save time
などがありますが。。。

Sub test2()
Dim sTime As Date
Dim DocProp As DocumentProperties
Dim i As Long, imax

  Set DocProp = ActiveWorkbook.BuiltinDocumentProperties
  imax = ActiveWorkbook.BuiltinDocumentProperties.Count
  
  For i = 1 To imax - 1
    Debug.Print DocProp.Item(i).Name
  Next i
  
End Sub

で、ここまでで挫けました。もう眠い。

【49585】Re:ファイルの更新日時を更新したくない
お礼  とよだ  - 07/6/12(火) 9:27 -

引用なし
パスワード
   ▼neptune さん:
ありがとうございました。遅くまですみません。
教えて頂いたのを使って勉強します。

ご迷惑をおかけしました。

【49590】Re:ファイルの更新日時を更新したくない
お礼  とよだ  - 07/6/12(火) 10:59 -

引用なし
パスワード
   ▼neptune さん:
>Sub test2()
>Dim sTime As Date
>Dim DocProp As DocumentProperties
>Dim i As Long, imax
>
>  Set DocProp = ActiveWorkbook.BuiltinDocumentProperties
>  imax = ActiveWorkbook.BuiltinDocumentProperties.Count
>  
>  For i = 1 To imax - 1
>    Debug.Print DocProp.Item(i).Name
>  Next i
>  
>End Sub

ありがとうございました!!!!
動作確認できました。
バッチリです。管理しやすいスマートなソースになりました。
パーソナルアドで作ったのでコントロールボタンとして活用できました!
本当に助かりましたありがとうございました。

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