Excel VBA 質問スレ Part20

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2011/09/22(木) 20:55:59.12
セルに小さい順に任意の数値が入っています。
ある値を指定したときに、最も近い数字を探す方法として、
最短で探す方法を教えてください。

やはり配列に入れてループで比較ですか?
953デフォルトの名無しさん:2011/09/22(木) 21:06:17.65
>>952
そういうのは>>950が得意そうだな。
お手並み拝見と行きましょうかw
954952:2011/09/22(木) 21:06:45.01
と、思ったんですが、
配列の中央値と比較してから、
どちらかの方向に比較していけば、
半分ですみますね。

もっと良い方法あったら教えてください。
955デフォルトの名無しさん:2011/09/22(木) 21:17:36.50
>>954
> と、思ったんですが、
> 配列の中央値と比較してから、
> どちらかの方向に比較していけば、
> 半分ですみますね。
>

これを繰り返せばよいです、はい
956952:2011/09/22(木) 21:26:44.67
>>955
なるほど。ありがとうございます。
ちなみに、指定する値を比例して増幅させる
(任意の数値が0.0〜10000.0の範囲、指定値が0から5刻みで単調増加)
で結果を出したいのですが、更に短縮する方法を探しています。
感覚的には解法がありそうなのですが・・・ヒントあったら教えてください。
よろしくおねがいします。
957デフォルトの名無しさん:2011/09/22(木) 21:37:33.67
つ VLOOKUP
958デフォルトの名無しさん:2011/09/23(金) 01:01:18.21
>>956
キーワードを挙げると、>>954は"二分探索法"と言うアルゴリズムですね。
そこから発展して"バランス木"というデータ構造もあります。
リレーショナルデータベースには必要不可欠なものです。
959ベテラン高学歴イケメソ:2011/09/23(金) 06:44:31.56
一定の数ごとにそれを超えるのはどこかを最初に配列に入れとく
さらにそこから一定の数ごとに(ry

よっぽど膨大なデータじゃなければ普通にループ
960デフォルトの名無しさん:2011/09/23(金) 09:02:08.58
現行バージョンのExcelは最大行数が1048576
普通に二分探索でやると最悪19回の比較で答えが出るけど、もっと短縮したいってこと?

>>957の言うとおり、下手なこと考えるよりWorksheetFunctionが一番早かったりして
961デフォルトの名無しさん:2011/09/23(金) 10:21:15.71
ヘタなコード書いてバグ埋め込むよりはWorksheetFunctionの方がよっぽどいいよ
962デフォルトの名無しさん:2011/09/23(金) 10:24:28.53
そもそも近い数字って10に近いものが9と11だったらどっちが欲しいのよ?
検索する側とされる側のデータ量や間隔にもよるが、お互いにのぼり順のデータならそれなりのマッチングアルゴリズムが昔からあるだろう。
データによっては二分探索を使ってもいいだろうが、最初の中央値はそれまでに見つかった位置より後ろの中央にもっていかないとな。
常に同じ中央値では無駄だろう。
ってかこの質問した人っていつも暴れまわってるやつじゃねーのか?
963デフォルトの名無しさん:2011/09/23(金) 13:48:47.48
Excelのえのじも知らない者だが…

図and/or表ってなに?
Excelのなにかだということしかわからな
964デフォルトの名無しさん:2011/09/23(金) 14:37:18.28
「Excelのなにかだ」というのがそもそも間違い
つまりスレ違いなんですが・・・
965デフォルトの名無しさん:2011/09/23(金) 14:43:16.63
スレチのすの字も知らないらしい
966デフォルトの名無しさん:2011/09/23(金) 17:47:11.96
だなw
例えExcelのなにかだとしても、ここではなくBソフ板かPC初心者板のスレの方へ行くべき内容
スレ違い甚だしいにも程があるって話だw
967デフォルトの名無しさん:2011/09/23(金) 18:26:00.92
国語/論理学もあやしい
968デフォルトの名無しさん:2011/09/23(金) 23:41:25.06
Setって実体コピーでしょうか?

例えば
Dim selections as Range
Dim c as Range

selections = Selection
とやると、選択セルが変わったときに、cも一緒に新しい選択されたセルを見てしまいますか?
そして、
Set selections = Selection
とやると、今の選択範囲がselectionsにコピーされ、新しくどこか違う場所を選択してもselectionsに影響は無い、

と考えていいのですか?


それともSetはぜんぜん違う目的のものですか?
969デフォルトの名無しさん:2011/09/24(土) 00:10:16.28
strCell = "A1"
Set r = Range(strCell)
でrはA1を指してるとします。
ここでA1の”A”っていうのを文字列で取りたいです
”AX1”なら”AX”を取りたい

どうしたらいいですか?
970デフォルトの名無しさん:2011/09/24(土) 00:42:22.26
>>968
後者はRange.Selectしてもselectionsの範囲が変わることはないです
前者は仕様上できません

前者後者共に動かせばすぐ分かることでしょう?
なぜ動かさないで質問したんですか?
971デフォルトの名無しさん:2011/09/24(土) 00:45:52.08
>>968
実体のコピーではなく実体への参照
しかしSelectionはオブジェクトではなくRange型を返すプロパティなので
=Selectionによって参照代入されるのはSelectionそのものではなく
Selectionが返したRangeオブジェクト
よって、参照代入後に選択セルが変更されても、selections変数には影響ない

>>969
r.Row
972デフォルトの名無しさん:2011/09/24(土) 00:50:09.44
>>969
他にもやりようがあるかもだけど とりあえず
Adr_Str = r.Address(True, False)
Col_Str = Left(Adr_Str, InStr(Adr_Str, "$") - 1)

Debug.Print Col_Str
973デフォルトの名無しさん:2011/09/24(土) 01:26:22.04
>>970
ありがとうございます。
動かしてその結果だけで判断って危険じゃないですか?w
なので聞いてます。
前者は文法的にダメってことでこちらは失礼しました。
勘違いで出来ると思って書いちゃいました
974デフォルトの名無しさん:2011/09/24(土) 01:33:33.11
>>971
>=Selectionによって参照代入されるのはSelectionそのものではなく
>Selectionが返したRangeオブジェクト
それはちょっとちがう

オブジェクトに対して(Setなしの)=で代入、参照されるのはそれぞれの既定のプロパティの値
Rangeの規定のプロパティはちょっとややこしいが、この場合はValueだと思って良い

Dim c As Range
Set c = Sheet1.Range("A1")
Range("B1").Select
c = Selection 'これはc.Value = Selection.Value

これでB1セルのValueがA1セルのValueに代入されるが、cはずっとA1を指したまま
975デフォルトの名無しさん:2011/09/24(土) 01:51:20.97
>>973
前者も文法的には問題ないぞ。事実コンパイルは通るだろ

>>968でselections = Selection が実行時にエラーになるのは、
selectionsの既定のプロパティに値を代入しようとしたんだが、
selectionsは有効なRangeオブジェクトを指して無かったからだ

動かしてその結果から判断するのは、場合によっては必要だが
動かしてその結果「だけ」で判断するのは危険
976デフォルトの名無しさん:2011/09/24(土) 03:31:11.59
>>975
つまりDim selections as Range
ってやっただけではselectionsはC言語でいうところの、未初期化のポインタで、
 Range ** pRange = NULL;
 Range rng;
 *pRange = &rng;

みたいな事で、

Setを使うと
 Range ** pRange = NULL;
 Range rng;
 pRange = (Range *)malloc(sizeof(Range));
 *pRange = &rng;

みたいなことなんですかね。

977デフォルトの名無しさん:2011/09/24(土) 05:00:17.38
>>974
「代入」ではなく「参照代入」ってのはSetを付けた場合の話だから
「ちょっとちがう」というのは不適切

>>971は参照代入における正解で、>>974は代入における正解だから
「ちょっとちがう」という反論ではなく、「>>971は参照代入の話だが、代入の場合は〜」と
補足する形を取るのが本当の正解
978デフォルトの名無しさん:2011/09/24(土) 09:42:19.64
SelectとActivateの区別が付きません。
画面に表示するのがSelectで
オブジェクト操作の対象として選択することが
Activateなのでしょうか。
その両方を実現したい時はSelectした後Activate
する必要があるのでしょうか。
979デフォルトの名無しさん:2011/09/24(土) 12:49:27.30
>>977
参照代入って単語は初めて聞いた

VBA "参照代入" でぐぐると 約 791 件 (0.11 秒)
少なくともVBAでは一般的に通用する用語ではないと思われ
980デフォルトの名無しさん:2011/09/24(土) 13:06:25.45
山椒大夫なら知ってる。
981デフォルトの名無しさん:2011/09/24(土) 20:33:06.24
A1のセルに入力している最中の文字列を
リアルタイムにフォームのテキストボックスに表示する方法を教えて頂けないでしょうか?

使用環境は
エクセル2002
OS XP
です
982デフォルトの名無しさん:2011/09/24(土) 20:51:32.46
ワークシートチェンジ
983981:2011/09/24(土) 21:05:33.64
>>982
すみません
表現が間違っていたかもしれません
セルに値を入力してエンターを押して変更が確定した後ではなく
確定する前の現在入力中の文字列を取得して
テキストボックスに表示したいのです

APIなどを利用すれば可能なのかもしれませんが
具体的な方法がわからないのです
どなたかよろしくお願いします
984952:2011/09/24(土) 22:58:52.05
亀だすが、ありがとうございました。
試してみたいと思います。
985332:2011/09/25(日) 00:58:06.50
>>983
半角英数だけならgetasynckeystateでやればよくね
986デフォルトの名無しさん:2011/09/25(日) 00:58:37.80
名前ミスだから気にしなくて良いです
987デフォルトの名無しさん:2011/09/25(日) 09:04:17.94
入力をフックして取得するってのは、対象がExcelでも
ExcelVBAの分野ではないから、とりあえずスレ違いだね

まあ具体的な方法とか聴く前に、自分こそ具体的に何がしたくて
そういう動作を求めているのかを書けば、VBA分野で別な方法が
あるかもしれないけどね
988デフォルトの名無しさん:2011/09/25(日) 09:58:30.68
入力中ならフックするしかなくね
989デフォルトの名無しさん:2011/09/25(日) 10:10:10.58
セルが見えてるなら画面キャプチャーするという手も
普通はやらないけど
990デフォルトの名無しさん:2011/09/25(日) 15:13:31.96
次スレよろ
991デフォルトの名無しさん:2011/09/25(日) 15:21:28.35


次スレ案内


Excel VBA 質問スレ Part21
http://hibari.2ch.net/test/read.cgi/tech/1316931607/


992デフォルトの名無しさん:2011/09/25(日) 15:30:43.80
セルをコピーしてjpgで出力ってできないの?
993デフォルトの名無しさん:2011/09/25(日) 15:37:10.33
できないことない
994デフォルトの名無しさん:2011/09/25(日) 15:45:58.99
>>992
「図としてコピー」というコマンドで任意のセル範囲を図形としてコピーできる
あとはそのコピーされた図形を頑張ってjpg保存とかすればいいと思う
995デフォルトの名無しさん:2011/09/25(日) 15:52:36.53
>>991
おつ
996デフォルトの名無しさん:2011/09/25(日) 16:15:15.22
ここでいいかな?



  |:::::::::::::::   
      ∧_∧:::::::::::: 
 __   (´・ω・`) :::::::: すみません、ここでうんこしていいですか?
◎ー)  /     \:::::::::
 |  | (⌒) (⌒二 )::::::::::::
 ~~~ /⌒ヽ( ̄、  ヽ___ 
   /    Lヽ \ノ___
   ゙ー―――(__)---
997デフォルトの名無しさん:2011/09/25(日) 16:16:28.02
998デフォルトの名無しさん:2011/09/25(日) 16:16:49.18
梅干
999デフォルトの名無しさん:2011/09/25(日) 16:17:03.74
999
1000デフォルトの名無しさん:2011/09/25(日) 16:17:16.79
終わり
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。