Excel VBA質問スレ Part11

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2009/07/12(日) 16:09:06
>>951
一つ一つ処理したら何が確実になるの?
一つ一つSelectして処理したらどうして駄目なの?
953デフォルトの名無しさん:2009/07/12(日) 16:21:25
横レスだけど、
1つに対して出来たら、後はforやfor eachで対象を増やすだけ。
selectしなくても直接操作できるならしない方が動作が早い。
954デフォルトの名無しさん:2009/07/12(日) 18:30:54
>>953
>1つに対して出来たら、後はforやfor eachで対象を増やすだけ。
例えば1行1列の行列掛け算プログラムを正しく作ったとして、
それをn行n列の行列掛け算に拡張するとする。
その拡張が正しいというのはどのように判断するの?

2行のデータをソートするプログラムを正しく作ったとして、
それをn行のソートに拡張するとする。
その拡張が正しいというのはどのように判断するの?
955デフォルトの名無しさん:2009/07/12(日) 18:32:11
まとめてやった方が早いかどうかは処理によるんじゃね?
956デフォルトの名無しさん:2009/07/12(日) 18:34:41
>>953
>selectしなくても直接操作できるならしない方が動作が早い。

早く動作させたい場合、データを一つ一つループで回して処理するより、
データの塊りをライブラリに与えるほうが速いことが多いよ。
957デフォルトの名無しさん:2009/07/12(日) 18:43:48
>>951
>>953
データを集合で扱ったほうが、確実(正しい処理)で速いよ。
selectがどうとかバカらしいよ。
958デフォルトの名無しさん:2009/07/12(日) 18:47:39
とりあえず速さがどうとか言ってる奴はサンプルを提示して、実行速度の比較結果をここに貼れよ
959デフォルトの名無しさん:2009/07/12(日) 20:15:54
>>954
ダミーデータ入れて検証するか、ステップアップで確認しろよw
960デフォルトの名無しさん:2009/07/12(日) 20:18:36
まとめて処理が速いと思ってる馬鹿どもが、例の低レベルUnion使ったりするんだろうねぇ。
なにせ普通にUnion使ったらエリア数の惨状に比例して遅くなる。
961デフォルトの名無しさん:2009/07/12(日) 20:21:03
高レベルのロジックを貼ってください><
962デフォルトの名無しさん:2009/07/12(日) 20:26:56
いちいちSelectするよりRangeオブジェクトをそのままメソッドに渡した方が速いことが多い。
これはあくまでも一般論。

Selectしたあと何をやるか質問者が一切書いてないのに先走ってケンカして、単なるアホ。
963デフォルトの名無しさん:2009/07/12(日) 20:28:13
>>962
Selectした後コピーして別のシートに貼り付ける
964デフォルトの名無しさん:2009/07/12(日) 20:32:29
>>960を受けてだが、A1:CV10000に1〜100のランダムな数値を入れて、各行の最大値のセルに色を付けるコードを書け。
ただし条件付き書式は使わないものとする。
まぁ条件付き書式でも実用に耐えるものを設定出来るやつ何人いるか分らんが。
ちなみに=A1=MAX($A1:$CV1)の条件は不合格です。
965デフォルトの名無しさん:2009/07/12(日) 20:37:10
>>962
実際よくUnuion使った手法を見るから>>960が書いてるように勘違いしてるやつは多い。
966デフォルトの名無しさん:2009/07/12(日) 20:40:53
>>962がアホと言ってるのは>>951だったか。
967デフォルトの名無しさん:2009/07/12(日) 20:48:14
>>964
何が不合格やねん、アホか
968デフォルトの名無しさん:2009/07/12(日) 20:55:04
>>959
行列計算やソートしてくれるライブラリがあるなら、そっちを使うなあ。
検証好きなんだな。お前。
969デフォルトの名無しさん:2009/07/12(日) 21:30:27
荒れると伸びるよなお前ら
速さの話題出るたびに検証検証言ってるのは一人だけなのか?
質問が早さを求めていない以上レスポンス云々の回答が的外れであるのは否めないが
何度もそう健勝言われてもうざいです^^q^
970デフォルトの名無しさん:2009/07/12(日) 21:36:34
>>951みたいなやつが出てくるとからかいたくなる。

>そのまとめて処理という発想をすてて、一つ一つ処理した方が確実。
ほうどうして?

>ただ一つ一つSelectして処理は駄目。
>Selectしない方法を身につけないと。
へえなんで?
971デフォルトの名無しさん:2009/07/12(日) 21:46:54
>>970は引っ込んだ方がいいんじゃねーの?
Selectしないなんてのはごく一般常識だ。
972デフォルトの名無しさん:2009/07/12(日) 21:52:03
>>969
質問が速さを求めてないんだから確実に動かない>>938は駄目だね。
ダブルクォーテーションの問題をクリアーしても255文字の制限で駄目なのは目に見えてる。
973デフォルトの名無しさん:2009/07/12(日) 22:03:17
>>971
Selectしたってちゃんとした結果が出るんならいいじゃない。
視野がせまいんじゃないの?
974デフォルトの名無しさん:2009/07/12(日) 22:06:28
まったく500連発級のアホがいるなw
975デフォルトの名無しさん:2009/07/12(日) 23:37:48
>>964
なんとなく試したら平均2秒もかかるコードしか組めなんだ。
しかも、各行の最大値は重複しないという条件で。

ところで、
>ちなみに=A1=MAX($A1:$CV1)の条件は不合格です。
は何故不合格なのか教えてもらえるとうれしい
976デフォルトの名無しさん:2009/07/13(月) 00:04:33
>>975
2秒だろうが10秒だろうが、手作業よりよほど速いんだから気にすんな。
Selectしようがしまいがちゃんと結果を出せるんなら実用上問題ない。

それよりも本当に最大値を間違いなく出せているのか?
それだけが重要だ。
977デフォルトの名無しさん:2009/07/13(月) 00:26:21
>>972
たとえば?
978デフォルトの名無しさん:2009/07/13(月) 08:40:05
UNIONがだめとか何言ってるの
複数のコード書いて質問者に選ばせればいいじゃん
自分のスタンスじゃないからって否定すんなよ

行選択ならrows()の組み合わせが使えるんじゃね
979デフォルトの名無しさん:2009/07/13(月) 10:56:58
>>977
たとえばもクソもねーよ。
255文字を超えると使えないような手法が使えるわけねーじゃん。
それこそ誰かがどこかで書いてた小売店レベルでしか使えねーな。
980デフォルトの名無しさん:2009/07/13(月) 11:13:42
>>975
もしかして1〜100の乱数書き込みを入れての時間?
そうじゃなかった少し古いパソコン?
Vista 2007 Core2Duo3.00GHzでおまいの書いたであろうコードを書いてみたら0.7秒だった。
重複対応のmatch使わないで配列ぶん回すやつはこれに0.1秒余計にかかるだけだった。
ちなみに普通にUnion使ったら20分だったw
981デフォルトの名無しさん:2009/07/13(月) 11:47:45
>>979
255文字を超えない文字数で何回かに分けて処理する方法はあるよ。
ただかなり複雑になるけど。
982デフォルトの名無しさん:2009/07/13(月) 12:18:52
>>980
20分てなんだそりゃw
983デフォルトの名無しさん:2009/07/13(月) 12:30:43
>>982
単純なUnionならそのくらいかかるよな。
>>960が書いてるとおりだ。
984デフォルトの名無しさん:2009/07/13(月) 12:55:21
>普通にUnion
がさっぱりわからん。
985デフォルトの名無しさん:2009/07/13(月) 13:26:54
>>984
Unionでも工夫すれば速くなるとかいう達人が前にいたからねぇ。
その工夫がめちゃめちゃ面倒で、俺みたいな凡人にはとても書けるものじゃなかったよ。
普通のUnionならたとえば下みたいなのじゃね?
Sub foo()
Dim r As Range, c As Range, u As Range, maxV As Double
With Application.WorksheetFunction
For Each r In Range("a1:cv10000").Rows
maxV = .Max(r)
For Each c In r.Cells
If c.Value = maxV Then
If u Is Nothing Then
Set u = c
Else
Set u = Union(u, c)
End If
End If
Next
Next
u.Interior.ColorIndex = 3
End Sub
これなら数十分かかるかもね。
配列やItemプロパティで工夫しても同じようにUnion使う限り似たような時間だろう。
>>975の重複なしのやつは多分下みたいなやつだろう。
With Application.WorksheetFunction
For Each r In Range("a1:cv10000").Rows
r.Cells(.Match(.Max(r), r, 0)).Interior.ColorIndex = 3
Next
End With
986デフォルトの名無しさん:2009/07/13(月) 17:03:04
エクセルに表示されている省略されているアドレスを
本来のアドレスに戻すことはできますか?

リンクの編集からリンク先のリンクがわかるのですが、
それをいちいちコピペで変換するのが大変なので。
987デフォルトの名無しさん:2009/07/13(月) 17:07:08
>>985
何がしたいのか知らんけど、バグってるよねそのコード
988デフォルトの名無しさん:2009/07/13(月) 18:26:57
>>986
マクロ使わないと無理
Range("A1").Hyperlinks(1).Address
989デフォルトの名無しさん:2009/07/13(月) 19:25:36
>>979
どうでもいいんだが、「小売店」の意味を勘違いしてる
まあお前が言い出したんじゃないかもしれないけど
990デフォルトの名無しさん:2009/07/13(月) 19:34:36
VBAだからどうでも良いって考える人が多いだろうけど、
プログラムをやるならば、他人がメンテする事も踏まえて可読性の高い、
一般的かつ美しいロジックの構文を心掛けるべきだな。

省略した方が一般的ならば省略すべきだし、
省略すると、動くけどマニアックならば省略すべきでは無い。

デフォルトプロパティの省略なんか分かりやすいかな。
991デフォルトの名無しさん:2009/07/13(月) 19:41:02
>>988
B列にあるアドレスということで
Range("B").Hyperlinks(1).Address
としてやってみたのですが、駄目でした。

マクロは

Sub リンク()

Range("B1").Hyperlinks(1).Address

End Sub

こんな感じになってます。最後のaddressってのが黄色く表示されます。
992デフォルトの名無しさん:2009/07/13(月) 19:50:24
>>990
誰への書きこ?
993デフォルトの名無しさん:2009/07/13(月) 20:05:40
>>990
そうだねぇ。
省略するのが一般的なものの一番はItemだな。
Set w =Worksheets.Item("Sheet1")とかやられるとかなりくどくて嫌味だな。
994デフォルトの名無しさん:2009/07/13(月) 20:09:20
>>987
End Withが抜けてるだけだな。
インデントつけりゃすぐわかることだ。

995デフォルトの名無しさん:2009/07/13(月) 20:46:53
Application.
とか普通つけないしな
996デフォルトの名無しさん:2009/07/13(月) 20:58:46
Microsoft Excel では、ワークシート上で =0^0 という数式を入力すると #NUM! というエラーを返すが、
同ソフトウェアに搭載されている VBA では1と定義されている。
997デフォルトの名無しさん:2009/07/13(月) 21:24:02
SelectしないのはSelectの省略とは言わんなぁ。
あれはつけないのが当たり前だからな。
つけたら可読性は最低レベルだ。
998デフォルトの名無しさん:2009/07/13(月) 21:27:25
>>996
VBAでは、0^0が1というより、n^0が1(nが負数なら-1)となる
算術演算的には0^0はエラーでいいんだが
論理演算的には1や-1になった方が都合がよいからな
999デフォルトの名無しさん:2009/07/13(月) 21:54:50
銀河鉄道
1000デフォルトの名無しさん:2009/07/13(月) 21:59:48
Windows
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。