[[20180828135652]] 『フリーズ?してしまう』(TAKA) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『フリーズ?してしまう』(TAKA)

質問させてください。

  A    B       C       D     E      F          G
 ID  名前  ふりがな  性別  年齢   誕生日   都道府県  
  1    A      えー    女    72   1946/7/10  宮城県
  2    B      びー    女    48   1969/2/10  長野県
  3    C      しー    男    22   1996/9/13  千葉県
  4    D      でー    女    53   1965/3/26  鹿児島県
  5    E      いー    男    71   1946/11/7  広島県
  6    F      えふ    女    75   1943/2/12  神奈川県

このような七列のデータが Sheet1 にあります。
このデータをランダムで並び替えたいとのことで、
以下のマクロを作成しました。

    Sub Macro1()
        Dim Ws1 As Worksheet, Lr As Long
        Set Ws1 = ThisWorkbook.Sheets("Sheet1")
        With Ws1
            Lr = .Cells(.Rows.Count, "A").End(xlUp).Row
            .Range("H2").Resize(Lr - 1, 1) = "=RAND()"
            .Range("A1").CurrentRegion = .Range("A1").CurrentRegion.Value
            .Range("A1").CurrentRegion.Sort (.Range("H2"))
        End With
    End Sub

サンプルデータで実際に動かしてみたところ
動かないどころかExcelがフリーズして閉じれなくなりました。

閉じれないのはなんとかなるので大丈夫ですが、
何が間違っているのか私には分かりません、、

どなたか分かる方教えてください。。。

< 使用 Excel:Excel2013、使用 OS:Windows10 >


コードを見た限りの感想ですが、
> .Range("H2").Resize(Lr - 1, 1) = "=RAND()"
 数式を埋め込むならFormulaのほうが適切かも

> .Range("A1").CurrentRegion.Sort (.Range("H2"))
 RAND()の計算が終わる前にソートされてるかも
 Application.Calculateを入れると改善されたりして。

そして、そもそもVBAを使うならRandomizeの後にrndを実行して値を直接書き込んだ方が良いのでは?と思いました。
(にゅるん) 2018/08/28(火) 14:29


 私の環境(Excel2010+Windows10)では
 >.Range("A1").CurrentRegion.Sort (.Range("H2"))
 ここで参照が正しくありませんのエラーとなった。
 これは
 >.Range("A1").CurrentRegion.Sort .Range("H2")
 とすることで回避できたが見出し部分もソート対象になっていた。
(ねむねむ) 2018/08/28(火) 14:35

見当違いの回答をしてしまい申し訳ございません。

私の方でもちゃんと実行してみました。
Excel2016+Windows10ですが、ねむねむさんと同じ参照エラーが出た上で、回避策も同様の結果となりました。

無意味を承知で

        Set rng = .Range("H2")
        .Range("A1").CurrentRegion.Sort (rng)
などとしてみましたが、エラーは変わらずです。

また、次の書き方ではエラーは出ませんでした。

        .Range("A1").CurrentRegion.Sort rng, xlAscending
        Call .Range("A1").CurrentRegion.Sort (rng)
        Call .Range("A1").CurrentRegion.Sort(rng, xlAscending)

Rangeを()で囲うことで何かが変化するのでしょうか。ちょっと不思議です。
(にゅるん) 2018/08/28(火) 14:47


と、思いましたが、カッコで囲うことで、.Valueに変換されていますね。
これでスッキリしました。

Sub 型の確認()

    Debug.Print TypeName(Range("H2")) '←Rangeと出力される
    Debug.Print TypeName((Range("H2"))) '←DoubleやStringと出力される。(.Valueを評価している)
End Sub

フリーズしたのは・・・ちょっと不思議ですが。
(にゅるん) 2018/08/28(火) 14:53


私もExcel2010のせいか、別に固まりませんでしたね。 シートモジュールのWorksheet_Calculateあたりに何か書いていたりしませんか?
そして、少し整形してみましたが、これだとどうなりますか?
 Sub test()
    Dim Ws1 As Worksheet, Lr As Long
    Set Ws1 = ThisWorkbook.Sheets("Sheet1")
    With Ws1
        Lr = .Cells(.Rows.Count, "A").End(xlUp).Row
        .Range("H2").Resize(Lr - 1, 1).Formula = "=RAND()"
        With .Sort
            .SortFields.Add Key:=Ws1.Range("H2:H" & Lr), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SetRange Ws1.Range("A1").CurrentRegion
            .Header = xlYes
            .Apply
        End With
        .Columns("H:H").ClearContents
    End With
 End Sub
(???) 2018/08/28(火) 15:03

にゅるんさん、ねむねむさん、???さん、ありがとうございます!
やっぱりすごい人ばかりですね、、

皆様の回答を参考に、

    Sub Macro2()
        Dim Ws1 As Worksheet, Lr As Long
        Set Ws1 = ThisWorkbook.Sheets("Sheet1")
        With Ws1
            Lr = .Cells(.Rows.Count, "A").End(xlUp).Row
            .Range("H2").Resize(Lr - 1, 1).Formula = "=RAND()"
            .Range("A1").CurrentRegion = .Range("A1").CurrentRegion.Value
            .Range("A1").CurrentRegion.Sort .Range("H2"), Header:=xlYes
            .Range("H:H").ClearContents
        End With
    End Sub

とすることで正常に動作するようになりました!
まさか名前付き引数を入力する()で型が変わってしまうとは、、勉強になりました。

フリーズに関しては謎ですね、、
矢印がくるくるに変わっていたので何かの処理をしているのかな?と思って
Escキーなど試してみましたが全く反応しなくて、結局タスクマネージャから終了しました(汗)

上記データとコードはサンプルですが、さっそく本データに組み込んでみます。
ありがとうございました。

PS
どなたかフリーズの原因分かったら教えてください。。。
(TAKA) 2018/08/28(火) 16:58


回答者のTAKAさんですか。
(            ) 2018/08/28(火) 21:05

(            )さん

はい、そうです。
(TAKA) 2018/08/29(水) 08:58


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.