- Excel VBA 質問スレ Part33
940 :デフォルトの名無しさん[sage]:2014/06/27(金) 00:07:15.61 ID:MwZdRGeI - CurrentRegionだけだと、選択範囲の中に固まりが2つあった時に対応できないけど、こんなケースは考慮しなくていいの?
□□□□□ □□□■□ □□□□□ □■■□□ □□□□□
|
- Excel VBA 質問スレ Part33
941 :デフォルトの名無しさん[sage]:2014/06/27(金) 00:07:42.04 ID:MwZdRGeI - >>936
質問はもっと丁寧に 何の色?
|
- Excel VBA 質問スレ Part33
946 :デフォルトの名無しさん[sage]:2014/06/27(金) 00:49:58.75 ID:MwZdRGeI - >>944
その「愚直に調べる」方法にも色々あるだろ
|
- Excel VBA 質問スレ Part33
948 :デフォルトの名無しさん[sage]:2014/06/27(金) 00:54:47.16 ID:MwZdRGeI - >>945
無理 処理スピード関係なくコードをシンプルにしたいだけなら、ワークシートにデータを置くという方法がある ワークシート上なら簡単に不要な列を詰めたりできる あるいは、行ごとにJoinして一次元配列にしといて、処理が終わったら最後にSplitで2次元に戻すとか
|
- Excel VBA 質問スレ Part33
949 :デフォルトの名無しさん[sage]:2014/06/27(金) 00:56:56.44 ID:MwZdRGeI - >>947
日付変わってID変わったけど俺は>>927 >>933だよ Findを4回よりシンプルな方法ってあるか?
|
- Excel VBA 質問スレ Part33
952 :デフォルトの名無しさん[sage]:2014/06/27(金) 01:16:52.94 ID:MwZdRGeI - >>950
それはおまえが決めることじゃない どんな方法を望んでいるかは質問者にしかわからない
|
- Excel VBA 質問スレ Part33
962 :デフォルトの名無しさん[sage]:2014/06/27(金) 02:15:13.27 ID:MwZdRGeI - スピードはわからんけど、言い出した手前、俺もFind 4回のコード貼っとく
Sub Macro1() With Selection If WorksheetFunction.CountA(.Cells) Then r1 = .Find(What:="*", After:=.Cells(.Count), SearchOrder:=xlByRows, SearchDirection:=xlNext).Row r2 = .Find(What:="*", SearchDirection:=xlPrevious).Row c1 = .Find(What:="*", After:=.Cells(.Count), SearchOrder:=xlByColumns, SearchDirection:=xlNext).Column c2 = .Find(What:="*", SearchDirection:=xlPrevious).Column Range(Cells(r1, c1), Cells(r2, c2)).Select End If End With End Sub
|
- Excel VBA 質問スレ Part33
964 :デフォルトの名無しさん[sage]:2014/06/27(金) 02:43:45.05 ID:MwZdRGeI - >>963
SearchDirectionはデフォルト値が記憶されるんだっけ?
|
- Excel VBA 質問スレ Part33
965 :デフォルトの名無しさん[sage]:2014/06/27(金) 02:44:41.44 ID:MwZdRGeI - ついでにループ4回で調べる方法も作ってみた
Sub Macro2() With WorksheetFunction If .CountA(Selection) = 0 Then Exit Sub r1 = Selection.Row c1 = Selection.Column r2 = Selection(Selection.Count).Row c2 = Selection(Selection.Count).Column While .CountA(Range(Cells(r1, c1), Cells(r1, c2))) = 0 r1 = r1 + 1 Wend While .CountA(Range(Cells(r2, c1), Cells(r2, c2))) = 0 r2 = r2 - 1 Wend While .CountA(Range(Cells(r1, c1), Cells(r2, c1))) = 0 c1 = c1 + 1 Wend While .CountA(Range(Cells(r1, c2), Cells(r2, c2))) = 0 c2 = c2 - 1 Wend End With Range(Cells(r1, c1), Cells(r2, c2)).Select End Sub
|
- Excel VBA 質問スレ Part33
969 :デフォルトの名無しさん[sage]:2014/06/27(金) 03:11:24.73 ID:MwZdRGeI - ベンチマーク
ScreenUpdating = Falseして、A1:Z100を選択した状態で10000回ずつ実行 >>956 40秒 >>960 19秒 >>962 0秒 >>965 10秒
|
- Excel VBA 質問スレ Part33
971 :デフォルトの名無しさん[sage]:2014/06/27(金) 03:38:56.47 ID:MwZdRGeI - >>968
すまん、全選択は想定の範囲外だった オーバーフローの原因は潰した スピードも十分のはず Sub Macro_962_2() With Selection If WorksheetFunction.CountA(.Cells) Then Set c = .Cells(1).Offset(.Rows.Count - 1, .Columns.Count - 1) r1 = .Find(What:="*", After:=c, SearchOrder:=xlByRows, SearchDirection:=xlNext).Row r2 = .Find(What:="*", SearchDirection:=xlPrevious).Row c1 = .Find(What:="*", After:=c, SearchOrder:=xlByColumns, SearchDirection:=xlNext).Column c2 = .Find(What:="*", SearchDirection:=xlPrevious).Column Range(Cells(r1, c1), Cells(r2, c2)).Select End If End With End Sub
|
- Excel VBA 質問スレ Part33
972 :デフォルトの名無しさん[sage]:2014/06/27(金) 03:43:06.73 ID:MwZdRGeI - >>970
ヘルプじゃなくて悪いけど、ここにはSearchOrderは記憶されると書いてある つまりSearchDirectionは記憶されないようだ http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_find.html ヘルプでは発見できんかった
|
- Excel VBA 質問スレ Part33
973 :デフォルトの名無しさん[sage]:2014/06/27(金) 03:50:36.34 ID:MwZdRGeI - SearchDirectionを省略するとxlNextと見なされるということは、いちいち書かなくてもいいのか
それは知らんかった
|
- Excel VBA 質問スレ Part33
975 :デフォルトの名無しさん[sage]:2014/06/27(金) 04:08:49.44 ID:MwZdRGeI - >>967
Excelの機能をフルに使って、A列にインデックス、B列以降にデータを入れて こんな感じでソートすれば一発で並べ替えできるけど、どうしてもVBAだけでやらないとだめ? Range("A1:A100") = SortData Range("B1:Z100") = Arry1 Worksheets("Sheet1").Sort Arry2 = Range("B1:Z100")
|
- Excel VBA 質問スレ Part33
981 :デフォルトの名無しさん[sage]:2014/06/27(金) 06:15:06.07 ID:MwZdRGeI - >>978
ごめん、実際に試してみたら、単純なForの二重ループの方がワークシートよりずっと速かったわ 20倍ぐらい差があった
|
- Excel VBA 質問スレ Part33
982 :デフォルトの名無しさん[sage]:2014/06/27(金) 06:17:38.59 ID:MwZdRGeI - >>974 >>968
パラメータ省略ついでに、重そうな関数の呼び出しを1回減らして気休めレベルのスピードアップ Sub Macro_962_3() With Selection Set c = .Cells(1).Offset(.Rows.Count - 1, .Columns.Count - 1) Set f = .Find(What:="*", After:=c, SearchOrder:=xlByRows) If Not f Is Nothing Then r1& = f.Row r2& = .Find(What:="*", SearchDirection:=xlPrevious).Row c1& = .Find(What:="*", After:=c, SearchOrder:=xlByColumns).Column c2& = .Find(What:="*", SearchDirection:=xlPrevious).Column Range(Cells(r1&, c1&), Cells(r2&, c2&)).Select End If End With End Sub
|