Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


12217 / 13644 ツリー ←次へ | 前へ→

【11521】列全体を選択したときの高速処理 カド 04/3/10(水) 21:37 質問
【11523】Re:列全体を選択したときの高速処理 Jカーター 04/3/10(水) 22:14 回答
【11524】Re:列全体を選択したときの高速処理 Jカーター 04/3/10(水) 22:17 発言
【11526】Re:列全体を選択したときの高速処理 カド 04/3/10(水) 23:07 質問
【11529】Re:列全体を選択したときの高速処理 Jカーター 04/3/10(水) 23:31 発言
【11532】Re:列全体を選択したときの高速処理 カド 04/3/10(水) 23:41 お礼
【11681】Re:列全体を選択したときの高速処理 カド 04/3/14(日) 12:22 質問
【11682】Re:列全体を選択したときの高速処理 Jカーター 04/3/14(日) 15:23 発言
【11684】Re:列全体を選択したときの高速処理 カド 04/3/14(日) 16:33 お礼
【11686】Re:列全体を選択したときの高速処理 カド 04/3/14(日) 19:09 発言

【11521】列全体を選択したときの高速処理
質問  カド E-MAIL  - 04/3/10(水) 21:37 -

引用なし
パスワード
   以下のコードにて、
選択しているセルに対し、全角を半角にすることが出来ます。

この場合、選択セルをA列全てにすると処理時間が掛かってしまいます。

しかしながら、エクセルにもともと備わっているコマンドで、
例えばA列全体に対し、文字の色を変えるなどの処理をすると瞬時に終わってしまいます。

下記コードにて、列全体に処理をしても速く終えることの出来る常套手段を教えてください。

  Dim aa As Range
  
  For Each aa In Selection
    aa.Value = StrConv(aa.Value, vbNarrow)
  Next

【11523】Re:列全体を選択したときの高速処理
回答  Jカーター  - 04/3/10(水) 22:14 -

引用なし
パスワード
   こんばんは。
値だけを処理するなら
セル範囲.Value で一度に値を取得して
取得した変数を加工して
一度でセルに戻すようにするとかなり高速化できます。
(配列変数を使う方法です。)

それから
たとえ列選択してもIntersectで範囲を絞り込むといいと思います。
-----------------------------------------------------------------
  Dim i As Long
  Dim aa As Variant
  Dim bb As Range
  
'  1,よけいな範囲は処理しない
  Set bb = Intersect(Selection, ActiveSheet.UsedRange)
  
'  2,セルへのアクセスはできるだけ少なく
  aa = bb.Value
  
  For i = 1 To UBound(aa, 1)
    aa(i, 1) = StrConv(aa(i, 1), vbNarrow)
  Next i
  
  bb.Value = aa
  
  Set bb = Nothing

【11524】Re:列全体を選択したときの高速処理
発言  Jカーター  - 04/3/10(水) 22:17 -

引用なし
パスワード
   補足ですが

Usedrangeは条件によっては空白セルも含まれますので
厳密に範囲を絞るには別の方法になるでしょう。

でも列全体よりはましと思いますが・・

【11526】Re:列全体を選択したときの高速処理
質問  カド E-MAIL  - 04/3/10(水) 23:07 -

引用なし
パスワード
   ▼Jカーター さん 回答ありがとうございます。

超高速になりました。

このような高度なコードはどのようにして勉強されたのですか?
わたしが知らないだけで、市販の本などに載っているのでしょうか?

【11529】Re:列全体を選択したときの高速処理
発言  Jカーター  - 04/3/10(水) 23:31 -

引用なし
パスワード
   こんばんは。
値だけを扱う場合
「セル範囲を配列変数に格納して処理してから戻す」
という方法は結構一般的だと思います。


本についてはわかりません。

【11532】Re:列全体を選択したときの高速処理
お礼  カド E-MAIL  - 04/3/10(水) 23:41 -

引用なし
パスワード
   ▼Jカーター さん 回答ありがとうございます。

テクニックのひとつに加えたいと思います。
貴重な情報ありがとうございました。

【11681】Re:列全体を選択したときの高速処理
質問  カド E-MAIL  - 04/3/14(日) 12:22 -

引用なし
パスワード
   皆さん こんにちは。

教えていただいた下記コードですが、私には非常に高度に見えます。
どうしても気になるので教えてください。

(1)
これは選択範囲の中で使用されているセルをまとめて、
bbという名前の範囲を設定するということですよね。

(2)
これは、bbの範囲の各セルの値をまとめて一気にaaに代入するということですよね。
このaaとはいったい何なのですか?? aaというオブジェクト??

(3)
UBound(aa, 1) この1はどう言う意味ですか??
UBound(aa) これだったら 直感的にわかる気がするのですが。

(4)
ここより前はaaという記述しかなかったのに、
どうして急にaa(i, 1)という記述に変わったのですか?

(5)
(2)の時もそうでしたが、どうしてaaにはValueがなくてbbにはあるのですか?

(6)
どうしてこの後処理は必要なのですか?
aaには必要無いのですか?

以上たくさん書きましたが、どのようなサイトあるいは本を見れば、このような
高度?なコードについて勉強できますでしょか?

どうかご教授ください。

>  Dim i As Long
>  Dim aa As Variant
>  Dim bb As Range
>  
>'  1,よけいな範囲は処理しない
>  Set bb = Intersect(Selection, ActiveSheet.UsedRange) ←(1)
>  
>'  2,セルへのアクセスはできるだけ少なく
>  aa = bb.Value ←(2)
>  
>  For i = 1 To UBound(aa, 1) ←(3)
>    aa(i, 1) = StrConv(aa(i, 1), vbNarrow) ←(4)
>  Next i
>  
>  bb.Value = aa ←(5)
>  
>  Set bb = Nothing ←(6)

【11682】Re:列全体を選択したときの高速処理
発言  Jカーター  - 04/3/14(日) 15:23 -

引用なし
パスワード
   こんにちは。
bbはRangeオブジェクトです。
aaは配列です。
(オブジェクトではありません。※オブジェクトの入った配列もありますが今回はセルの値が入っています。)

ステップ実行で
>  For i = 1 To UBound(aa, 1) ←(3)
あたりで止めて
ローカルウインドとかウォッチウインドで
aaaを見ると中身がわかると思います。

Uboundはヘルプを調べてみて下さい。

>  aa = bb.Value ←(2)
でbbの値を配列変数に
>  bb.Value = aa ←(5)
で加工したaaをbbに戻しています。

aaにValueつけられません。(つける必要もないですが・・・)
bbにはValueをつける必要があります。

>  Set bb = Nothing ←(6)
これが必要か不必要かは論議が分かれますが
やっていることは初期化です。
aaの初期値はNothingではないので
初期化するとしても同じようには書きません。
(最後に初期化する必要は無いと思いますが)


本とかサイトはわかりません。


説明が苦手なのでこのあたりでご勘弁を・・・

【11684】Re:列全体を選択したときの高速処理
お礼  カド E-MAIL  - 04/3/14(日) 16:33 -

引用なし
パスワード
   ▼Jカーター さん 本当に何度もありがとう御座います。

私にとっては非常に有効なコードだと思い、また今後実際に使いまわしたいと
思ったので何度もお尋ねしました。
本やネットを見てもこのようなコードを見つけることは出来ませんでした。

結局以下のように解釈し、この解釈に基づき今後は使ってみようと思います。

Sub aaa()

  Dim i As Long
  Dim aa As Variant
  Dim bb As Range
 
  '1,よけいな範囲は処理しない
  'シート全体で使われているセル かつ 選択されているセル
  Set bb = Intersect(Selection, ActiveSheet.UsedRange)
 
  '2,セルへのアクセスはできるだけ少なく
  'bb範囲のセルの値をaa配列に入れる
  aa = bb.Value
 
  For i = 1 To UBound(aa, 1) '配列の添時の使用できる最大値を返す
                '1は行の数、2だったら列の数
    aa(i, 1) = StrConv(aa(i, 1), vbNarrow)
  Next i
 
  bb.Value = aa
  Set bb = Nothing
End Sub

【11686】Re:列全体を選択したときの高速処理
発言  カド E-MAIL  - 04/3/14(日) 19:09 -

引用なし
パスワード
   高速化テクニック > セルを配列に入れるhttp://www.officetanaka.net/excel/vba/speed/s11.htm

12217 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free