トップページ > プログラム > 2014年06月27日 > MwZdRGeI

書き込み順位&時間帯一覧

1 位/217 ID中時間01234567891011121314151617181920212223Total
書き込み数51341020000000000000000016



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
Excel VBA 質問スレ Part33

書き込みレス一覧

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


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。