セルに小さい順に任意の数値が入っています。
ある値を指定したときに、最も近い数字を探す方法として、
最短で探す方法を教えてください。
やはり配列に入れてループで比較ですか?
954 :
952:2011/09/22(木) 21:06:45.01
と、思ったんですが、
配列の中央値と比較してから、
どちらかの方向に比較していけば、
半分ですみますね。
もっと良い方法あったら教えてください。
955 :
デフォルトの名無しさん:2011/09/22(木) 21:17:36.50
>>954 > と、思ったんですが、
> 配列の中央値と比較してから、
> どちらかの方向に比較していけば、
> 半分ですみますね。
>
これを繰り返せばよいです、はい
956 :
952:2011/09/22(木) 21:26:44.67
>>955 なるほど。ありがとうございます。
ちなみに、指定する値を比例して増幅させる
(任意の数値が0.0〜10000.0の範囲、指定値が0から5刻みで単調増加)
で結果を出したいのですが、更に短縮する方法を探しています。
感覚的には解法がありそうなのですが・・・ヒントあったら教えてください。
よろしくおねがいします。
つ VLOOKUP
>>956 キーワードを挙げると、
>>954は"二分探索法"と言うアルゴリズムですね。
そこから発展して"バランス木"というデータ構造もあります。
リレーショナルデータベースには必要不可欠なものです。
一定の数ごとにそれを超えるのはどこかを最初に配列に入れとく
さらにそこから一定の数ごとに(ry
よっぽど膨大なデータじゃなければ普通にループ
現行バージョンのExcelは最大行数が1048576
普通に二分探索でやると最悪19回の比較で答えが出るけど、もっと短縮したいってこと?
>>957の言うとおり、下手なこと考えるよりWorksheetFunctionが一番早かったりして
961 :
デフォルトの名無しさん:2011/09/23(金) 10:21:15.71
ヘタなコード書いてバグ埋め込むよりはWorksheetFunctionの方がよっぽどいいよ
そもそも近い数字って10に近いものが9と11だったらどっちが欲しいのよ?
検索する側とされる側のデータ量や間隔にもよるが、お互いにのぼり順のデータならそれなりのマッチングアルゴリズムが昔からあるだろう。
データによっては二分探索を使ってもいいだろうが、最初の中央値はそれまでに見つかった位置より後ろの中央にもっていかないとな。
常に同じ中央値では無駄だろう。
ってかこの質問した人っていつも暴れまわってるやつじゃねーのか?
Excelのえのじも知らない者だが…
図and/or表ってなに?
Excelのなにかだということしかわからな
「Excelのなにかだ」というのがそもそも間違い
つまりスレ違いなんですが・・・
スレチのすの字も知らないらしい
だなw
例えExcelのなにかだとしても、ここではなくBソフ板かPC初心者板のスレの方へ行くべき内容
スレ違い甚だしいにも程があるって話だw
国語/論理学もあやしい
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”を取りたい
どうしたらいいですか?
>>968 後者はRange.Selectしてもselectionsの範囲が変わることはないです
前者は仕様上できません
前者後者共に動かせばすぐ分かることでしょう?
なぜ動かさないで質問したんですか?
>>968 実体のコピーではなく実体への参照
しかしSelectionはオブジェクトではなくRange型を返すプロパティなので
=Selectionによって参照代入されるのはSelectionそのものではなく
Selectionが返したRangeオブジェクト
よって、参照代入後に選択セルが変更されても、selections変数には影響ない
>>969 r.Row
>>969 他にもやりようがあるかもだけど とりあえず
Adr_Str = r.Address(True, False)
Col_Str = Left(Adr_Str, InStr(Adr_Str, "$") - 1)
Debug.Print Col_Str
>>970 ありがとうございます。
動かしてその結果だけで判断って危険じゃないですか?w
なので聞いてます。
前者は文法的にダメってことでこちらは失礼しました。
勘違いで出来ると思って書いちゃいました
>>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を指したまま
>>973 前者も文法的には問題ないぞ。事実コンパイルは通るだろ
>>968でselections = Selection が実行時にエラーになるのは、
selectionsの既定のプロパティに値を代入しようとしたんだが、
selectionsは有効なRangeオブジェクトを指して無かったからだ
動かしてその結果から判断するのは、場合によっては必要だが
動かしてその結果「だけ」で判断するのは危険
>>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;
みたいなことなんですかね。
>>974 「代入」ではなく「参照代入」ってのはSetを付けた場合の話だから
「ちょっとちがう」というのは不適切
>>971は参照代入における正解で、
>>974は代入における正解だから
「ちょっとちがう」という反論ではなく、「
>>971は参照代入の話だが、代入の場合は〜」と
補足する形を取るのが本当の正解
SelectとActivateの区別が付きません。
画面に表示するのがSelectで
オブジェクト操作の対象として選択することが
Activateなのでしょうか。
その両方を実現したい時はSelectした後Activate
する必要があるのでしょうか。
>>977 参照代入って単語は初めて聞いた
VBA "参照代入" でぐぐると 約 791 件 (0.11 秒)
少なくともVBAでは一般的に通用する用語ではないと思われ
山椒大夫なら知ってる。
A1のセルに入力している最中の文字列を
リアルタイムにフォームのテキストボックスに表示する方法を教えて頂けないでしょうか?
使用環境は
エクセル2002
OS XP
です
ワークシートチェンジ
983 :
981:2011/09/24(土) 21:05:33.64
>>982 すみません
表現が間違っていたかもしれません
セルに値を入力してエンターを押して変更が確定した後ではなく
確定する前の現在入力中の文字列を取得して
テキストボックスに表示したいのです
APIなどを利用すれば可能なのかもしれませんが
具体的な方法がわからないのです
どなたかよろしくお願いします
984 :
952:2011/09/24(土) 22:58:52.05
亀だすが、ありがとうございました。
試してみたいと思います。
985 :
332:2011/09/25(日) 00:58:06.50
>>983 半角英数だけならgetasynckeystateでやればよくね
名前ミスだから気にしなくて良いです
入力をフックして取得するってのは、対象がExcelでも
ExcelVBAの分野ではないから、とりあえずスレ違いだね
まあ具体的な方法とか聴く前に、自分こそ具体的に何がしたくて
そういう動作を求めているのかを書けば、VBA分野で別な方法が
あるかもしれないけどね
入力中ならフックするしかなくね
セルが見えてるなら画面キャプチャーするという手も
普通はやらないけど
次スレよろ
991 :
デフォルトの名無しさん:2011/09/25(日) 15:21:28.35
992 :
デフォルトの名無しさん:2011/09/25(日) 15:30:43.80
セルをコピーしてjpgで出力ってできないの?
できないことない
>>992 「図としてコピー」というコマンドで任意のセル範囲を図形としてコピーできる
あとはそのコピーされた図形を頑張ってjpg保存とかすればいいと思う
996 :
デフォルトの名無しさん:2011/09/25(日) 16:15:15.22
ここでいいかな?
|:::::::::::::::
∧_∧::::::::::::
__ (´・ω・`) :::::::: すみません、ここでうんこしていいですか?
◎ー) / \:::::::::
| | (⌒) (⌒二 )::::::::::::
~~~ /⌒ヽ( ̄、 ヽ___
/ Lヽ \ノ___
゙ー―――(__)---
梅
梅干
999
終わり
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。