- Excel VBA 質問スレ Part33
960 :935[sage]:2014/06/27(金) 02:00:43.32 ID:fo8RbvYe - >>924
CurrentRejion は、関係なかった。(というか>>940の指摘どおりCurrentRejionでは対応出来ない部分があった)Findを4回でどうやるのかも分からないからベタにやった。 適当な範囲をセレクトした状態で以下のマクロを実行すると、データがある範囲だけを包含した矩形の領域をセレクトして終了する……はず。<=ちょっと自信ない Sub test() Dim wf As WorksheetFunction Dim rw_cnt As Long, cl_cnt As Long, st_rw As Long, ed_rw As Long, st_cl As Long, ed_cl As Long Set wf = Application.WorksheetFunction With Selection rw_cnt = .Rows.Count cl_cnt = .Columns.Count For st_rw = 1 To rw_cnt If wf.CountA(.Rows(st_rw)) > 0 Then Exit For Next st_rw If st_rw > rw_cnt Then MsgBox "Err:NoData" Exit Sub End If For ed_rw = rw_cnt To 1 Step -1 If wf.CountA(.Rows(ed_rw)) > 0 Then Exit For Next ed_rw For st_cl = 1 To cl_cnt If wf.CountA(.Columns(st_cl)) > 0 Then Exit For Next st_cl For ed_cl = cl_cnt To 1 Step -1 If wf.CountA(.Columns(ed_cl)) > 0 Then Exit For Next ed_cl Range(.Cells(st_rw, st_cl), .Cells(ed_rw, ed_cl)).Select End With Set wf = Nothing End Sub
|
- Excel VBA 質問スレ Part33
961 :935[sage]:2014/06/27(金) 02:02:55.35 ID:fo8RbvYe - 被っちゃった……orz
|
- Excel VBA 質問スレ Part33
963 :デフォルトの名無しさん[sage]:2014/06/27(金) 02:23:22.97 ID:fo8RbvYe - >>962
なるほど、SearchOrderとSearchDirectionを上手く使ってますね。 あと、何気にAfterも。 可読性がちょっと犠牲になるけど、c1とc2の順番を逆にしたら ほんのちょびっと(SearchDirectionの指定一回分)だけコード短く出来ますな。
|
- Excel VBA 質問スレ Part33
970 :デフォルトの名無しさん[sage]:2014/06/27(金) 03:19:28.93 ID:fo8RbvYe - >>964
指定する度にその設定が保存される仕様でしたよね、 たしかヘルプにはそんな様な事が書いてあったと思います。 だからr2とC2はDirectionが同じなのでOrderだけ指定すれば良くて、 c2からc1でDirectionの指定でいけたはずだな、と。(確かめてないですけど。) >>966 すいません。 俺には思い付けなかったんです。 だから上手い手だなと思いました。 >>967 見当違いかもしれないけどジャグ配列ってのが参考になるかもです。 配列の配列とも言う奴です。 俺は使ったことがないのでよく分からないから間違ってたら許してください。
|
- Excel VBA 質問スレ Part33
974 :970[sage]:2014/06/27(金) 04:03:10.21 ID:fo8RbvYe - >>972
あ、ホントだ。Directionは記憶されないんですね。 ちゃんと確認してませんでした。ごめんなさい。 http://msdn.microsoft.com/ja-jp/library/office/ff839746(v=office.15).aspx でもそうすると、おそらくDirectionには規定値が存在しますよね? 省略可能なパラメータですし。 多分xlNextがデフォだと思いますが、 それの指定は省略できそうですね。<=まだ懲りてない あと、これまた確認してなくてあてずっぽうですが、 変数の宣言で明示的にLong型にしたほうがVarantで使うより早くならないですかね? (うちのPCは未だにExcel2000なんで、全領域指定しても全然範囲が狭いんで処理時間掛かるか試せないんです。)
|
- Excel VBA 質問スレ Part33
984 :970[sage]:2014/06/27(金) 13:25:59.66 ID:fo8RbvYe - >>945
お呼びでないかもしれませんが、ジャグ配列のサンプルコード書きました。 こんな事がしたいのではありませんか? Sub jagtest() Dim tmp As Variant Dim ary1 As Variant Dim ary2 As Variant Dim r As Long, c As Long 'サンプル用に2次元配列変数 ary1(1 to 500,1 to 100) をジャグ配列で作成 ReDim tmp(1 To 500) ReDim ary1(1 To 100) ReDim ary2(1 To 100) With ThisWorkbook.Sheets(1) For c = 1 To 100 For r = 1 To 500 '配列内のデータにはとりあえずセルのアドレスを使用 tmp(r) = .Cells(r, c).Address Next r ary1(c) = tmp Next c End With stop 'ここまではサンプル用の配列変数を用意しただけ、ここからがジャグ配列の操作 For c = 1 To 100 ary2(c) = ary1(101 - c) Next c stop 'ary1とary2をウォッチ式とかで確認してください End Sub
|
- Excel VBA 質問スレ Part33
986 :970[sage]:2014/06/27(金) 13:45:07.18 ID:fo8RbvYe - すみません、書き忘れてましたが、ジャグ配列内の各要素にアクセスするときには
ary1(100,500)ではなく、ary1(100)(500)のようにしないとダメです。 あと、多分まとめて操作できるのは片方の要素(今回は最初の100の要素の方)だけです。 ところで、どなたかそろそろ次スレお願いします。
|
- Excel VBA 質問スレ Part33
987 :970[sage]:2014/06/27(金) 13:54:03.22 ID:fo8RbvYe - あぁぁぁぁぁぁっっ!!!
サンプルコード内の注釈が間違ってた……orz ary1もary2もサイズは(500,100)ではなく(100,500)です。 連投すみませんでした。
|