[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『フリーズ?してしまう』(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("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
Sub 型の確認()
Debug.Print TypeName(Range("H2")) '←Rangeと出力される Debug.Print TypeName((Range("H2"))) '←DoubleやStringと出力される。(.Valueを評価している) End Sub
フリーズしたのは・・・ちょっと不思議ですが。
(にゅるん) 2018/08/28(火) 14:53
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/29(水) 08:58
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.