エイヴォム・ワンダーランド@ビジネス

エイヴォム・ワンダーランドにようこそ! BV・VB.NET・VisualC++・API・システム構築 システムエンジニアの苦悩を公開中! 同じ悩みを持つ方、ご興味がある方、何かのヒントになれば幸いであります ( ゜Д゜)ゞ

Category: スポンサー広告   Tags: ---

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書く事で広告が消せます。

Category: Development - Excel / VB > Development - VB.NET   Tags: ---

Comment: 0  Trackback: 0

【VB.NET】簡単に経過時間を表示するには、「これ」どうですか?

今回のサンプルは VB.NET の
経過時間の表示」 についてです。

ぐるぐる回しながら大量のデータを扱う場合
一体どのくらい時間がかかったのかを知る必要があります。
なぜならば、1件処理するための時間が把握できれば
トータルどのくらいの時間がかかるかを予測することができるからです。

処理実行直後、
「あとこのくらいかかるよ」
と使用者に暫定的な時間であっても知らせることで
「待つ」という感覚を和らげることができる。
ひいては無用なストレスをかけないことにもつながりますからね。

と言うことで


Public Class TestClass

  Private Sub TestForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Dim StartDatetime As DateTime = Now
    Dim i As Integer = 0

    Dim MyFileArray As ArrayList = _
      New ArrayList(My.Computer.FileSystem.GetFiles("C:\TestFolder", FileIO.SearchOption.SearchTopLevelOnly, "Test*.xls"))
    MyFileArray.Sort()

    For Each MyFile In MyFileArray

      Dim MyOutFile As String = "C:\TestMoveFolder\Test_" & System.IO.Path.GetFileNameWithoutExtension(MyFile) & ".xls"
      i += 1

      My.Computer.FileSystem.CopyFile(MyFile, MyOutFile, True)

      Dim MyTime As Long = DateDiff(DateInterval.Second, StartDatetime, Now)
      Dim MyAVGTime As Long = Math.Round(MyTime / i)

      If i Mod 50 = 0 Then

        Me.msg.Text = Format(i, "#,##0") & " 件のエクセルワークブックをコピーしました。" & vbCrLf & _
               "経過時間:" & DateAdd(DateInterval.Second, MyTime, DateValue("00:00:00")) & vbCrLf & _
               "平均時間:" & DateAdd(DateInterval.Second, MyAVGTime, DateValue("00:00:00"))
        Me.Refresh()

      End If

      DoEvents()

    Next

    Me.msg.Text = ""
    Me.Refresh()

    MessageBox.Show("処理が終了しました。  ", "【正常終了】", MessageBoxButtons.OK, MessageBoxIcon.Information)

  End Sub


  Private Sub TestForm_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

    Me.Dispose()

  End Sub

End Class



と、こんな感じ!

では解説を

今回の処理は

「C:\TestFolder」の中にある
頭に「Test」と付いているエクセルのワークブックを
「C:\TestMoveFolder」と言うフォルダの中にコピーする。
この時、ペーストするファイルには頭に「Test_」という文字も付加します。

ここからが今回の「経過時間」の表示に関するステップ

まずは処理の開始直後に取得した時間
Dim StartDatetime As DateTime = Now

から現在の時間を使用して何秒かかったかを計算
Dim MyTime As Long = DateDiff(DateInterval.Second, StartDatetime, Now)

次に経過した時間を処理した件数で除算(割り算)することで
1件当たりにかかった時間を算出します。
Dim MyAVGTime As Long = Math.Round(MyTime / i)

次の「If i Mod 50 = 0」とは 処理した件数 i が 50 で割り切れるかチェック
つまり 50件 処理したら
フォームのメッセージエリアにメッセージを表示させるということ。

先に計算した「MyTime」は、あくまでも秒数ですから見やすくするために
DateAdd(DateInterval.Second, MyTime, DateValue("00:00:00"))
を使用します。

上記の構文を使用することで
何時間何分何秒かかったかを一目で見ることができますよね。


ここからは蛇足ですが
DoEvents()」をわざわざ使用していますが...
まぁ、通常であれば処理に負担をかける
この処理を組み込むことは避けたいと思いがちですが、
今回の処理は大量のデータを処理する
というポイントがこれ組み込んだ理由づけですかね。

それは「時間のかかる処理での応答なしを防止する」ということ。

表示しているフォームが「応答なし」と表示されてしまうと
「あれ?処理が止まっちゃっているの??」
と使用者に思われてしまいますので
それを回避するための対策になっています。

う~ん、
システム構築(小さなプログラムモジュールでもそうですが)
組み上げるシステム構築者の立場より
使用するエンドユーザの立場になってプログラムを作る必要がある
と私は考えています。

多少作るのに面倒でも
使う人にやさしいプログラムの方が浸透しやすいですからね。

と言うことで今回はこれにて
(o^□^o)ノ


※今回の開発環境「Microsoft Visual Studio 2008」WindowsOS「WindowsXP」


【送料無料】はじめてのVisual Studio 2010

【送料無料】はじめてのVisual Studio 2010
価格:3,150円(税込、送料別)



Comments


Profile



エイヴォム

管理人 : エイヴォム

エイヴォム・ワンダーランド@ビジネス
( EivomWonderland@Business )

の管理人の
エイヴォム
( Eivom )

と申します

( ゜Д゜)ゞ了解!!

VisualBasic(BV)
VisualBasic.NET(VB.NET)
VisualC++
API
システム構築
アプリケーション開発

インターネット

パソコン
iphone
その他周辺機器


ブログはビジネス情報や
システムエンジニアの苦悩の開発日記
お役立ち・おもしろアプリケーション
などをアップしています!

同じ悩みを持つ方、
ご興味がある方、
何かのヒントになれば幸いです

ヨロ━━━d(。ゝд・)━━━!!


PR







Search
QR Code
QR