Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7全般 : Excel 2010)
時間の変換方法について
投稿日時: 19/02/09 19:14:44
投稿者: taigernotora

時間データを値に変換する方法を教えてください。
 
dim 時間 as Date
 
時間=sheet1.cells(1,1).value
 

 
sheet2.Range(cells(1,1), cells(1+時間,1)).copy
 
などのようにしたいのですが、時間は1:00:00などの値を入れたいため、どのように変換すれば良いかアイデアを頂けますと助かります。よろしくお願い致します。

回答
投稿日時: 19/02/09 19:59:00
投稿者: simple

Sheet2.Range(Sheet2.Cells(1, 1), Sheet2.Cells(1 + Hour(時間), 1)).Copy
ということですか?

回答
投稿日時: 19/02/09 20:46:54
投稿者: WinArrow
投稿者のウェブサイトに移動

そもそも
>sheet1.cells(1,1).value
にはどのようなデータが入っているんですか?
  
仮に
sheet1.cells(1,1).Valueに、「2」という値が入っている仮定すると、
 時間が Date型ですから、
1900/1/2
となります。
でも「値」は「2」ですから
>sheet2.Range(cells(1,1), cells(1+時間,1)).copy

sheet2.Range(cells(1,1), cells(1+2,1)).copy
となります。
 
sheet1.cells(1,1).Valueに、「1:0:0」という値がはいいていたならば
時間の「値」は、1/24=0.04166666666です。
この場合は、simpleさんのレスのように対応します。
 
 
しかし、このコードは、セルをシートで修飾していないので、
アクティブシートが、Sheet2以外の時、実行時エラーになります。
 
 
なお、掲示板には手入力せずに、コードペインからコピペしましょう。
  
  
  

投稿日時: 19/02/09 21:33:30
投稿者: taigernotora

コメント頂きありがとうございます。
情報が不足しており申し訳ありません。
 
sheet1には、マクロを起動させる条件を入れ
sheet2には、0:00:00〜23:59:59(0:00:01間隔)に対する温度や各種パラメータ値が5列ほどあり、
sheet3には、sheet2からsheet1で選択した条件で情報を出力したいと考えています。
 
例えば、
スタート時刻:10:15:00
出力時間:15分間
とsheet1に入力しマクロを起動させたら、sheet3に10:15:00〜10:30:00までのsheet2の情報が出力されるというものです。

回答
投稿日時: 19/02/09 22:04:17
投稿者: simple

# 極端な説明不足もどうかと思うが、適当な答えをしてしまうこちらも同罪かな。
 
ということで、要するに、秒ごとのデータがあるときに、それが何番目かという
算数の問題ですよね。
 

    Debug.Print TimeValue("10:15:00") / TimeValue("0:0:1")
    Debug.Print TimeSerial(0, 15, 0) / TimeSerial(0, 0, 1)

のようなコードがヒントになりますか?
あとは、ご自分でトライしてみて下さい。

回答
投稿日時: 19/02/10 00:14:50
投稿者: WinArrow
投稿者のウェブサイトに移動

taigernotora さんの引用:

sheet1には、マクロを起動させる条件を入れ
sheet2には、0:00:00〜23:59:59(0:00:01間隔)に対する温度や各種パラメータ値が5列ほどあり、
sheet3には、sheet2からsheet1で選択した条件で情報を出力したいと考えています。
 
例えば、
スタート時刻:10:15:00
出力時間:15分間
とsheet1に入力しマクロを起動させたら、sheet3に10:15:00〜10:30:00までのsheet2の情報が出力されるというものです。

 
(1)スタート時刻は、Sheet1のどこのセルで指定するのですか?
(2)
出力時間:15分間
とは、スタート時刻から15分間だけ(14分x60秒・・・の行数)を複写したいということですか?
ということは、Sheet2.Range(Cells(1,1)
は、間違っていますね?
スタート時刻がどの行にあるかを検索する必要があると思いますが・・・
 
(3)マウロは、どこのモジュールに記述しているのですか?
雰囲気からSHeet2モジュールに記述かな?
 
 
ヒントのコードを書きます。
Sheet1のセルA1に開始時刻を入力します。
例:10:15:00
複写は15分間・・・10:15:00〜10:29:59
になります。
 
以下を標準モジュールに記述してください
Sub Sample()
Dim 開始時刻 As Long
 
    開始時刻 = Sheets("Sheet1").Range("A1").Value * 86400 + 1
    Sheets("Sheet3").Range("A1").Resize(15 * 60).Value = Sheets("Sheet2").Range("A" & 開始時刻).Resize(15 * 60).Value
End Sub
 
 
 
 

回答
投稿日時: 19/02/10 08:55:49
投稿者: WinArrow
投稿者のウェブサイトに移動

ことのついでに注意事項
複数のシートを取り扱う場合、シートモジュールにコードを記述するのは、
エラーになり可能性が高いので、標準モジュールに記述したほうがよい。
 
シートのイベントに対応するには、
イベントキャッチでけにして、標準モジュールに記述したプロシジャをCALLするようにします。
その方がテストも非常に楽です。
 
エラーになる原因
>sheet2.Range(cells(1,1), cells(1+時間,1)).copy
このコードは、Sheet2の中のセルA1〜Axxxというセル範囲を参照するつもりだろうと
思いますが、
最初のRangeはSheet2で修飾していますが、
2番目のCells(1,1)は、シートの修飾がありません。
シートの終章がない場合、アクティブシートになります。
アクティブシートが,
Sheet1の場合
そのため、Sheet2の中にSheet1のセルは存在しませんから
エラー(コード1004)になります。
この記述は、どこのこっジュールに記述しても同じです。

投稿日時: 19/02/12 10:17:51
投稿者: taigernotora

お二人ともご回答頂きましてありがとうございます。
異なる手段で二つの方法大変参考になりました。
 
今回参考にさせていただいた方法
・TimeValue
・シリアル値を行番号に変更する計算方法( * 86400 + 1 )
・Resize関数
・標準モジュールにコードを記載する理由
 
情報の少ない中親切にご回答頂きありがとうございました。
今後ともよろしくお願いします。