|
お世話になっております。
kanabun氏
今回の件で質問がまた出来てしまいました。
お手数をかけてすいません。
以前記載していただいたソースでソートをした場合
日付を跨いだ際に時間が逆になってしまうことです。
エクセルのデータを確認し、TypeNameでDoubleを確認しました。
日付形式を見たところ、yyyymmddhhmmでした。
表示ではhhmmと表示されていたので、誤認しました。
それが原因で下記、マクロが上手く認識してくれなかったようです。
年月日付を考慮したシリアル値の場合、
>>If v(i, 1) > 0# And v(i, 1) < 1# Then
の部分を修正すれば、上手く認識するでしょうか?
度々、質問してしまい申し訳ありませんが、
よろしくお願いします。
Sub Try1()
Dim v, u, i As Long
Dim r As Range
Set r = Range("A1", Cells(Rows.Count, 1).End(xlUp).Offset(1))
v = r.Value2
For i = 1 To UBound(v)
If v(i, 1) > 0# And v(i, 1) < 1# Then
u = v(i, 1)
Else
v(i, 1) = u
End If
Next
r.Offset(, 2).Value = v
r.Resize(, 3).Sort r.Columns(3), Header:=xlNo
Stop
Columns(3).Clear
End Sub
▼kanabun さん:
>▼シンク さん:
>>kanabun氏、返信ありがとうございます。
>>
>>下記の件について、試してみたところ問題があるようです。
>
>>If文の表現に問題があるのかと思いました。
>>すべてElseにいっているようです。
>>> For i = 1 To UBound(v)
>>> If v(i, 1) > 0# And v(i, 1) < 1# Then
>そこのIf文は A列のデータが 9:00 や 8:12 など「時刻」データである
>かどうかを判定しているところです。
>もし 9:00 とかの時刻データであれば、そのセルの Valueは 9:00 で、
>そのセルの Value2 は 0.375 です。(Value = 9:00 のセルの Value2 は
>0.375 つまりシリアル値 です )
>したがって
>> If v(i, 1) > 0# And v(i, 1) < 1# Then
>の行は 時刻の代入されているセルかどうかを調べているわけです。
>時刻は 0:00 〜 24:00 の値をとりますから、Value2としては
>0.0 〜 1.0 の範囲になります。それを判定しているわけです。
>(ただし、空白セルも、時刻 00:00 のセルも 数値にすると 0 ですから
>00:00 というデータがあると、ほんとはちょっとまずいのですが)
>
>で、 9:00 とか 8:12 とかのセルを選択して 以下を実行してDebugして
>もらえないですか?
>Sub checkDataType()
> MsgBox TypeName(ActiveCell.Value)
>End Sub
>こちらで、9:00 とか 8:12 とかのセルをポイントして ↑を実行しますと
>MsgBox には Double と表示されます。
>そちらではどうですか?
>もし String とか表示されてるとすると、これでは
>> If v(i, 1) > 0# And v(i, 1) < 1# Then
>の範囲に入りません(文字列です)ので Else のほうに行っちゃって、
>If文の判定に失敗してます。
|
|