スポンサーサイト 


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

--/--/--

Category: スポンサー広告

TB: --  /  CM: --

top △

Excel VBA をやってみた 


問い)

セルA1、B1 に開始日時、終了日時がある場合、以下のように A3 ~ 対象の範囲を作成する。

 AB
12011/11/01 10:002011/11/03 10:20
2  
32011/11/01 10:00 
42011/11/01 10:05 
52011/11/01 10:10 
62011/11/01 10:15 
72011/11/01 10:20 
82011/11/02 10:00 
92011/11/02 10:05 
102011/11/02 10:10 
112011/11/02 10:15 
122011/11/02 10:20 
132011/11/03 10:00 
142011/11/03 10:05 
152011/11/03 10:10 
162011/11/03 10:15 
172011/11/03 10:20 


つまり、時刻 10:00 ~ 10:20 の間で、5分おきの時刻を作成する。
(11/1 ~ 11/3 の 10:00 ~ 10:20 のものを作成する)

というのをやってみました。

Excel は慣れていないのか・・・・セルでの表示にまどわされたり・・・・
結構しんどいですね。

一応、私が作成確認してみていたのは、Vista + Excel2007 の環境です。
 
アクティブシートに対して処理するようにしてみました。
A1、B1 に日時を入力の上、動かしてみてください。
(テスト用の環境で標準モジュールに以下を転記の上)
結果は、A3~行方向に作られます。
デバッグ用に、B~E を使用しています(デバッグ部分には★を記述しています)
内容については、セル上で確認してください。
Public Sub Sample()
  Dim dS As Date, dE As Date
  Dim dt As Date, dw As Date
  Dim bEq As Boolean
  Dim s_dt As String, s_dE As String ' ☆☆2
  Dim iNzero As Integer ' ☆3
  Dim iRow As Long

  dw = CDate(Cells(1, 1))
  dS = CDate(Format(dw, "yyyy/mm/dd hh:nn"))
  dw = CDate(Cells(1, 2))
  dE = CDate(Format(dw, "yyyy/mm/dd hh:nn"))
  If (dS > dE) Then
    dw = dS
    dS = dE
    dE = dw
  End If
  bEq = False
  If (Format(dS, "hhnn") = Format(dE, "hhnn")) Then
    bEq = True
    dE = DateAdd("n", -1, dE)
  End If
  iNzero = 0 ' ☆3
  If (Format(dS, "hh:nn") = "00:00") Then iNzero = -1 ' ☆3
  dt = CDate(Format(dS, "yyyy/mm/dd ") & Format(dE, "hh:nn"))
  If (dt < dS) Then dt = dt + 1
  s_dt = Format(dt, "yyyymmddhhnn") ' ☆☆2
  s_dE = Format(dE, "yyyymmddhhnn") ' ☆☆2
  dw = dS
  iRow = 3
  Debug.Print "Start:", dS, dE, dt, dw ' ★
  Columns("A:B").NumberFormatLocal = "yyyy/mm/dd hh:mm " ' ★
  Columns("C").NumberFormatLocal = "0.0 " ' ★
  Columns("D:E").NumberFormatLocal = "0.00000000 " ' ★
'  While (dt <= dE) ' ☆☆1
  While (s_dt <= s_dE) ' ☆☆2
    If (Format(dw, "hh:nn") = "00:00") Then ' ☆3
      Cells(iRow, 1) = dw + iNzero + 1 ' ☆3
    Else ' ☆3
      Cells(iRow, 1) = dw ' ☆3
    End If ' ☆3
'    Cells(iRow, 1) = dw - (Format(dw, "hh:nn") = "00:00") ' ☆2
'    Cells(iRow, 1) = dw ' ☆1
    Cells(iRow, 2) = dw ' ★
    Cells(iRow, 3).FormulaR1C1 = "=RC[-2]-RC[-1]" ' ★
    Cells(iRow, 4).FormulaR1C1 = "=R[+1]C[-3]-RC[-3]" ' ★
    Cells(iRow, 5).FormulaR1C1 = "=R[+1]C[-3]-RC[-3]" ' ★
    iRow = iRow + 1
    dw = DateAdd("n", 5, dw)
    If (dw > dt) Then
      dw = CDate(Format(dw, "yyyy/mm/dd ") & Format(dS, "hh:nn"))
      If (dw < dt) Then dw = dw + 1
      dt = dt + 1
      s_dt = Format(dt, "yyyymmddhhnn") ' ☆☆2
      Debug.Print "Loop:", dS, dE, dt, dw ' ★
    End If
  Wend
  If (bEq) Then Cells(iRow, 1) = dw
  Debug.Print "Out:", dS, dE, dt, dw ' ★
End Sub


主要な変数は以下の用途となっています。
dS:開始日時
dE:終了日時
dt:1日分の終了日時
dw:5分を加算していくワーキング


※ 上記の☆は、動きを見ながら変更していった履歴として残しています。
  ☆1 ⇒ ☆2 ⇒ ☆3 / ☆☆1 ⇒ ☆☆2


※ ☆1 ⇒ ☆2 ⇒ ☆3 について

セルへの値設定は Cells(iRow, 1) = dw で行っていましたが、
2011/10/01 23:00 ~ 2011/10/04 01:30 とかにした時、

・・・・
2011/10/01 23:55
2011/10/02 00:00 ←
2011/10/02 00:05
・・・・
となって欲しい所が
・・・・
2011/10/01 23:55
2011/10/01 00:00 ←
2011/10/02 00:05
・・・・
となってしまいました。VBA上ではチャンとなっているけど、セル上では・・・
(何故なのかわかりません)

そこで、
Cells(iRow, 1) = dw - (Format(dw, "hh:nn") = "00:00")
と変更(00:00 なら1日足したものをセルへ設定)

ただ、これをやると
2011/10/01 00:00 ~ 2011/10/04 01:30 とか 00:00 始まり時におかしなことに・・・

そこで ☆3 に変更
(本来 ☆1 で良さそうな気がするのですが・・・・)


※ ☆☆1 ⇒ ☆☆2 について

2011/10/01 10:00 ~ 2011/10/04 10:00 とか同じ時刻の場合は、
5分おきに全部作りますが、
  While (dt <= dE)
では、最後の1日分が作られないようです。
(微妙に dt に誤差がたまった結果でしょうか?)
なので、
それぞれ Date 型を文字列 "yyyymmddhhnn" に展開したもので比較するように。
  While (s_dt <= s_dE)

※ 5分間隔しか見ていないので、開始時刻が 10:03 なら次は 10:08 になります。
※ 終了時刻を超えたらデータは作りません。


※※
私の環境での動きを見ながら変更したので、どれが適しているのかは確認してください。
確認後、★部分等、不要な箇所は削除してください。

また、この処理を使う条件を絞れば、不要になる記述は多々あると思います。


結構、しんどいですね・・・・


もうチョッと解説すると、

まず、開始/終了日時の「秒」はいらないので、削ったもので開始/終了を作成
開始/終了が逆転していたら、入れ替え
で、1回分の終了日時を作成して、ぐるぐると・・・・
・・・・・・ 後は、順に読めると思いますので、割愛
関連記事

2011/10/04

Category: なんだかな

TB: 0  /  CM: 0

top △

この記事に対するコメント

top △

コメントの投稿

Secret

top △

トラックバック

トラックバックURL
→http://kikutips.blog13.fc2.com/tb.php/98-45cb6f7a
この記事にトラックバックする(FC2ブログユーザー)

top △


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