Excel VBA 質問スレ Part40 [無断転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2016/02/19(金) 02:49:44.77ID:BQQ9mWtn___
___ /____ヽ ____
/____\ | |´・ω・`| | /___ヽ
.l |´・ω・`| ニX二 . ̄ ̄ ̄ 二X二 |´・ω・`| l 俺たちに任せろ
!、 ̄ ̄ ̄ ヽ | | /  ̄ ̄ ̄/
ヽ_/ヽ、 ヽ__) \__/\_/. /_/ ノヽ_/
 ̄  ̄ ̄
このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。
コードが嫌な人・作成依頼が嫌な人は別スレ建ててください。
※前スレ
Excel VBA 質問スレ Part39 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1448624205/
0322デフォルトの名無しさん
2016/03/08(火) 01:26:22.87ID:bwi0BspMhttp://officetanaka.net/excel/vba/statement/Name.htm
0323デフォルトの名無しさん
2016/03/08(火) 19:57:54.75ID:9s/oHe/S多重ネストを回避するにはどうすればいいんでしょうか
少し複雑なプログラムを書くと、だいたいifの多重ネストが発生してしまいます。
select case や do whileなどは状況に応じて使い分けているのですが、それらもifの親だったり子だったりします。
何かコツというか、アドバイスを頂けると嬉しいです。
0324デフォルトの名無しさん
2016/03/08(火) 20:17:21.12ID:RMKFy6zt0325デフォルトの名無しさん
2016/03/08(火) 20:18:05.37ID:fR2CUJwxおまえがどういう条件で入ってくる値を分類するかによる。
0326デフォルトの名無しさん
2016/03/08(火) 20:32:55.36ID:nBW8sWlC多重ネストから抜ける方法じゃなくて回避する方法、とな?
0327デフォルトの名無しさん
2016/03/08(火) 20:52:02.31ID:Vc6G9loFAccessとかでデータベース弄ってみると解決のヒントになるかも。
俺も最初の頃は物凄い複雑な多重ネストしてたけど、二次元配列にすればだいたい単純化出来ると知った。
0328デフォルトの名無しさん
2016/03/08(火) 20:54:03.15ID:9s/oHe/Sそういう話が聞きたかったのです
ありがとうございます
0329デフォルトの名無しさん
2016/03/08(火) 21:07:40.52ID:835pn7ETなにそれ
詳しく教えて
0330デフォルトの名無しさん
2016/03/08(火) 21:17:39.28ID:h5qI0BBpまあ、ロジック見直すのが第1だな
0331デフォルトの名無しさん
2016/03/08(火) 21:31:41.20ID:Vc6G9loF多重ネストっていうのは、ネスト階層そのものがメモリの役割を果たしているわけだから、
その階層を記録そのもので代替すればネスト階層を少なく出来るし、ループ処理しやすくなる。
0332デフォルトの名無しさん
2016/03/08(火) 21:50:26.37ID:rEDH5rdcそうでないなら条件分けが論理的でないとか
0333デフォルトの名無しさん
2016/03/08(火) 22:18:08.86ID:MOSr64Vhそもそも関数に分けてないのは論外
0334デフォルトの名無しさん
2016/03/08(火) 22:18:39.27ID:Murbzmcdif not 条件1 then
go to continue
end if
if not 条件2 then
go to continue
end if
if not 条件3 then
go to continue
end if
continue:
next i
function hogehoge()
if 条件1 then
hogehoge = fugafuga
exit function
end if
if 条件2 then
hogehoge = fugafuga
exit function
end if
end function
平気でgoto文使ってるわ…
continue文とreturn文、OrElseAndAlso条件式vbaにも欲しいよー
0335デフォルトの名無しさん
2016/03/08(火) 22:41:28.42ID:Vc6G9loF0336デフォルトの名無しさん
2016/03/08(火) 23:18:30.06ID:yqVtrlfPそれな
0337デフォルトの名無しさん
2016/03/08(火) 23:41:33.25ID:nBW8sWlC0338デフォルトの名無しさん
2016/03/09(水) 00:10:33.98ID:m+VCUuOsary=sprit("A_B_C_D_E_F", "_")
newname=ary(1) & ary(4) & "_" & ary(0)
0339デフォルトの名無しさん
2016/03/09(水) 01:37:19.14ID:ISN2ur/+if not cond1 then exit do
if not cond2 then exit do
if not cond3 then exit do
if not cond4 then exit do
if not cond5 then exit do
if not cond6 then exit do
loop until true
0340デフォルトの名無しさん
2016/03/09(水) 18:00:15.34ID:DOBDJjUidoeventsで対応出来たのですがデメリットなどありますか?
0341デフォルトの名無しさん
2016/03/09(水) 19:41:01.70ID:bmHnXMYB単純に処理速度が遅くなる、そのループ中にユーザーが他のボタンを押したりや、イベントを発生させる事ができるからどんなエラーが出てもおかしくないってのが挙げられるね
処理中のキャンセルボタンとかには必要だけど、エラー処理しっかりしないと変な使い方されるとバグるよって感じ
0342デフォルトの名無しさん
2016/03/09(水) 19:49:50.90ID:8rDFbZP8なるほど
その辺はdoevents使うときにグローバル変数でも使えば対象出来そうですね
0343デフォルトの名無しさん
2016/03/09(水) 20:18:05.86ID:fhz9XN7U世の中に出回る大抵の「ユーザーに途中で弄られるとバグるシステム」は、この方法で回避してる。
ついでに進捗率とキャンセルボタン付けておけば便利。
0344デフォルトの名無しさん
2016/03/09(水) 20:37:29.21ID:zuimL+5Mうーーーん勉強になる!
0345デフォルトの名無しさん
2016/03/09(水) 21:02:53.20ID:8rDFbZP8進捗率どうやればいいの?
0346デフォルトの名無しさん
2016/03/09(水) 21:19:50.18ID:fhz9XN7U何が「どう」なのか分からないけど、
・率の計算なら現在値/全体値で出せる。ただし全体の数と、現在を示す値がどれか分かっていなければ当然出来ない。
・進捗率バーを出したいならユーザーフォームのツールボックスの空いてる所を右クリックして
「その他のコントロール」からProgressBarを選べばいい・・・はずだけど俺のPCでは何故か見あたらない。
・値を表示したいならラベルのCaptionに突っ込んでもいいし、ProgressBarが見当たらなくて自作したいなら、
適当なラベルで同じ大きさのものを二つ重ねて背景色をつけて、
上の方に表示されているラベルの横幅を、下の方に表示されているラベルの横幅に進捗率掛けても出来たはず。
0347デフォルトの名無しさん
2016/03/10(木) 07:04:11.23ID:+km6LsFg0348デフォルトの名無しさん
2016/03/10(木) 09:40:35.29ID:0HUIwvkkhttp://www.moug.net/tech/exvba/0090015.html
すぐに出てくるだろーが
0349デフォルトの名無しさん
2016/03/10(木) 19:14:57.62ID:ktNP4enhプロシージャをコールするときに引数をカッコで囲むと値渡しになるのな
今日、知らずにそれやってて1時間ぐらい嵌っちまった
0350デフォルトの名無しさん
2016/03/10(木) 19:39:52.03ID:KtHC/EJ0奇遇だね。俺は昨日はまった。(マジ)
0351デフォルトの名無しさん
2016/03/10(木) 19:41:26.38ID:YDCDLTcE0352デフォルトの名無しさん
2016/03/10(木) 19:43:57.85ID:KtHC/EJ0カッコで囲んでかつ関数の返り値を捨てるとそうなるのはわかった。
0353デフォルトの名無しさん
2016/03/10(木) 19:54:02.89ID:4xET+MUO関数とかプロシージャの側でby refとかby val付けたら参照渡し、値渡しじゃなかったっけ?
0354デフォルトの名無しさん
2016/03/10(木) 20:03:02.67ID:YDCDLTcESub test1(x)
x = x + 1
End Sub
Sub test()
test1 (i)
Debug.Print i
End Sub
これでも普通に起きるから、カッコ自体が値を返してるんじゃないの。
カッコが返した値に対して色々やってるから一見すると値渡しに見えるだけだと思う。
俺も初めて知ったけど、これ便利だな。同じ関数で値を保護するかしないか選べるのがいい。
0355デフォルトの名無しさん
2016/03/10(木) 20:10:47.12ID:4xET+MUOiでは無く (i)がtest1に渡されるのでは?
関数の形式で書くと
test1( (i) )
call test1(i) 参照渡し
call test1((i)) 値渡し
と予想
0356デフォルトの名無しさん
2016/03/10(木) 20:24:42.26ID:ktNP4enhhttp://home.att.ne.jp/zeta/gen/excel/c04p11.htm
ここに書いてあった
>括弧で囲まれた引数を式として評価するために一時的にメモリの別領域に値が確保されたためです。
引数として渡したのはあくまで別に確保された領域のポインタを参照渡ししただけで、元のデータの場所ではありません。
ってのが割りと分りやすい説明だと思う
0357デフォルトの名無しさん
2016/03/10(木) 20:29:43.73ID:KtHC/EJ0そういうことなのかもね。
自分がはまったのは、以下のようなパターン。
result = func(a)
とやると参照渡しになるのに、
func (a)
のように返り値を受け取らないと値渡しになってしまう。
双方ともカッコはあるんだけど、その意味が変化してしまうようだ。
前にスペースがあくのも怪しいし。
0358デフォルトの名無しさん
2016/03/10(木) 20:39:47.39ID:KtHC/EJ0なるほどね。
「返り値を利用する」だけど、普通に受けとる、"Call" を頭に付ける、以外にも、
メソッド呼び出し(返り値がオブジェクト型のとき)を後ろに続けてもいいみたいだ。
0359デフォルトの名無しさん
2016/03/10(木) 20:41:01.66ID:LNX/blvpいや、わかってるなら嵌るなよ
0360デフォルトの名無しさん
2016/03/10(木) 20:41:59.77ID:YDCDLTcE引数と関数の間にちょっとスペースが入っただけっていう考え方に草
0361デフォルトの名無しさん
2016/03/10(木) 20:50:04.66ID:ktNP4enh>func (a)
>のように返り値を受け取らないと値渡しになってしまう。
これちょっと違うっぽい
返り値云々じゃなくて、頭にCallを付けてるかどうかの問題らしい
Call hoge(a) :参照渡し
hoge a :参照渡し
Call((a)) :値渡し
hoge (a) :値渡し
0362デフォルトの名無しさん
2016/03/10(木) 20:52:14.68ID:ktNP4enhCall hoge(a) :参照渡し
hoge a :参照渡し
Call hoge((a)) :値渡し
hoge (a) :値渡し
0363デフォルトの名無しさん
2016/03/10(木) 20:56:34.88ID:xRgSerYm式にすればいいだけじゃね?
(x) とか x+0 とか x * 1 とか
なんか最適化されそうでちょっと恐いから、誰か試してみて
0364デフォルトの名無しさん
2016/03/10(木) 21:04:23.07ID:E15ymOk9VBAのレベル:スーパーど素人(見はじめてから3時間ぐらい、プログラムのスキルはごく簡単なbashを、インターネットを駆使して、何とか自力でかけるレベル)
VBAの構造としてはこんな感じです
-----------------------------
Dim hogehoge As Long ←変数の宣言?がいくつか書いてある
※1
Sub ボタン1_Click() ←1個目のサブルーチン?
なんかのコード
End Sub
Sub suburuchin() ←2個目のサブルーチン?Sub サブチーチン名()がこの下に4つある
Dim yamayama As Integer
なんかのコード
End Sub
※2
-----------------------------
コードの動きとしては、ボタンを押すと、上記コードが実行されて、実行時に選択されていたセルに値をいれて、選択セルから一つ下に下がる。
(実行時にA1が選択されていたら、A1に値を入れる→A2に下がる、A2が選択されている状態で実行すると、A2に値が入って、A3にさがる)
というVBAです。(人に作ってもらいました・・)
これを、指定した回数繰り返させたいのですが、VBA的に簡単な方法はありませんでしょうか。よろしくお願いします。
※1に
Sub Macro1()
For i = 1 To 10 と入れて、
※2に
Next i
End Sub と入れて、コード全体をサブルーチン化してしまえばうまくいくんじゃね?と思ってやってみたけどダメでした。
0365デフォルトの名無しさん
2016/03/10(木) 21:11:01.91ID:xRgSerYm> やってみたけどダメでした。
どうダメだったのか書けよ
0366デフォルトの名無しさん
2016/03/10(木) 21:14:40.98ID:YDCDLTcESub Macro1()
For i = 1 to 10
ボタン1_Click()
suburuchin()
Next
End Sub
こう書く。
0367デフォルトの名無しさん
2016/03/10(木) 21:27:09.48ID:n+nn3+TvCallがどうこうじゃなくて、引数が(構文的に必要ない余分な)カッコでくくられてるかどうか
カッコでくくられた部分が式として評価されるから、元の変数とは別物になるだけ
ややこしいのはプロシジャ呼ぶ時のカッコの必須/省略可能のルール
0368デフォルトの名無しさん
2016/03/10(木) 21:32:25.24ID:E15ymOk9入れた後も、入れる前と動きは変わりませんでした。
>>366
ありがとうございます!うまくいきました!
全部囲わずに、中に入れればよかったんですね・・・。
0369デフォルトの名無しさん
2016/03/10(木) 21:42:47.62ID:ktNP4enh>ややこしいのはプロシジャ呼ぶ時のカッコの必須/省略可能のルール
いや、俺もそういう意味で言ってる
Callのあるなしでカッコが必須かどうかが変わるってのが前提にあって
Callなしで引数に括弧を書くと構文上不要なカッコとみなされるって話だから
>>357のように
result = func(a) と対比するなら
func(a) じゃなくて
result = func((a)) のほうだよねってこと
0370デフォルトの名無しさん
2016/03/10(木) 21:44:41.53ID:TmlGNQiU自分で書いてても理解しづらいし、エラーが起きた時に探すのに時間はかかるし、恥ずかしいし…
型宣言もないのか…
0371デフォルトの名無しさん
2016/03/10(木) 21:45:18.98ID:fibsVr8n0372デフォルトの名無しさん
2016/03/10(木) 21:50:55.60ID:bAfaOEHz0373デフォルトの名無しさん
2016/03/10(木) 21:59:24.40ID:ktNP4enh言ってる意味が分からん
おれは関数呼び出しってのは
Functionプロシージャをコールするって意味で使ってるんだが
何か別の意味があるのか?
ちなみに返り値を使わないFunctionコールなら括弧無しで書ける
返り値使わないのにFunctionにする意味があるかは別の話
0374デフォルトの名無しさん
2016/03/10(木) 22:02:00.01ID:BlUpxWze「ByRef書いても値渡しになってしまう」現象について話し合われている、
っていうのはわかってるよね?
0375デフォルトの名無しさん
2016/03/10(木) 22:02:31.94ID:YDCDLTcE「つけてもつけなくてもいいよ」っていうカッコが無いって意味だろ。
0376デフォルトの名無しさん
2016/03/10(木) 22:04:37.32ID:fibsVr8n良く読んでませんでした。
0377デフォルトの名無しさん
2016/03/10(木) 22:07:11.96ID:7stvDytsカッコなしで書けるではなく、カッコを使ってはいけないが正解だな。
0378デフォルトの名無しさん
2016/03/10(木) 22:10:29.12ID:ktNP4enhサブプロシージャのコールや
返り値無しのファンクションプロシージャのコールなら
Call付けて括弧もつけるか
Callなしで括弧もつけないかでどっちも参照渡しだから
省略できるカッコと看做せるんじゃないかっていう解釈もありじゃない?
0379デフォルトの名無しさん
2016/03/10(木) 22:13:15.89ID:ktNP4enhいや、カッコつけると値渡しになるのは別にいけないことではないと思うけど?
マイクロソフトだって正式に仕様として公開してるんだし
0380デフォルトの名無しさん
2016/03/10(木) 22:17:23.35ID:7stvDytsお前自分で書いておいて>>356の意味分かってないだろ。
「参照渡しが値渡しに変わった」のではないって意味だぞそのリンク先に書いてるのは。
0381デフォルトの名無しさん
2016/03/10(木) 22:19:33.62ID:ktNP4enhいや、現象として参照渡しと同じ結果なんだから
その理由は別にいいじゃん
なんか違う結果が出るシチュエーションってある?
0382デフォルトの名無しさん
2016/03/10(木) 22:20:53.12ID:ktNP4enh>現象として参照渡しと同じ結果
じゃなくて
値渡しな
0383デフォルトの名無しさん
2016/03/10(木) 22:22:46.38ID:YDCDLTcE0384デフォルトの名無しさん
2016/03/10(木) 22:23:24.86ID:7stvDytsもはや何を言ってるのか訳分からんが
どうやって呼び出そうが参照渡しは参照渡しのままだ。
独自の解釈を編み出すより、まずそこを理解する努力をしろ。
0385デフォルトの名無しさん
2016/03/10(木) 22:32:25.83ID:Fe+LxwxG> ややこしいのはプロシジャ呼ぶ時のカッコの必須/省略可能のルール
ややこしいか?
'?' が引数だとして、構文が
Call hoge(?)
hoge ?
の二種類あるだけ
なので、
> Call hoge(a) ⇒ ?= a:変数なので参照渡し
> hoge a ⇒ ?= a:変数なので参照渡し
> Call hoge((a)) ⇒ ?= (a):式なので値渡し
> hoge (a) ⇒ (a):式なので値渡し
ってなるだけでしょ
0386デフォルトの名無しさん
2016/03/10(木) 22:39:34.58ID:7stvDytsヤキモキするからもうやめるわ。
0387デフォルトの名無しさん
2016/03/10(木) 22:40:37.98ID:ktNP4enh>もはや何を言ってるのか訳分からんが
>どうやって呼び出そうが参照渡しは参照渡しのままだ。
そうはいってもマイクロソフトもこう言ってるしな
別に独自の解釈って訳でもないのよ
https://msdn.microsoft.com/ja-jp/library/cc436535.aspx
>引数渡しの方法の決定
>引数を渡す方法は、プロシージャの宣言によって決まります。
>宣言で ByVal が使用されている場合、呼び出し元のコードでそれを変更することはできません。
>しかし、ByRef を使って引数が宣言されている場合は、
>呼び出し元のコードで引数名をかっこで囲むことによって、値渡しで渡すように変更できます。次に例を示します。
0388デフォルトの名無しさん
2016/03/10(木) 22:40:42.91ID:BlUpxWzeSub の場合はそうだけど、Function の場合が嵌りやすいね。
0389デフォルトの名無しさん
2016/03/10(木) 22:48:29.46ID:6K4R3xGybyrefを引数に持つ関数やサブルーチンの呼び出し側で変数以外の式をパラメータとして与えると、
その式の結果を格納する一時領域が参照元になり、結果的にbyvalと同じ挙動に見える
という現象であって
>>385
で値渡しと書いてしまうとまた混乱が起きると思う
暗黙の一時変数が参照元になる仕組みをどう呼ぶかの話だけど
呼び出された関数/サブから見れば参照渡しは参照渡し
0390デフォルトの名無しさん
2016/03/10(木) 22:56:18.57ID:YDCDLTcEByValも変数を別領域にコピーして利用するという仕様だから挙動的にはどちらも「値渡し」でいいんだろ。
問題はその「暗黙の一時変数」というもの自体を理解出来るかどうかだと思う。
0391デフォルトの名無しさん
2016/03/10(木) 23:12:35.70ID:ktNP4enhマイクロソフトがこれは値渡しだっていってんのに
どう呼ぶも糞もないわ
0392デフォルトの名無しさん
2016/03/10(木) 23:18:22.79ID:1xnVZ4wKパフォーマンス的にはどうせExcel操作がボトルネックになるんだから
参照渡しなんか紛らわしいだけ
0393デフォルトの名無しさん
2016/03/10(木) 23:20:00.55ID:TmlGNQiU返り値返さない関数はcall使えよ、んでbyval byref書けよ
しょーもな
0394デフォルトの名無しさん
2016/03/10(木) 23:26:51.00ID:6K4R3xGy呼び出し側で勝手にbyvalにできますなんて、関数/サブの定義を無視するような行為だからねえ
結局この仕様を知らないと、一見して何がおかしいか判らない上に、
動かしてもエラーにもならず、なぜか結果だけがおかしい
被害が1時間では済まないかもしれない
0395デフォルトの名無しさん
2016/03/10(木) 23:30:35.11ID:BlUpxWzecallはともかくとして、みんなbyval byrefは書く前提で話してるようだが?
0396デフォルトの名無しさん
2016/03/10(木) 23:36:07.63ID:4xET+MUO値渡しに変更できると言う解釈もあるだろうけど
ただ単に式を評価した結果をメモリに置いて其処への参照を渡しているとも解釈できる
括弧で囲むと式になるというのはプロシージャの引数の時に限らない
0397デフォルトの名無しさん
2016/03/10(木) 23:38:42.45ID:BlUpxWzeいやむしろ基本ByRefであるべき
変数を直接渡したくないときはコピーを作って代入すればいいんだし。
さすがに y = func((x)) と2重カッコにするのはやらないだろ。
個人的にはExcel操作なんかあまりやらない。
関数呼び出しのたびに変数のコピーなんかされたら大変なことになっちゃう。
0398デフォルトの名無しさん
2016/03/10(木) 23:48:50.40ID:qFayifgR最近のプログラミング言語では基本的に常に値渡しを使用し、
参照渡しのようなことがしたいときはオブジェクト参照の値渡し(VBAだとByValでオブジェクトを渡す)を使うのが一般的になっている
0399デフォルトの名無しさん
2016/03/10(木) 23:53:03.75ID:BlUpxWze配列が ByVal で参照渡しになればそれでいいんだけどね。
>>397は言葉足らずだったが、「呼び出しのたびに配列のコピーされたんじゃかなわん」に読み替えてほしい。
0400デフォルトの名無しさん
2016/03/11(金) 05:37:41.18ID:KiCPGGTyCの頃からそういう仕様だろ。ポインタを自由に扱える言語はそれでいいんだよ。
VBAみたいにポインタを隠匿する言語にはByRefの様な仕様が必要になるのであって、なんとなく参照渡しがあるわけではない。
0401デフォルトの名無しさん
2016/03/11(金) 08:09:55.21ID:7Z/AuMHW参照渡しが必要だからあるわけじゃなく、VBがそういう設計思想だっただけだ。
0402デフォルトの名無しさん
2016/03/11(金) 09:09:03.62ID:TWxKqqOQそれは言い過ぎ。参照渡しが必要な場面があるんだからさ。
0403デフォルトの名無しさん
2016/03/11(金) 11:24:01.36ID:nAypi/ek旧時代言語のVBAだとその辺はまだあまり洗練されてないから現実的にはByRefを使わざるを得ないけど
0404デフォルトの名無しさん
2016/03/11(金) 11:37:46.96ID:0Hu19p0zCollectionについて、犬にもわかるように優しい解説してるところない?
オタッキーな人が書いてる怪文書なものではなく。
0405デフォルトの名無しさん
2016/03/11(金) 12:31:48.96ID:We4YLNv1中途半端な知識を身につけて悩んでるような奴等は黙ってByRefにしときゃいいんだよ
お前らのためにVBがあるのだから
0406デフォルトの名無しさん
2016/03/11(金) 13:13:17.67ID:ME9cp217コレクションだから自分が集めたいものを集めたもの
名前の様な役割をするkeyやコレクション内での順番を指定するとものを取り出せる
0407デフォルトの名無しさん
2016/03/11(金) 14:17:24.30ID:TWxKqqOQ0408デフォルトの名無しさん
2016/03/11(金) 20:25:05.99ID:KiCPGGTy線形リストっていうのはですね、その利便性に対してパフォーマンスがほとんど落ちない事が特徴なんですねデュフッ
一つ一つの要素はデータ部とノード部にンフゥ分かれるんですがね、これによってですね、
評価と探索を再帰的に行う事が出来てコンパイラ言語においても美しくコードが書けるんですねポホゥ
そして線形リストというのは探索一つとっても特徴的なものでウヒッ追加中にソーティングと同じ効果を与える事も出来るんですね
おっと、その特徴があるからOSのタスク処理でも広く使われているわけで、こんな事は常識ですな、こりゃ失敬オッポゥ
このノード部というのは当然ですがポインタなわけで、これによって連続した領域を確保する必要がないというのも利便性を上げている要因の一つなんですねヒョホッ
逆に予め一定の連続した領域を確保しておくとですねンンッキャッシュヒットレシオを向上させられるのでさらにパフォーマンスが上がるんですね
しかもKeyの様なユニークIDのみで一次検索をしますと容量を抑えられますから場合によっては線形リスト全体がキャッシュに乗ってしまう可能性もあるんですねオホッ
まぁ今のCPUは古参の我が輩には信じられないくらいのキャッシュ容量がありますからンフフッあまり気にしなくてもコーディングできてしまうかもしれませんがねコポォ
0409デフォルトの名無しさん
2016/03/11(金) 20:46:11.49ID:1/lTJA2g0410デフォルトの名無しさん
2016/03/11(金) 22:27:37.87ID:FUuFvB4q> ポインタがなくて値渡しだけの言語なんていくらでもあるが。
具体的な言語名書いてみそ
0411デフォルトの名無しさん
2016/03/11(金) 22:28:40.82ID:9lXM9rzx線形リストが出たので探索の観点て書いてみる
ExcelやDBのような複数フィールドを持つデータ構造では、何らかのフィールドによって
順序化された状態で扱われ、任意のフィールドをキーにしたソートが頻繁に行われる
しかしデータが何万行ともなるとソート処理を毎回正直に行うのでは遅すぎて使い物にならない
そこでソートに使わるフィールドに対しインデックスを保持しておくことにする
インデックスを参照すれば、ソート要求で実際にソートせずに見かけ上ソートと同じ出力結果を
データ量に比例した定数時間O(n)で得ることが可能になる
ちなみに毎回ソートする場合は最短でもO(n log n)時間となる (O(n) < O(n log n))
データの追加や削除については、インデックスにより順序化されていれば平均O(log n)時間で済む
線形リストでは、ある順序に基づく追加や削除の場合O(n)時間が掛かってしまう (O(log n) < O(n))
探索においてはデータの順序以外にキー自体のチューニングが存在する
SmalltalkやLispでいうところのシンボル(インターンドシンボル)は、
同一の文字列が一意に管理されるデータ構造で、文字列同士の比較はアドレスの比較と等しく、
探索はその文字列をインターン化した時点で完了する
これを一般化したものが連想配列等で使われるハッシュ構造O(1)である
また、文字列をトライや基数木で管理すると、文字列を走査した時点で探索が完了し、
この仕組みはハッシュ構造よりも高速であり、圧縮アルゴリズム等でもよく使われる
0412デフォルトの名無しさん
2016/03/11(金) 22:40:00.71ID:9lXM9rzxちょうどLisp系なんかがそうだね
この場合VBAでいうオブジェクトの参照の値渡しに相当するから
それらを関数内から書き換える手段はいくらでもある
ちなみにLISPはマクロを使うと参照渡しっぽく記述できる
(あくまでそう見えるだけで実際に参照渡しを行っているわけではない)
値渡しといってもやりとりは全てアドレスかその領域に収まる即値だから効率も良い
GC前提の言語だとなんとか渡しみたいな指定のある言語は逆に少ない気がする
0413デフォルトの名無しさん
2016/03/12(土) 01:33:53.67ID:Vp+P3H450414デフォルトの名無しさん
2016/03/12(土) 01:55:29.41ID:L1DCwZtHどこがどうおかしいのか詳しく
0415デフォルトの名無しさん
2016/03/12(土) 02:57:20.50ID:4xL8NTYBCのことはよく知らないんだが、
テーブルジャンプが使えるのには恐れいったわ。
もっとも、もっと洗練された形のDelegateがある今
無いアドレスを指定してしまったりする怖さがあることを考えると、ちょっとなぁ。
0416デフォルトの名無しさん
2016/03/12(土) 07:23:24.06ID:DI01AjHI何かよく分からないけど、ExcelってシートにDB見たいにINDEX持てるんだ?
因みにキーから値を引っ張りたい場合、配列に設定してループで取ってくるのと
CollectionやDictionaryに設定して取ってくるのとどっちが早いんだろ。
0417デフォルトの名無しさん
2016/03/12(土) 10:09:17.55ID:ZuDRYyOf>>416
Keyが判明している限りはKeyで取ってくる方が早いよ。
一万要素あるDictionary型で実験した限りだとKeyで探る方は計測不能なくらい短い時間だったし。
0418デフォルトの名無しさん
2016/03/12(土) 10:14:29.27ID:+KV61A6eどうしてもExcelに拘るんならシートをテーブルに見立ててOLEDBでも使え
0419デフォルトの名無しさん
2016/03/12(土) 12:51:20.27ID:3TH7PHr+基本的にデータベースは作るものだ
その為にエクセルマクロはお前の前にある
0420デフォルトの名無しさん
2016/03/12(土) 12:53:33.97ID:LUcF5SRyエクセルvbaからアクセスにクエリ投げれるし
0421デフォルトの名無しさん
2016/03/12(土) 12:55:42.38ID:2d1xhU2z> ちょうどLisp系なんかがそうだね
Lisp なんて全てポインタみたいなもんなんだが w
> GC前提の言語だとなんとか渡しみたいな指定のある言語は逆に少ない気がする
GC と渡し方の指定は関係ないと思う
■ このスレッドは過去ログ倉庫に格納されています