Excel VBA質問箱 IV

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

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


10866 / 13646 ツリー ←次へ | 前へ→

【19435】フォルダの監視&ファイルコピー ackkn 04/11/2(火) 18:43 質問[未読]
【19436】Re:フォルダの監視&ファイルコピー ちゃっぴ 04/11/2(火) 22:52 回答[未読]
【19439】Re:フォルダの監視&ファイルコピー ackkn 04/11/3(水) 8:07 質問[未読]
【19447】Re:フォルダの監視&ファイルコピー Kein 04/11/3(水) 15:42 発言[未読]
【19448】Re:フォルダの監視&ファイルコピー ackkn 04/11/3(水) 18:12 質問[未読]
【19449】Re:フォルダの監視&ファイルコピー [名前なし] 04/11/3(水) 20:20 発言[未読]
【19450】Re:フォルダの監視&ファイルコピー ackkn 04/11/3(水) 21:19 発言[未読]
【19451】Re:フォルダの監視&ファイルコピー ちゃっぴ 04/11/3(水) 21:59 発言[未読]
【19452】Re:フォルダの監視&ファイルコピー ackkn 04/11/3(水) 22:07 質問[未読]
【19457】Re:フォルダの監視&ファイルコピー ちゃっぴ 04/11/4(木) 0:03 発言[未読]
【19461】Re:フォルダの監視&ファイルコピー ackkn 04/11/4(木) 8:07 発言[未読]
【19462】Re:フォルダの監視&ファイルコピー IROC 04/11/4(木) 8:45 回答[未読]
【19463】Re:みなさんのご意見を下さい ackkn 04/11/4(木) 9:19 質問[未読]
【19464】Re:みなさんのご意見を下さい IROC 04/11/4(木) 9:24 回答[未読]
【19465】Re:みなさんのご意見を下さい ichinose 04/11/4(木) 9:48 発言[未読]
【19467】Re:みなさんのご意見を下さい ackkn 04/11/4(木) 10:31 発言[未読]
【19468】Re:みなさんのご意見を下さい ackkn 04/11/4(木) 11:31 質問[未読]
【19469】Re:みなさんのご意見を下さい ichinose 04/11/4(木) 11:44 発言[未読]
【19470】Re:みなさんのご意見を下さい Kein 04/11/4(木) 13:49 発言[未読]
【19471】Re:みなさんのご意見を下さい ackkn 04/11/4(木) 15:47 発言[未読]
【19472】Re:みなさんのご意見を下さい IROC 04/11/4(木) 16:27 回答[未読]
【19473】Re:みなさんのご意見を下さい Kein 04/11/4(木) 16:40 回答[未読]
【19474】Re:みなさんのご意見を下さい ackkn 04/11/4(木) 17:08 発言[未読]
【19480】Re:みなさんのご意見を下さい Kein 04/11/4(木) 20:55 発言[未読]
【19478】Re:みなさんのご意見を下さい ackkn 04/11/4(木) 20:19 質問[未読]
【19481】Re:みなさんのご意見を下さい Kein 04/11/4(木) 21:00 発言[未読]
【19476】Re:みなさんのご意見を下さい ackkn 04/11/4(木) 19:51 質問[未読]
【19477】Re:みなさんのご意見を下さい ちゃっぴ 04/11/4(木) 20:09 発言[未読]
【19479】Re:みなさんのご意見を下さい ackkn 04/11/4(木) 20:37 お礼[未読]
【19482】Re:みなさんのご意見を下さい ちゃっぴ 04/11/4(木) 21:17 回答[未読]
【19484】Re:みなさんのご意見を下さい ichinose 04/11/4(木) 22:29 発言[未読]
【19492】Re:みなさんのご意見を下さい ackkn 04/11/5(金) 9:20 回答[未読]
【19489】Re:みなさんのご意見を下さい [名前なし] 04/11/5(金) 0:19 発言[未読]
【19490】Re:みなさんのご意見を下さい Kein 04/11/5(金) 0:45 発言[未読]
【19494】Re:みなさんのご意見を下さい ackkn 04/11/5(金) 10:20 発言[未読]
【19497】Re:みなさんのご意見を下さい Kein 04/11/5(金) 13:23 回答[未読]
【19500】Re:みなさんのご意見を下さい ackkn 04/11/5(金) 14:01 発言[未読]
【19502】Re:みなさんのご意見を下さい vba97_pass 04/11/5(金) 14:55 発言[未読]
【19503】Re:みなさんのご意見を下さい vba97_pass 04/11/5(金) 15:07 発言[未読]
【19504】Re:みなさんのご意見を下さい ackkn 04/11/5(金) 19:48 質問[未読]
【19506】Re:みなさんのご意見を下さい Kein 04/11/5(金) 21:22 発言[未読]

【19435】フォルダの監視&ファイルコピー
質問  ackkn  - 04/11/2(火) 18:43 -

引用なし
パスワード
   いつもお世話になっております。
どなたかご教示下さい。
あるフォルダを監視して、そこにファイルが作られたら、そのファイルを別のフォルダに名前を変えて(ファイル名に連番を付加)コピーするなんて事を、Excelマクロで実現したいのですが、可能でしょうか?
よろしくお願いします。

【19436】Re:フォルダの監視&ファイルコピー
回答  ちゃっぴ  - 04/11/2(火) 22:52 -

引用なし
パスワード
   >あるフォルダを監視して、そこにファイルが作られたら、そのファイルを別のフォルダに名前を変えて(ファイル名に連番を付加)コピーするなんて事を、Excelマクロで実現したいのですが、可能でしょうか?

そういうことをしたいのであれば、VBとかでやったほうがいいでしょうね。
多分、API使いまくりでしょうが・・・

【19439】Re:フォルダの監視&ファイルコピー
質問  ackkn  - 04/11/3(水) 8:07 -

引用なし
パスワード
   ▼ちゃっぴ さん:
ちゃっぴさん、おはようございます。
レスありがとうございます。
>そういうことをしたいのであれば、VBとかでやったほうがいいでしょうね。
やはり、VBA では無理なのでしょうか?
>多分、API使いまくりでしょうが・・・
そこまで複雑になりますかねー?
よろしくお願いします。

【19447】Re:フォルダの監視&ファイルコピー
発言  Kein  - 04/11/3(水) 15:42 -

引用なし
パスワード
   ↓このへんを参考にして下さい。
http://search.acty-net.ne.jp/vb_search/archive/2001-1/msg01811.html
以前、クリップボードを監視するコピーイベントのマクロを作ろうとしたことが
ありますが、エクセルが落ちまくって使いものにならなかったです。
フォルダー監視のプログラムは試していませんが、似たようなことにならなければ
いいのですが・・。

【19448】Re:フォルダの監視&ファイルコピー
質問  ackkn  - 04/11/3(水) 18:12 -

引用なし
パスワード
   ▼Kein さん:
Kein さん、こんばんは。
レスありがとうございます、またまたお世話になります。
>↓このへんを参考にして下さい。
>http://search.acty-net.ne.jp/vb_search/archive/2001-1/msg01811.html
めっちゃ複雑!!、じっくり考えてみますが、
あまりレスが付かないので、自分なりに下手な考えをしていました。
APIのSleep(下記)で待機しながら、Dir関数でファイルの存在を調べるのでは実現
できないかなーなんて考えは甘すぎるのでしょうか?

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

>フォルダー監視のプログラムは試していませんが、似たようなことにならなければ
>いいのですが・・。
本当です。
監視するという行為は、何か難しいみたいですね。
でも、何とか実現させたいのでよろしくお願いします。

【19449】Re:フォルダの監視&ファイルコピー
発言  [名前なし]  - 04/11/3(水) 20:20 -

引用なし
パスワード
   OnTime メソッドだとだめかな?

【19450】Re:フォルダの監視&ファイルコピー
発言  ackkn  - 04/11/3(水) 21:19 -

引用なし
パスワード
   ▼[名前なし] さん:
[名前なし] さん、こんばんは。
レスありがとうございます。
>OnTime メソッドだとだめかな?
OnTimeも調べましたが、最低単位が1秒なので...
出来れば、0.5秒サイクルでチェックしたいので、APIのSleepでどうにかならな
いかなと考えた次第です。
よろしくお願いします。

【19451】Re:フォルダの監視&ファイルコピー
発言  ちゃっぴ  - 04/11/3(水) 21:59 -

引用なし
パスワード
   >出来れば、0.5秒サイクルでチェックしたいので、APIのSleepでどうにかならな
>いかなと考えた次第です。

Eventを使用しないと通常の作業が重たくなって使い物にならないと思います。

【19452】Re:フォルダの監視&ファイルコピー
質問  ackkn  - 04/11/3(水) 22:07 -

引用なし
パスワード
   ▼ちゃっぴ さん:
ちゃっぴ さん、こんばんは。
レスありがとうございます。
>Eventを使用しないと通常の作業が重たくなって使い物にならないと思います。
すいません、初心者で意味が解りません。
具体的なコードで、実感させてもらえませんか?
よろしくお願いします。

【19457】Re:フォルダの監視&ファイルコピー
発言  ちゃっぴ  - 04/11/4(木) 0:03 -

引用なし
パスワード
   >具体的なコードで、実感させてもらえませんか?

たとえば、ExcelのSheetのイベントにChageイベントがありますよね。
それをイベントを使わずにやろうとするとこんな感じになると思います。

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub GetEventChange()
  Dim vntPrvData As Variant
  Dim vntNewData As Variant
  Dim lngRowCount As Long
  Dim lngColCount As Long
  Dim i As Long, j As Long
  
  vntPrvData = ActiveSheet.UsedRange.Value
  lngRowCount = UBound(vntPrvData, 1)
  lngColCount = UBound(vntPrvData, 2)
  
  Do
    DoEvents
    Sleep 500
    vntNewData = ActiveSheet.UsedRange.Value
    
    If lngRowCount <> UBound(vntNewData, 1) _
      Or lngColCount <> UBound(vntNewData, 2) Then
      
      MsgBox "Change"
      vntPrvData = ActiveSheet.UsedRange.Value
    End If
    
    For i = 1 To lngRowCount
      For j = 1 To lngColCount
        If vntPrvData(i, j) <> vntNewData(i, j) Then
          MsgBox "Change"
          vntPrvData = ActiveSheet.UsedRange.Value
        End If
      Next j
    Next i
  Loop
End Sub

面倒なので、値が変わったということだけをチェックしていますが
イベントを使用するよりもはるかに重たいです。

もっとも、データがびっしり埋まっているシートに対して
行なうと地獄をみます。

これでお分かりになりましたか?

なお、前にも言いましたが、この手の処理はExcelで行なわないほうがよいです。

Excel VBAだと別Processで動作させることができないので、
あるマクロが走っている間、他のマクロを起動させることができません。

素直に、VBなりCなりJavaなりちゃんとしたProgram言語で
開発することをお勧めします。

【19461】Re:フォルダの監視&ファイルコピー
発言  ackkn  - 04/11/4(木) 8:07 -

引用なし
パスワード
   ▼ちゃっぴ さん:
ちゃっぴ さん、おはようございます。
レスありがとうございます。
やっと意味が解りましたが、一切 Eventを使わないなどとは言っていません。
OnTimeは使えないけど、何らかの形で実現したいのです。
>なお、前にも言いましたが、この手の処理はExcelで行なわないほうがよいです。
何とか実現させる方法をご教示してはもらえないでしょうか?
>Excel VBAだと別Processで動作させることができないので、
>あるマクロが走っている間、他のマクロを起動させることができません。
これは、同一Excel上での話ですよね?

【19462】Re:フォルダの監視&ファイルコピー
回答  IROC  - 04/11/4(木) 8:45 -

引用なし
パスワード
   >何とか実現させる方法をご教示してはもらえないでしょうか?
do〜loopなどのループ処理のなかで、sleepで停止しつつ
dir関数でチェックするのですよね?
試しに作ってみれば、実現できても、
実用的ではないということが分かると思いますが・・

【19463】Re:みなさんのご意見を下さい
質問  ackkn  - 04/11/4(木) 9:19 -

引用なし
パスワード
   すいません、Keinさん、Asakiさん、Jakaさん、Hirohumiさん、IROCさん、
今迄お世話になった皆さんにお尋ねします。
今回の件ですが、もう少し詳しく状況を説明しますので、VBAでの実現が可能かどうかのご意見をよろしくお願い致します。

ネット上のあるPCから今回の対象PCのあるフォルダにテキストファイル(大きい時で約150K程度、平均約50K程度)が転送されてきます。(1ファイルのみで、転送後電話連絡あり) このテキストを対象PC上でAccessのマクロによりDOS窓でのFTPによりホストへ転送しています。(ホスト転送のトリガは、Access上でのコマンドボタン起動で、転送後にAccessマクロにて、テキスト削除)
この一連の作業の途中で(電話連絡から、Accessのコマンドボタンを押す迄の間で)、このテキストファイルをExcelに取り込みたいのです。
こう言うと、Accessのマクロで対応するのが一番と言われるのは承知の上で、敢えてお願いしていますのは、システム保証と予算の関係でAccessには手が入れられません。
対象PCで、この一連の作業中は、これらだけしか稼動していません。
いつも勝手ばかり言って、申し訳ありませんが、何とか実現させたいので、
前向きなご意見を是非よろしくお願い致します。

【19464】Re:みなさんのご意見を下さい
回答  IROC  - 04/11/4(木) 9:24 -

引用なし
パスワード
   試しにEXCELマクロを作成して、実用可能か検証してみては如何でしょうか?

【19465】Re:みなさんのご意見を下さい
発言  ichinose  - 04/11/4(木) 9:48 -

引用なし
パスワード
   皆さん、おはようございます。
>試しにEXCELマクロを作成して、実用可能か検証してみては如何でしょうか?
とIROCさんがおっしゃっていますね!!
私も賛成です。

監視は、私も遊びと実験を兼ねて何回か簡単なものを作った事があります。
でも、実用するには、不安材料があったし、そのような案件もなかったし・・。

Excel2000から、VBAでも独自イベントが作成できますよね!!
これで実験(デバッグ)してみて下さい。

・新規ブックのSheet1にコントロールツールボックスのコマンドボタンを二つ
作成して下さい。
Commandbutton1----監視開始
Commandbutton2----監視終了

・クラスモジュールを作成して下さい(クラス名は、Class1)
そのClass1のモジュールに、
'==================================
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private fso As Object
Private i_fld As Object
Private i_flcnt As Long
Event addfile(ByVal flcnt As Long)
Public m_stop As Boolean
'========================================================
Sub set_init_flcnt(fldnm As String)
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set i_fld = fso.GetFolder(fldnm)
  i_flcnt = i_fld.Files.Count
  Set fso = Nothing
End Sub
'========================================================
Sub fld_ment()
'ここが監視実行プロシジャーですが、
'簡単なロジックでしかチェックしていません。
'実際には、初期ファイルリストを作成して、照合を行うような方法だと思います
'ここでは、ファイル数が増えたら、イベントを発生させるようにしています
  Dim c_fld As Folder
  m_stop = False
  Do While m_stop = False
   DoEvents
   Call Sleep(300)
   If i_fld.Files.Count > i_flcnt Then
     i_flcnt = i_fld.Files.Count
     RaiseEvent addfile(i_flcnt)
     End If
   Loop
End Sub


・次にコマンドボタンを作成したSheet1のモジュールに

'===============================================================
Private WithEvents flmet As Class1
'===============================================================
Private Sub CommandButton1_Click()
'監視開始ボタン
  Set flmet = New Class1
  With flmet
   .set_init_flcnt ("D:\My Documents\cd")
   .fld_ment
   End With
End Sub
'================================================================
Private Sub CommandButton2_Click()
'監視終了ボタン
  flmet.m_stop = True
End Sub
'================================================================
Private Sub flmet_addfile(ByVal flcnt As Long)
' ファイル数が増えたら、セルA1にファイル数セット
  Cells(1, 1).Value = flcnt
End Sub


こんなコードで一見すると、動いているように見えます。
但し、監視開始後のExcelの動きは、重いです。

前述しましたが、実際に監視するチェックはもっと複雑です。
この程度のロジックで実験してみて、問題ないのなら次のステップに・・・
というように実験してみたらどうですか?

【19467】Re:みなさんのご意見を下さい
発言  ackkn  - 04/11/4(木) 10:31 -

引用なし
パスワード
   ▼ichinose さん:
ichinose さん、おはようございます。
早速のレスありがとうございます。
>>試しにEXCELマクロを作成して、実用可能か検証してみては如何でしょうか?
>とIROCさんがおっしゃっていますね!!
>私も賛成です。
かなりショックですが、これが現実なのでしょうか... (T_T)
>Excel2000から、VBAでも独自イベントが作成できますよね!!
>これで実験(デバッグ)してみて下さい。
ありがとうございます。m(_ _)mm(_ _)mm(_ _)m
即、試してみます。

【19468】Re:みなさんのご意見を下さい
質問  ackkn  - 04/11/4(木) 11:31 -

引用なし
パスワード
   ▼ichinose さん:
ichinose さん、すいません。
早速動かしてみましたら、下記の行でコンパイルエラーが発生して動きません。
(エラー内容:ユーザ定義型は定義されていません)
ご教示下さい、よろしくお願いします。
>'========================================================
>Sub fld_ment()
>'ここが監視実行プロシジャーですが、
>'簡単なロジックでしかチェックしていません。
>'実際には、初期ファイルリストを作成して、照合を行うような方法だと思います
>'ここでは、ファイル数が増えたら、イベントを発生させるようにしています
>  Dim c_fld As Folder ←←← ここで
>  m_stop = False
>  Do While m_stop = False
>   DoEvents
>   Call Sleep(300)
>   If i_fld.Files.Count > i_flcnt Then
>     i_flcnt = i_fld.Files.Count
>     RaiseEvent addfile(i_flcnt)
>     End If
>   Loop
>End Sub

【19469】Re:みなさんのご意見を下さい
発言  ichinose  - 04/11/4(木) 11:44 -

引用なし
パスワード
   ▼ackkn さん:
失礼しました。
消し忘れです
>ichinose さん、すいません。
>早速動かしてみましたら、下記の行でコンパイルエラーが発生して動きません。
>(エラー内容:ユーザ定義型は定義されていません)
>ご教示下さい、よろしくお願いします。
>>'========================================================
>>Sub fld_ment()
>>'ここが監視実行プロシジャーですが、
>>'簡単なロジックでしかチェックしていません。
>>'実際には、初期ファイルリストを作成して、照合を行うような方法だと思います
>>'ここでは、ファイル数が増えたら、イベントを発生させるようにしています
>>  Dim c_fld As Folder ←←← ここで
'使ってないので、削除して下さい
>>  m_stop = False
>>  Do While m_stop = False
>>   DoEvents
>>   Call Sleep(300)
>>   If i_fld.Files.Count > i_flcnt Then
>>     i_flcnt = i_fld.Files.Count
>>     RaiseEvent addfile(i_flcnt)
>>     End If
>>   Loop
>>End Sub

【19470】Re:みなさんのご意見を下さい
発言  Kein  - 04/11/4(木) 13:49 -

引用なし
パスワード
   んー・・結局ですね、あなたが当初の考え方をゴリ押ししてる以上、解決できない
ということではないでしょーか ? どーしても0.5秒間隔でチェックしないとマズイ
のですか ? 例えば OnTimeのマクロを1分間隔で再帰呼び出しするマクロで、
いくつか貯まったファイルを一気に移動する、その際順番を重視する必要があれば、FileAccessTimeを取得して並べ替え処理する。などの妥協は出来ませんか ?
とにかく負荷がかかりすぎるマクロは、一度や二度はうまくいっても三度目も成功する
とは限らないです。それほど不安定なマクロなど、使い道があると考えますか・・。

【19471】Re:みなさんのご意見を下さい
発言  ackkn  - 04/11/4(木) 15:47 -

引用なし
パスワード
   ▼Kein さん:
Kein さん、こんにちは。
レスありがとうございます。
>それほど不安定なマクロなど、使い道があると考えますか・・
いえ、趣味の世界ではないので、あくまでも安定性を重視したいです。
>どーしても0.5秒間隔でチェックしないとマズイのですか ? 例えば OnTimeのマク
>ロを1分間隔で再帰呼び出しするマクロで...
先にも書きましたが、1ファイルずつ処理するので、貯めれません。
よって、チェックを3秒迄延ばしてOnTimeでの妥協案も併せて視野に入れたいと思いますので、その方法をご教示下さいませんか。
よろしくお願いします。m(_ _)m

【19472】Re:みなさんのご意見を下さい
回答  IROC  - 04/11/4(木) 16:27 -

引用なし
パスワード
   Ontimeメソッドの使い方であれば、
VBAのヘルプの 「OnTime メソッドの使用例」が参考になると思います。


http://www.microsoft.com/japan/msdn/library/ja/off2000/vbaxl/html/xlmthontime.asp

【19473】Re:みなさんのご意見を下さい
回答  Kein  - 04/11/4(木) 16:40 -

引用なし
パスワード
   概ねこんな感じです。

Sub MySC()
  Application.OnTime Time + TimeValue("00:00:03"), "Ck_File"
End Sub

Sub Ck_File()
  Dim CkF As String
  Dim Nt As Date
 
  Nt = Time
  If Nt > TimeSerial(16, 39, 1) Then Exit Sub
  CkF = Application.DefaultFilePath & "\*.xls"
  If Dir(CkF) <> "" Then
   MsgBox CkF
  End If
  Call MySC
End Sub

>TimeSerial(16, 39, 1)
の引数を、1〜2分後にしてテストしてみて下さい。

【19474】Re:みなさんのご意見を下さい
発言  ackkn  - 04/11/4(木) 17:08 -

引用なし
パスワード
   ▼Kein さん:
Kein さん、こんにちは。
早速のレス、ありがとうございます。
>TimeSerial(16, 39, 1)
>の引数を、1〜2分後にしてテストしてみて下さい。
即動かして、負荷の感じを見てみます。
ありがとうございます。m(_ _)mm(_ _)mm(_ _)m

【19476】Re:みなさんのご意見を下さい
質問  ackkn  - 04/11/4(木) 19:51 -

引用なし
パスワード
   ▼ichinose さん:
ichinose さん、こんばんは。
結果報告と相談です。
まず、結果ですが、Sleep(500)にして実機でテストしましたが、ほぼOKです。
ほんのチョット重たさを感じますが、問題ないレベルだと思いました。
まずは、第1関門クリアです。
でも、今の簡単なチェックでの話なので、処理を追加したとたんゴトッと重たくなるのかなーー
で、次は相談なんですが、Keinさんからの意見のことです。
確かに最初の思いは上記の0.5secぐらいの間隔でチェックしたいと思っていました。 でも、ここまで皆さんに厳しい現実を言われると、初心者の私としても仕事(趣味の世界じゃない)の事なので、やはり安定性を重視(安心して使える)して、妥協案を考え始めました。 そこで、ichinose さんに相談なんですが、正直なところ3秒間隔でもよいとした場合、OnTime が使用できますが、それで組んだ場合の負荷と、今回の ichinose さんのコードでの負荷では、どちらが軽いのでしょうか?
ichinose さんも、私の最初の思いを汲んで頂いての今のコードだと思いますので、
なーんだ3秒でいいの?、だったら OnTime を使ってこうやれば解決するじゃん!
なんて話になるのでしょうか?
どうか、よろしくご教示下さい。
お願い致します。m(_ _)m

【19477】Re:みなさんのご意見を下さい
発言  ちゃっぴ  - 04/11/4(木) 20:09 -

引用なし
パスワード
   仕事で使うのでしたら、私なら間違いなくVBでKeinさんが
示したLink先の方法で行ないますね。

Ontimeにしろ、Sleepにしろ、指定時刻ごとにFolderの中身を
チェックするので、Disk Accessが発生しますし、
CPUのリソースも無駄に消費します。

VBを使ってEventで処理してしまえば、その間無駄なDisk Accessは
発生しませんし、CPUリソースも無駄に消費しなくてもすみます。
(フォルダ内のObjectが変わったというMessageを受けてから、
はじめてProgramが動き出します。それまでは眠ってます。)
ここら辺が理解できるといいのですが・・・

もっとも、そのためには厳しいAPIの修行が待ってます。

多分、今のままではFile数が増えてきた場合に地獄を見ることになるでしょう。

【19478】Re:みなさんのご意見を下さい
質問  ackkn  - 04/11/4(木) 20:19 -

引用なし
パスワード
   ▼Kein さん:
Kein さん、こんばんは。
結果報告です。
負荷は、まず問題ないと思いますが、何せメッセージボックスが3秒間隔で表示
されるので、それに答える方が大変で、他のアプリの動作を見る暇がありません。
そこでお願いですが、自己完結型の処理で再度テストをしてみたいのですが、
その方法をご教示願えませんか?
それと、
>TimeSerial(16, 39, 1)
>の引数を、1〜2分後にしてテストしてみて下さい。
この途中で、VBEからリセットボタンを押しても止まりませんが、これは仕様な
のでしょうか?
であれば、止める手はないのでしょうか?
超抜けた質問であれば、初心者ですのでお許し下さい。
よろしくお願いします。m(_ _)m

【19479】Re:みなさんのご意見を下さい
お礼  ackkn  - 04/11/4(木) 20:37 -

引用なし
パスワード
   ▼ちゃっぴ さん:
ちゃっぴ さん、こんばんは。
レス、ありがとうございます。
>VBを使ってEventで処理してしまえば、その間無駄なDisk Accessは
>発生しませんし、CPUリソースも無駄に消費しなくてもすみます。
>(フォルダ内のObjectが変わったというMessageを受けてから、
> はじめてProgramが動き出します。それまでは眠ってます。)
>ここら辺が理解できるといいのですが・・・
確かに仰っている事は判ります、私も意固地でExcelを使っている訳ではありませ
ん、超初心者ですが自分なりに片言でも手が出せる環境が、Excelという道具だと
言う事なんです。 だから、ちゃっぴ さんなんかに言わせれば、まだExcelなんかでやろうとしているの?! かも知れませんが、超初心者の私にとってはこの時間
、けして無駄にはならないと思っています。
>多分、今のままではFile数が増えてきた場合に地獄を見ることになるでしょう。
先に何度か言いましたが、ファイルは1個から増えません。
1個処理しては、送信(FTP)→削除、また次の1個が送られてきて処理するの繰り
返しです。
と言う訳で、ご期待に添えるレベルでなくて申し訳ありませんが、こんな私に別
世界の一端を見せて頂き、ありがとうございます。
今後ともよろしくお願い致します。

【19480】Re:みなさんのご意見を下さい
発言  Kein  - 04/11/4(木) 20:55 -

引用なし
パスワード
   いちおう処理時間を任意に設定できる、テスト用マクロを提示しておきます。

Sub SC_Start()
  Dim Lst As Date
 
  Do
   Lst = Application _
   .InputBox("処理時間を10分以内で入力して下さい", _
    , "00:00:30", Type:=1)
   If Lst = False Then Exit Sub
  Loop While IsDate(Lst) = False Or Lst > TimeValue("00:10:00")
  Lst = Time + TimeValue(Lst)
  Call MySC(Lst)
End Sub

Sub MySC(Lst As Date)
  Application.OnTime Time + TimeValue("00:00:03"), _
  "'Ck_File" & """" & Lst & "'"
End Sub

Sub Ck_File(Lst As Date)
  Static TM As Date
  Dim MyF As String
  Dim WshShell As Object
 
  If TM = "0:00:00" Then TM = Lst
  If Time > TM Then
   TM = "0:00:00"
   MsgBox "処理時間が経過したので終了します", 64: Exit Sub
  Else
   Lst = TM
  End If
  MyF = Dir(Application.DefaultFilePath & "\*.xls")
  If MyF <> "" Then
   Set WshShell = CreateObject("WScript.Shell")
   WshShell.Popup MyF, 2
   Set WshShell = Nothing
  End If
  Call MySC(Lst)
End Sub

SC_Start マクロを実行して、入力フォームに10分までの時間を入力して下さい。
3秒毎に表示するメッセージは、ボタンを押さなくても放っておくと2秒で消えます。
最後に終了メッセージが出るので、それだけは OK ボタンを押してください。

【19481】Re:みなさんのご意見を下さい
発言  Kein  - 04/11/4(木) 21:00 -

引用なし
パスワード
   この1つ上に回答してます。
>止める手はないのでしょうか?
それは出来なくもないけど、実際の運用となると途中で止めるのでなく、
最初の処理時間をしっかり設定することで問題ないはずです。

【19482】Re:みなさんのご意見を下さい
回答  ちゃっぴ  - 04/11/4(木) 21:17 -

引用なし
パスワード
   >先に何度か言いましたが、ファイルは1個から増えません。
>1個処理しては、送信(FTP)→削除、また次の1個が送られてきて処理するの繰り
>返しです。

ということなら、WSH使ってみては?
Excelを常に起動するよりいいでしょう。


Const TARGET_FOLDER = "対象フォルダパス"

Dim objFSO, objFolder, colFiles, objFile, lngRet

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(TARGET_FOLDER)

Do
  WScript.Sleep 500
  Set colFiles = objFolder.Files
  If colFiles.Count Then
     For Each objFile In colFiles
       WScript.Echo objFile.Name
     Next
     Exit Do
  End If
Loop

これをText Editorで打ち込み、拡張子「vbs」で保存して
実行してみてください。

私の環境ではストレスをほとんど感じませんでした。

【19484】Re:みなさんのご意見を下さい
発言  ichinose  - 04/11/4(木) 22:29 -

引用なし
パスワード
   ▼ackkn さん:
こんばんは。
今、帰ってきたところですが、もう既にいくつか別解が投稿されていますね!!
>結果報告と相談です。
>まず、結果ですが、Sleep(500)にして実機でテストしましたが、ほぼOKです。
>ほんのチョット重たさを感じますが、問題ないレベルだと思いました。
>まずは、第1関門クリアです。
>でも、今の簡単なチェックでの話なので、処理を追加したとたんゴトッと重たくなるのかなーー

投稿したコードで500(Sleep)でも当該フォルダにファイルを作成するだけでも
ちょっと重い感じは否めませんよね?


>で、次は相談なんですが、Keinさんからの意見のことです。
>確かに最初の思いは上記の0.5secぐらいの間隔でチェックしたいと思っていました。 でも、ここまで皆さんに厳しい現実を言われると、初心者の私としても仕事(趣味の世界じゃない)の事なので、やはり安定性を重視(安心して使える)して、妥協案を考え始めました。 そこで、ichinose さんに相談なんですが、正直なところ3秒間隔でもよいとした場合、OnTime が使用できますが、それで組んだ場合の負荷と、今回の ichinose さんのコードでの負荷では、どちらが軽いのでしょうか?

マクロが止まる分、KeinさんのOnTimeメソッド使用がよいと思いますけどねえ!!

当該フォルダには、結局、1つのファイルがある状態か又は、0ということなんでしょうか?

ちゃっぴさんのVBS使用も、よさそうですね。

Excelで行う場合、Ontimeメソッドでの繰り返しは、過去ログにもいくつかあると思いますよ
(私も一度ぐらいは投稿した覚えがあります)。

  OnTime

で検索してみてはいかがでしょうか?

【19489】Re:みなさんのご意見を下さい
発言  [名前なし]  - 04/11/5(金) 0:19 -

引用なし
パスワード
   ▼ackkn さん:
>ネット上のあるPCから今回の対象PCのあるフォルダにテキストファイル(大きい時で約150K程度、平均約50K程度)が転送されてきます。(1ファイルのみで、転送後電話連絡あり) このテキストを対象PC上でAccessのマクロによりDOS窓でのFTPによりホストへ転送しています。(ホスト転送のトリガは、Access上でのコマンドボタン起動で、転送後にAccessマクロにて、テキスト削除)
>この一連の作業の途中で(電話連絡から、Accessのコマンドボタンを押す迄の間で)、このテキストファイルをExcelに取り込みたいのです。

Accessでボタン押してファイルを削除するまでは、Excelで何度も同じ処理をしてしまう
わけですよね。(ファイルが存在し続けるわけですから)
なんか無駄なことしてる気がしますが。

電話連絡→Excelでやりたい処理を1回だけする→Accessで転送後ファイルを削除

という流れでいいんじゃないかと思います。
電話が来てからAccessのボタンを押すまでの間隔が1秒未満というわけでは
ないのでしょう?

【19490】Re:みなさんのご意見を下さい
発言  Kein  - 04/11/5(金) 0:45 -

引用なし
パスワード
   >AccessのマクロによりDOS窓でのFTPによりホストへ転送
別にAccessを使わなければならない、という理由は無いのですよね ?
たとえテキストを mdb に取り込むにせよ、全部エクセルでやってしまえますが・・。

まずテキストをエクセルに取り込む → Shell関数でDOSを起動し、FTPコマンド
のバッチを走らせる → テキスト削除

・・何も難しいところはありません。フォルダー監視に比べたらずっと安定した
処理ができます。だいたい・・
>転送後電話連絡あり
こんなアナログなトリガー(?)で処理するのなら、0.5秒間隔の監視なんて何の意味
があると言うのでしょう。3秒なら妥協できるとか、そーいう次元の問題ではないです!

【19492】Re:みなさんのご意見を下さい
回答  ackkn  - 04/11/5(金) 9:20 -

引用なし
パスワード
   ▼ichinose さん:
ichinose さん、おはようございます。
レス、ありがとうございます。
>マクロが止まる分、KeinさんのOnTimeメソッド使用がよいと思いますけどねえ!!
解りました、今回は OnTimeメソッドを使用したいと思います。
>当該フォルダには、結局、1つのファイルがある状態か又は、0ということなんでしょうか?
その通りです。
>ちゃっぴさんのVBS使用も、よさそうですね。
ちゃっぴさんにも、色々な手法をお教え頂き感謝しております。
でも、VBS は経験もまったくないので、一時ポケットにしまっときます。
まずは、OnTime 版の完成を目指します。
>Excelで行う場合、Ontimeメソッドでの繰り返しは、過去ログにもいくつかあると思いますよ
>(私も一度ぐらいは投稿した覚えがあります)。
検索したら、ヒントになりそうなものがいくつかありましたので、混ぜて考えてみます。
また、詰まる思いますので、その節はよろしくお願い致します。

【19494】Re:みなさんのご意見を下さい
発言  ackkn  - 04/11/5(金) 10:20 -

引用なし
パスワード
   ▼Kein さん:
Kein さん、おはようございます。
厳しいお言葉、ありがとうございます。
>>AccessのマクロによりDOS窓でのFTPによりホストへ転送
>別にAccessを使わなければならない、という理由は無いのですよね ?
以前に下記の説明をしましたが...
>>こう言うと、Accessのマクロで対応するのが一番と言われるのは承知の上で、敢
>>えてお願いしていますのは、システム保証と予算の関係でAccessには手が入れら
>>れません。

>こんなアナログなトリガー(?)で処理するのなら、0.5秒間隔の監視なんて何の意味
>があると言うのでしょう。3秒なら妥協できるとか、そーいう次元の問題ではない
>です!
ここは単純に処理の流れだけを捉えるとそうかもしれませんので、もうチョット説明します。
今回の転送作業は、1度の作業で約8回(8ファイル)ぐらいファイル転送を繰り返すのですが、上流側の相手と電話でやり取りをしながら送ると言いましたが、実はホスト側でも受け作業があり相手がいます、よって計3名での声かけ作業な訳です。
まして今回のターゲット作業の女性は両手にPHSを持って上流と下流の2人と声かけあいながらの作業です。 まして、ファイル容量が約50K程なので、ほとんどが約10秒くらいで転送が終わってしまうので、その間にファイルを別フォルダーへコピー&リネームする訳です。 で、途中洩れが発生してファイルが取得できずに削除されてしまったのです。(これらのファイルは作業実績データで、こちらで集計、管理する為に必要なのです)
実際の作業風景を思ってもらうと過酷な作業です。(精神的に)
よって、単純に「別フォルダーへコピー&リネームする」この作業だけを自動化してもそのトリガーを忘れたら一緒なので、監視して自動でExcelに迄取り込みたかったのです。
よろしくお願いします。

【19497】Re:みなさんのご意見を下さい
回答  Kein  - 04/11/5(金) 13:23 -

引用なし
パスワード
   ま、ここは仕事の内容を相談するところじゃないから、説明は分からないけど始めに
戻って OnTime の方を進めてみましょう。昨日、私がレスしたコードは見ていない
のかもしれないけど、少し無駄を省いて再掲しておきます。

Sub SC_Start()
  Dim Lst As Date
 
  Do
   Lst = Application _
   .InputBox("処理時間を10分以内で入力して下さい", _
    , "00:00:30", Type:=1)
   If Lst = False Then Exit Sub
  Loop While IsDate(Lst) = False Or Lst > TimeValue("00:10:00")
  Lst = Time + TimeValue(Lst)
  Call MySC(Lst)
End Sub

Sub MySC(Lst As Date)
  Application.OnTime Time + TimeValue("00:00:03"), _
  "'Ck_File" & """" & Lst & "'"
End Sub

Sub Ck_File(Lst As Date)
  Dim MyF As String
  Dim WshShell As Object
 
  If Time > Lst Then
   MsgBox "処理時間が経過したので終了します", 64: Exit Sub
  End If
  MyF = Dir(Application.DefaultFilePath & "\*.xls")
  If MyF <> "" Then
   Set WshShell = CreateObject("WScript.Shell")
   WshShell.Popup MyF, 2
   Set WshShell = Nothing
  End If
  Call MySC(Lst)
End Sub

>「別フォルダーへコピー&リネームする」
が目的なら、

  Dim WshShell As Object

を削除して
 
  MyF = Dir(Application.DefaultFilePath & "\*.xls")
  If MyF <> "" Then
   Set WshShell = CreateObject("WScript.Shell")
   WshShell.Popup MyF, 2
   Set WshShell = Nothing
  End If

の部分を変更するだけで、出来るでしょう。コピーではなく移動でよいなら、
Nameステートメントのコードを1行でやってしまえます。ヘルプを調べて
改造してみて下さい。

【19500】Re:みなさんのご意見を下さい
発言  ackkn  - 04/11/5(金) 14:01 -

引用なし
パスワード
   ▼Kein さん:
>説明は分からないけど...
解って貰えませんでしたかー...(T_T)
だとすると、
>こんなアナログなトリガー(?)で処理するのなら、0.5秒間隔の監視なんて何の意味
>があると言うのでしょう。3秒なら妥協できるとか、そーいう次元の問題ではない
>です!
この問題は未解決なんですねーー(-_-)
>OnTime の方を進めてみましょう。昨日、私がレスしたコードは見ていない
>のかもしれないけど...
そんな失礼なことする訳がないじゃないですか!
でも、
>>止める手はないのでしょうか?
>それは出来なくもないけど、実際の運用となると途中で止めるのでなく、
>最初の処理時間をしっかり設定することで問題ないはずです。
この件は、ちょっと違うと思います。
今回の処理に限らず、ほとんどの処理は毎回処理時間が微妙に違うと思うので、
処理が終われば、何らかのトリガー(ESCキーやコマンドボタン等)で止めるのが普通だと思います。

さて、話をOnTimeに戻しまして、
>>「別フォルダーへコピー&リネームする」
>が目的なら、
これは、現状です。 最終的にやりたいのは、その先の
>この作業だけを自動化してもそのトリガーを忘れたら一緒なので、
>監視して自動でExcelに迄取り込みたかったのです。
これです。
今回の、Kein さん提示のコード含めて、ちょっと自分なりに考えてみます。
その後、報告相談しますので、よろしくお願いします。

【19502】Re:みなさんのご意見を下さい
発言  vba97_pass  - 04/11/5(金) 14:55 -

引用なし
パスワード
   上にあった、FindFirstChangeNotificationのVB用コード、
XL2002、XP(SP2)で動きましたよ。(少し手直しあり)
でも、監視ルーチンでループさせてる性か、あるいは、
コードが悪いのか判らないけど、エクセルが重いです。
なので、他の人のを参考にしては?

【19503】Re:みなさんのご意見を下さい
発言  vba97_pass  - 04/11/5(金) 15:07 -

引用なし
パスワード
   ▼vba97_pass さん:
>でも、監視ルーチンでループさせてる性か、あるいは、
>コードが悪いのか判らないけど、エクセルが重いです。
>なので、他の人のを参考にしては?

失礼。
よくみたら、WaitForSingleObjectがありました。

【19504】Re:みなさんのご意見を下さい
質問  ackkn  - 04/11/5(金) 19:48 -

引用なし
パスワード
   ▼Kein さん:
Kein さん、こんばんは。
>3秒毎に表示するメッセージは、ボタンを押さなくても放っておくと2秒で消えます。
2秒で消えず、[OK]ボタンを押すまで消えません。
よろしくお願いします。

【19506】Re:みなさんのご意見を下さい
発言  Kein  - 04/11/5(金) 21:22 -

引用なし
パスワード
   こちらではうまく消えますよ。最初のメッセージだけは 2秒以上かかってるみたい
ですが、コンパイルの時間などが加算されているからでしょう。
先にも書いたけど「最後に出てくる終了メッセージだけは OK ボタンで消す」
ということです。もしかしてそれと勘違いしてませんか ?
で、どちらにしてもこれはテスト用ですから、メッセージではなくセルに書き込む
とか、Debug.Print するとか別のやり方に変えてもいいのです。要は繰り返しの
スケジュールがうまく出来るか、というのがポイントです。

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