ここから本文です

エクセルVBAについてご質問です。 A列に「120545」と時間が6桁で10000行に渡って...

mou********さん

2019/5/3006:52:24

エクセルVBAについてご質問です。
A列に「120545」と時間が6桁で10000行に渡って表記されていた場合。この例では12時05分45秒という意味です。表示形式は文字列。

For next文で「もしcell(i

,”A”)以外のcell(j “A”)が1秒以上10分以内であればcell(i,”B”)に○を付ける」の時間判定の部分が上手くいきません。下の場合だと●●●の部分です。
For i = 1 to 10000
For j = 1 to 10000
If ●●● then
Cell(i,”B”) = “○”
End if
Next j
Next i

文字列の120545を時間に変換してからの作業だと思われますが、、、どうかお知恵をお貸しください。
宜しくお願い致します。

閲覧数:
37
回答数:
3
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

jiy********さん

2019/5/3010:59:31

10000行だと時間もだいぶかかるので配列を使いました。
時間に変換する必要はないですね。今回の場合、1秒は1、10分は1000です。

テストしたところ13秒から14秒ほどかかりました。もっと高速化できる書き方があるかも知れません。

Sub sample()
    Dim v1 As Variant, v2 As Variant
    Dim i As Long, j As Long
    Dim idiff As Long
    
    With Range("A1:A10000")
        v1 = .Value
        ReDim v2(1 To UBound(v1))
        For i = 1 To UBound(v1) - 1
            For j = i + 1 To UBound(v1)
                idiff = Abs(v1(i, 1) - v1(j, 1))
                If idiff >= 1 And idiff <= 1000 Then
                    v2(i) = "○"
                    v2(j) = "○"
                End If
            Next j
        Next i
        .Offset(, 1).Value = v2
    End With
End Sub

  • jiy********さん

    2019/5/3011:34:22

    A列のデータに重複が多ければ、Dictionaryを使って高速化できます。もしデータがバラバラであれば先ほどの回答のほうが速いです。

    文字数制限があるので2回に分けて書きます。

    Sub sample()
        Dim dic As Object, kys() As Variant
        Dim v1 As Variant
        Dim i As Long, j As Long
        Dim idiff As Long
        
        Set dic = CreateObject("Scripting.Dictionary")
        With Range("A1:A10000")
            v1 = .Value
            For i = 1 To UBound(v1)
                On Error Resume Next
                dic.Add v1(i, 1), ""
                On Error GoTo 0
            Next i
            

  • その他の返信(1件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2019/5/30 13:28:59

解決できました。助かりました。
本当にありがとうございました!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

tok********さん

2019/5/3010:00:41

数字に直して下4桁を取り出して判定とか。

Sub test()
Dim lng
lng = CLng(Mid(Range("P2"), 3, 4))
If lng >= 1 And 1000 >= lng Then _
MsgBox "1秒以上10分以内です。"
End Sub

ine********さん

2019/5/3008:27:05

「もしcell(i ,”A”)以外のcell(j “A”)が>
これ同じじゃないですか

For i = 1 to 10000
For j = 1 to 10000

変数に代入する数値が同じ。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる