トップページtech
1002コメント360KB

Excel VBA 質問スレ Part40 [無断転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2016/02/19(金) 02:49:44.77ID:BQQ9mWtn
ExcelのVBAに関する質問スレです

                   ___
       ___      /____ヽ      ____
      /____\    | |´・ω・`| |    /___ヽ
      .l |´・ω・`|  ニX二 . ̄ ̄ ̄  二X二  |´・ω・`| l 俺たちに任せろ
      !、 ̄ ̄ ̄  ヽ   |       |    /    ̄ ̄ ̄/
       ヽ_/ヽ、  ヽ__)  \__/\_/.   /_/  ノヽ_/
             ̄                ̄ ̄

このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。

コードが嫌な人・作成依頼が嫌な人は別スレ建ててください。

※前スレ
Excel VBA 質問スレ Part39 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1448624205/
0357デフォルトの名無しさん2016/03/10(木) 20:29:43.73ID:KtHC/EJ0
>>354-355
そういうことなのかもね。
自分がはまったのは、以下のようなパターン。
result = func(a)
とやると参照渡しになるのに、
func (a)
のように返り値を受け取らないと値渡しになってしまう。
双方ともカッコはあるんだけど、その意味が変化してしまうようだ。
前にスペースがあくのも怪しいし。
0358デフォルトの名無しさん2016/03/10(木) 20:39:47.39ID:KtHC/EJ0
>>356
なるほどね。
「返り値を利用する」だけど、普通に受けとる、"Call" を頭に付ける、以外にも、
メソッド呼び出し(返り値がオブジェクト型のとき)を後ろに続けてもいいみたいだ。
0359デフォルトの名無しさん2016/03/10(木) 20:41:01.66ID:LNX/blvp
>>351
いや、わかってるなら嵌るなよ
0360デフォルトの名無しさん2016/03/10(木) 20:41:59.77ID:YDCDLTcE
>>357
引数と関数の間にちょっとスペースが入っただけっていう考え方に草
0361デフォルトの名無しさん2016/03/10(木) 20:50:04.66ID:ktNP4enh
>>357
>func (a)
>のように返り値を受け取らないと値渡しになってしまう。

これちょっと違うっぽい
返り値云々じゃなくて、頭にCallを付けてるかどうかの問題らしい

Call hoge(a) :参照渡し
hoge a    :参照渡し
Call((a))   :値渡し
hoge (a)   :値渡し
0362デフォルトの名無しさん2016/03/10(木) 20:52:14.68ID:ktNP4enh
1ヶ所間違えた
Call hoge(a)   :参照渡し
hoge a      :参照渡し
Call hoge((a))  :値渡し
hoge (a)     :値渡し
0363デフォルトの名無しさん2016/03/10(木) 20:56:34.88ID:xRgSerYm
>>352
式にすればいいだけじゃね?
(x) とか x+0 とか x * 1 とか
なんか最適化されそうでちょっと恐いから、誰か試してみて
0364デフォルトの名無しさん2016/03/10(木) 21:04:23.07ID:E15ymOk9
バージョン:Excel 2010
VBAのレベル:スーパーど素人(見はじめてから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
>>364
> やってみたけどダメでした。
どうダメだったのか書けよ
0366デフォルトの名無しさん2016/03/10(木) 21:14:40.98ID:YDCDLTcE
>>364
Sub Macro1()
 For i = 1 to 10
   ボタン1_Click()
   suburuchin()
 Next
End Sub

こう書く。
0367デフォルトの名無しさん2016/03/10(木) 21:27:09.48ID:n+nn3+Tv
>>361
Callがどうこうじゃなくて、引数が(構文的に必要ない余分な)カッコでくくられてるかどうか
カッコでくくられた部分が式として評価されるから、元の変数とは別物になるだけ

ややこしいのはプロシジャ呼ぶ時のカッコの必須/省略可能のルール
0368デフォルトの名無しさん2016/03/10(木) 21:32:25.24ID:E15ymOk9
>>365
入れた後も、入れる前と動きは変わりませんでした。


>>366
ありがとうございます!うまくいきました!
全部囲わずに、中に入れればよかったんですね・・・。
0369デフォルトの名無しさん2016/03/10(木) 21:42:47.62ID:ktNP4enh
>>367
>ややこしいのはプロシジャ呼ぶ時のカッコの必須/省略可能のルール

いや、俺もそういう意味で言ってる
Callのあるなしでカッコが必須かどうかが変わるってのが前提にあって
Callなしで引数に括弧を書くと構文上不要なカッコとみなされるって話だから
>>357のように
result = func(a) と対比するなら
func(a) じゃなくて
result = func((a)) のほうだよねってこと
0370デフォルトの名無しさん2016/03/10(木) 21:44:41.53ID:TmlGNQiU
ちゃんとbyval byref書いてないクソコード見たくねぇ…
自分で書いてても理解しづらいし、エラーが起きた時に探すのに時間はかかるし、恥ずかしいし…
型宣言もないのか…
0371デフォルトの名無しさん2016/03/10(木) 21:45:18.98ID:fibsVr8n
ByRef書けや
0372デフォルトの名無しさん2016/03/10(木) 21:50:55.60ID:bAfaOEHz
そもそも関数呼び出しに省略可能なカッコとかないのだが君達は何を勘違いしてるのかね?
0373デフォルトの名無しさん2016/03/10(木) 21:59:24.40ID:ktNP4enh
>>372
言ってる意味が分からん
おれは関数呼び出しってのは
Functionプロシージャをコールするって意味で使ってるんだが
何か別の意味があるのか?

ちなみに返り値を使わないFunctionコールなら括弧無しで書ける
返り値使わないのにFunctionにする意味があるかは別の話
0374デフォルトの名無しさん2016/03/10(木) 22:02:00.01ID:BlUpxWze
>>370-371
「ByRef書いても値渡しになってしまう」現象について話し合われている、

っていうのはわかってるよね?
0375デフォルトの名無しさん2016/03/10(木) 22:02:31.94ID:YDCDLTcE
>>373
「つけてもつけなくてもいいよ」っていうカッコが無いって意味だろ。
0376デフォルトの名無しさん2016/03/10(木) 22:04:37.32ID:fibsVr8n
すいません。
良く読んでませんでした。
0377デフォルトの名無しさん2016/03/10(木) 22:07:11.96ID:7stvDyts
>>373
カッコなしで書けるではなく、カッコを使ってはいけないが正解だな。
0378デフォルトの名無しさん2016/03/10(木) 22:10:29.12ID:ktNP4enh
>>374
サブプロシージャのコールや
返り値無しのファンクションプロシージャのコールなら
Call付けて括弧もつけるか
Callなしで括弧もつけないかでどっちも参照渡しだから
省略できるカッコと看做せるんじゃないかっていう解釈もありじゃない?
0379デフォルトの名無しさん2016/03/10(木) 22:13:15.89ID:ktNP4enh
>>377
いや、カッコつけると値渡しになるのは別にいけないことではないと思うけど?
マイクロソフトだって正式に仕様として公開してるんだし
0380デフォルトの名無しさん2016/03/10(木) 22:17:23.35ID:7stvDyts
>>378
お前自分で書いておいて>>356の意味分かってないだろ。
「参照渡しが値渡しに変わった」のではないって意味だぞそのリンク先に書いてるのは。
0381デフォルトの名無しさん2016/03/10(木) 22:19:33.62ID:ktNP4enh
>>380
いや、現象として参照渡しと同じ結果なんだから
その理由は別にいいじゃん
なんか違う結果が出るシチュエーションってある?
0382デフォルトの名無しさん2016/03/10(木) 22:20:53.12ID:ktNP4enh
ゴメン、間違えた
>現象として参照渡しと同じ結果
じゃなくて
値渡しな
0383デフォルトの名無しさん2016/03/10(木) 22:22:46.38ID:YDCDLTcE
プログラミングで低レベルな部分を理解していないとどんな弊害が出るかっていう実例だなぁ、これ。
0384デフォルトの名無しさん2016/03/10(木) 22:23:24.86ID:7stvDyts
>>381
もはや何を言ってるのか訳分からんが
どうやって呼び出そうが参照渡しは参照渡しのままだ。
独自の解釈を編み出すより、まずそこを理解する努力をしろ。
0385デフォルトの名無しさん2016/03/10(木) 22:32:25.83ID:Fe+LxwxG
>>367
> ややこしいのはプロシジャ呼ぶ時のカッコの必須/省略可能のルール
ややこしいか?
'?' が引数だとして、構文が
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
>>384
>もはや何を言ってるのか訳分からんが
>どうやって呼び出そうが参照渡しは参照渡しのままだ。

そうはいってもマイクロソフトもこう言ってるしな
別に独自の解釈って訳でもないのよ

https://msdn.microsoft.com/ja-jp/library/cc436535.aspx
>引数渡しの方法の決定
>引数を渡す方法は、プロシージャの宣言によって決まります。
>宣言で ByVal が使用されている場合、呼び出し元のコードでそれを変更することはできません。
>しかし、ByRef を使って引数が宣言されている場合は、
>呼び出し元のコードで引数名をかっこで囲むことによって、値渡しで渡すように変更できます。次に例を示します。
0388デフォルトの名無しさん2016/03/10(木) 22:40:42.91ID:BlUpxWze
>>385
Sub の場合はそうだけど、Function の場合が嵌りやすいね。
0389デフォルトの名無しさん2016/03/10(木) 22:48:29.46ID:6K4R3xGy
まとめると
byrefを引数に持つ関数やサブルーチンの呼び出し側で変数以外の式をパラメータとして与えると、
その式の結果を格納する一時領域が参照元になり、結果的にbyvalと同じ挙動に見える
という現象であって

>>385
で値渡しと書いてしまうとまた混乱が起きると思う
暗黙の一時変数が参照元になる仕組みをどう呼ぶかの話だけど
呼び出された関数/サブから見れば参照渡しは参照渡し
0390デフォルトの名無しさん2016/03/10(木) 22:56:18.57ID:YDCDLTcE
>>389
ByValも変数を別領域にコピーして利用するという仕様だから挙動的にはどちらも「値渡し」でいいんだろ。
問題はその「暗黙の一時変数」というもの自体を理解出来るかどうかだと思う。
0391デフォルトの名無しさん2016/03/10(木) 23:12:35.70ID:ktNP4enh
>>389
マイクロソフトがこれは値渡しだっていってんのに
どう呼ぶも糞もないわ
0392デフォルトの名無しさん2016/03/10(木) 23:18:22.79ID:1xnVZ4wK
VBAなんか全部ByValでいいよ
パフォーマンス的にはどうせExcel操作がボトルネックになるんだから
参照渡しなんか紛らわしいだけ
0393デフォルトの名無しさん2016/03/10(木) 23:20:00.55ID:TmlGNQiU
結局はcallもbyval byrefも書かないクソコードだからこんなことになるんだろう
返り値返さない関数はcall使えよ、んでbyval byref書けよ
しょーもな
0394デフォルトの名無しさん2016/03/10(木) 23:26:51.00ID:6K4R3xGy
まあ呼び方はどうあれ、これはトラブルの種だよ
呼び出し側で勝手にbyvalにできますなんて、関数/サブの定義を無視するような行為だからねえ
結局この仕様を知らないと、一見して何がおかしいか判らない上に、
動かしてもエラーにもならず、なぜか結果だけがおかしい
被害が1時間では済まないかもしれない
0395デフォルトの名無しさん2016/03/10(木) 23:30:35.11ID:BlUpxWze
>>393
callはともかくとして、みんなbyval byrefは書く前提で話してるようだが?
0396デフォルトの名無しさん2016/03/10(木) 23:36:07.63ID:4xET+MUO
>>394
値渡しに変更できると言う解釈もあるだろうけど

ただ単に式を評価した結果をメモリに置いて其処への参照を渡しているとも解釈できる

括弧で囲むと式になるというのはプロシージャの引数の時に限らない
0397デフォルトの名無しさん2016/03/10(木) 23:38:42.45ID:BlUpxWze
>>932
いやむしろ基本ByRefであるべき
変数を直接渡したくないときはコピーを作って代入すればいいんだし。
さすがに y = func((x)) と2重カッコにするのはやらないだろ。

個人的にはExcel操作なんかあまりやらない。
関数呼び出しのたびに変数のコピーなんかされたら大変なことになっちゃう。
0398デフォルトの名無しさん2016/03/10(木) 23:48:50.40ID:qFayifgR
VB.NETではByValがデフォルトでクラスライブラリのメソッドもほぼ全てByValだけどね
最近のプログラミング言語では基本的に常に値渡しを使用し、
参照渡しのようなことがしたいときはオブジェクト参照の値渡し(VBAだとByValでオブジェクトを渡す)を使うのが一般的になっている
0399デフォルトの名無しさん2016/03/10(木) 23:53:03.75ID:BlUpxWze
>>398
配列が ByVal で参照渡しになればそれでいいんだけどね。
>>397は言葉足らずだったが、「呼び出しのたびに配列のコピーされたんじゃかなわん」に読み替えてほしい。
0400デフォルトの名無しさん2016/03/11(金) 05:37:41.18ID:KiCPGGTy
>>398
Cの頃からそういう仕様だろ。ポインタを自由に扱える言語はそれでいいんだよ。
VBAみたいにポインタを隠匿する言語にはByRefの様な仕様が必要になるのであって、なんとなく参照渡しがあるわけではない。
0401デフォルトの名無しさん2016/03/11(金) 08:09:55.21ID:7Z/AuMHW
ポインタがなくて値渡しだけの言語なんていくらでもあるが。
参照渡しが必要だからあるわけじゃなく、VBがそういう設計思想だっただけだ。
0402デフォルトの名無しさん2016/03/11(金) 09:09:03.62ID:TWxKqqOQ
>>401
それは言い過ぎ。参照渡しが必要な場面があるんだからさ。
0403デフォルトの名無しさん2016/03/11(金) 11:24:01.36ID:nAypi/ek
VBAでもCollectionとClassを活用すれば全部ByValでいけないことはない
旧時代言語のVBAだとその辺はまだあまり洗練されてないから現実的にはByRefを使わざるを得ないけど
0404デフォルトの名無しさん2016/03/11(金) 11:37:46.96ID:0Hu19p0z
>>403
Collectionについて、犬にもわかるように優しい解説してるところない?
オタッキーな人が書いてる怪文書なものではなく。
0405デフォルトの名無しさん2016/03/11(金) 12:31:48.96ID:We4YLNv1
VBは難しい事は知らなくてもいいようにデフォルト参照渡しになっている
中途半端な知識を身につけて悩んでるような奴等は黙ってByRefにしときゃいいんだよ

お前らのためにVBがあるのだから
0406デフォルトの名無しさん2016/03/11(金) 13:13:17.67ID:ME9cp217
>>404
コレクションだから自分が集めたいものを集めたもの

名前の様な役割をするkeyやコレクション内での順番を指定するとものを取り出せる
0407デフォルトの名無しさん2016/03/11(金) 14:17:24.30ID:TWxKqqOQ
追加と削除とパフォーマンス上のトレードオフについてオタクっぽく解説を!!
0408デフォルトの名無しさん2016/03/11(金) 20:25:05.99ID:KiCPGGTy
>>407
線形リストっていうのはですね、その利便性に対してパフォーマンスがほとんど落ちない事が特徴なんですねデュフッ
一つ一つの要素はデータ部とノード部にンフゥ分かれるんですがね、これによってですね、
評価と探索を再帰的に行う事が出来てコンパイラ言語においても美しくコードが書けるんですねポホゥ
そして線形リストというのは探索一つとっても特徴的なものでウヒッ追加中にソーティングと同じ効果を与える事も出来るんですね
おっと、その特徴があるからOSのタスク処理でも広く使われているわけで、こんな事は常識ですな、こりゃ失敬オッポゥ
このノード部というのは当然ですがポインタなわけで、これによって連続した領域を確保する必要がないというのも利便性を上げている要因の一つなんですねヒョホッ
逆に予め一定の連続した領域を確保しておくとですねンンッキャッシュヒットレシオを向上させられるのでさらにパフォーマンスが上がるんですね
しかもKeyの様なユニークIDのみで一次検索をしますと容量を抑えられますから場合によっては線形リスト全体がキャッシュに乗ってしまう可能性もあるんですねオホッ
まぁ今のCPUは古参の我が輩には信じられないくらいのキャッシュ容量がありますからンフフッあまり気にしなくてもコーディングできてしまうかもしれませんがねコポォ
0409デフォルトの名無しさん2016/03/11(金) 20:46:11.49ID:1/lTJA2g
いいぞ
0410デフォルトの名無しさん2016/03/11(金) 22:27:37.87ID:FUuFvB4q
>>401
> ポインタがなくて値渡しだけの言語なんていくらでもあるが。
具体的な言語名書いてみそ
0411デフォルトの名無しさん2016/03/11(金) 22:28:40.82ID:9lXM9rzx
>>407
線形リストが出たので探索の観点て書いてみる
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
>>410
ちょうどLisp系なんかがそうだね
この場合VBAでいうオブジェクトの参照の値渡しに相当するから
それらを関数内から書き換える手段はいくらでもある
ちなみにLISPはマクロを使うと参照渡しっぽく記述できる
(あくまでそう見えるだけで実際に参照渡しを行っているわけではない)
値渡しといってもやりとりは全てアドレスかその領域に収まる即値だから効率も良い
GC前提の言語だとなんとか渡しみたいな指定のある言語は逆に少ない気がする
0413デフォルトの名無しさん2016/03/12(土) 01:33:53.67ID:Vp+P3H45
VBAのByRefと代入演算子=との関係は少しおかしなところがあるよ。
0414デフォルトの名無しさん2016/03/12(土) 01:55:29.41ID:L1DCwZtH
>>413
どこがどうおかしいのか詳しく
0415デフォルトの名無しさん2016/03/12(土) 02:57:20.50ID:4xL8NTYB
ポインタかぁ。
Cのことはよく知らないんだが、
テーブルジャンプが使えるのには恐れいったわ。

もっとも、もっと洗練された形のDelegateがある今
無いアドレスを指定してしまったりする怖さがあることを考えると、ちょっとなぁ。
0416デフォルトの名無しさん2016/03/12(土) 07:23:24.06ID:DI01AjHI
>>411
何かよく分からないけど、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
さすがにC#やVB.NET使えよ
どうしてもExcelに拘るんならシートをテーブルに見立ててOLEDBでも使え
0419デフォルトの名無しさん2016/03/12(土) 12:51:20.27ID:3TH7PHr+
すでに目の前にあるものだけがデータベースではない
基本的にデータベースは作るものだ
その為にエクセルマクロはお前の前にある
0420デフォルトの名無しさん2016/03/12(土) 12:53:33.97ID:LUcF5SRy
Accessあるじゃろ
エクセルvbaからアクセスにクエリ投げれるし
0421デフォルトの名無しさん2016/03/12(土) 12:55:42.38ID:2d1xhU2z
>>412
> ちょうどLisp系なんかがそうだね
Lisp なんて全てポインタみたいなもんなんだが w

> GC前提の言語だとなんとか渡しみたいな指定のある言語は逆に少ない気がする
GC と渡し方の指定は関係ないと思う
0422デフォルトの名無しさん2016/03/12(土) 13:02:57.66ID:dvfrI9vN
データベースといえば普通どうやってクエリの結果を取得するんかね?
自分はODBCツールで配列変数に一括読み込みするパターンなんだが。
0423デフォルトの名無しさん2016/03/12(土) 13:10:38.61ID:xmc3dh7U
>>422
MSQUERY
0424デフォルトの名無しさん2016/03/12(土) 13:22:38.49ID:dvfrI9vN
なるほどいったんシートに取り込むのか
0425デフォルトの名無しさん2016/03/12(土) 14:02:40.99ID:ZuDRYyOf
>>418
自由にツール使えればいいんだけど説得材料がないと申請がなかなか通らなくてな。VS高いし。
.NETとかで作ったDLLを参照設定にいれた場合って、他のPCで使おうと思った時はどうなんの?
エクセルファイル内に情報が含まれて、DLLを別個に送らなくても使えるなら説得材料になるんだけど。

OLEDBってADOとかだろ。できれば一つのエクセルファイルとして扱いたくてな。
複数ファイルに分かれていいならAccess掴んでアクセスファイル利用で解決するんだけど。

今はDictionary型を三つ使ったDBもどきなクラスを作ってやりとりして、
Terminate時にListObjectに保存してるんだけど、ListObjectって処理速度的にどうなんだろ。
まだ本格的な検証ができないせいでいまいち分からん。
0426デフォルトの名無しさん2016/03/12(土) 14:08:42.91ID:1YcKG8up
なにも開いていないのに
createobject("Shell.Application").windows.count
の値が1になるのですがこれはなんですか?
0427デフォルトの名無しさん2016/03/12(土) 18:27:17.32ID:BsaNud7m
さあなんでしょうね? FOR EACH でループ回して調べてみれば?
count=1 ならループしないで .Windows(0)でもいいとは思う
0428デフォルトの名無しさん2016/03/12(土) 22:40:06.05ID:0aWKpcQq
そこまで困っているわけじゃないのですが、
VBEの超高機能版みたいなエディタでお勧めのモノってありますか?
出来れば無料でお願いします。

プログラミング自体はVBAしか使えず、VBEでセコセコやってきたのですが、
職業プロウラマーの人は(言語までは聞かなかったのですが)、
もっと高機能なエディタを使っていそうです。
0429デフォルトの名無しさん2016/03/12(土) 22:50:51.64ID:Vp+P3H45
>>428
Vim for OfficeVBA K-edition
0430デフォルトの名無しさん2016/03/12(土) 22:51:37.29ID:Vp+P3H45
間違えた

Vim for OfficeVBA N-edition
0431デフォルトの名無しさん2016/03/12(土) 23:52:09.26ID:sJL6dJyL
高機能なエディタ使ってる俺カコイイってなわけでもあるまいに
0432デフォルトの名無しさん2016/03/13(日) 07:13:34.52ID:lSMOH+xf
でも気持ちは分かる。
VB.NetやっててVBAのコード書こうとすると
そのインテリセンスの機能の低さに愕然とするもんな。
0433デフォルトの名無しさん2016/03/13(日) 10:06:29.58ID:bEOCVA73
クラスのインスタンス変数(メンバ変数)をPrivateにしたときって、自モジュール内でも他のインスタンスのメンバには直接さわれないの?
other.member = Me.member
がエラーになるんだけど。
0434デフォルトの名無しさん2016/03/13(日) 11:30:25.64ID:8iD0JTja
>>433
他のインスタンスのメンバーもPrivateなんだろ? だったら触れないだろ。
0435デフォルトの名無しさん2016/03/13(日) 11:42:50.26ID:bEOCVA73
>>434
自クラスなのに?ダメなの?

やりたいことはcloneメソッドです。

自分と同じ内部データを持ったインスタンスをcloneで作って、一部のメンバだけ変えたい。
具体的には「プラスマイナスの符号だけ異なる別インスタンス」を作りたいんです。
「符号」は単純なプロパティなので、Public なProperty GetとProperty Setを作るつもり。
でもそれ以外な内部状態をあらわすものなので、外部からコントロールさせたくない。

cloneができればいいんだけど。
0436デフォルトの名無しさん2016/03/13(日) 11:50:28.92ID:8iD0JTja
>>435
クラス内でClone作ってプロパティ越しに吐き出すようにすりゃいいだろ。
0437デフォルトの名無しさん2016/03/13(日) 11:52:16.25ID:bEOCVA73
>>436
set clone = New クラス
としたあとの
clone.member = Me.member
ができないので困ってるんですよ。
0438デフォルトの名無しさん2016/03/13(日) 11:53:58.98ID:kQ6WFkk9
全部publicでいいじゃん
というか関数と構造体でいいよ
お前はVBAに一体何を求めてるんだ?まさかVBAで多人数開発でもやるつもりか?
0439デフォルトの名無しさん2016/03/13(日) 12:11:10.02ID:8iD0JTja
>>437
そのクラスが普段データを蓄積するために使うPublic関数から流し込んでやるんだよ。
それが嫌なら渡したいメンバー自体Publicでやれ。
04404282016/03/13(日) 12:12:20.68ID:18LsKVIr
>>430
>>429
ご回答ありがとうございますが・・

そのままぐぐっても、それらしきものが見当たりません。
該当ソフトウェアの配布元のURLを教えていただけませんでしょうか。

>>431
もうちょっとエディタに気遣いが欲しいなというのが希望です。
コメント閉じたり、Whileやifが入れ子になっているときに
片方のWhileや、Ifにカーソル当てると、対応するWendや、Endifが強調表示されたり(プロが使うエディタには普通にあるそうです)
気遣いのあるエディタがあればなぁ・・と思い質問しました。
0441デフォルトの名無しさん2016/03/13(日) 12:27:29.00ID:bEOCVA73
>>439
うーん、どうやらPublicでやるしかなさそうですね。
Public関数から流し込むにはその履歴保持が必要になっちゃうからいったん諦め。。

そもそも自クラスのPrivateにアクセスできない仕様が意味不明だけど。
0442デフォルトの名無しさん2016/03/13(日) 12:44:19.88ID:VQ49EEy6
>>441
消えろ
0443デフォルトの名無しさん2016/03/13(日) 13:05:39.36ID:LdX4fma4
>>442
なんでや。真っ当な話だろ。
0444デフォルトの名無しさん2016/03/13(日) 16:11:13.87ID:Wv1UMaca
>>441
クラスのプロパティならFriendってアクセスレベルあるからそれで良いんじゃね

>自クラスのPrivateにアクセスできない仕様
Privateっていうのは、クラスに対してじゃなくて、インスタンスに対してだから
同じ人間でもその心の中は個人の秘密だろ
0445デフォルトの名無しさん2016/03/13(日) 16:11:16.53ID:lSMOH+xf
>>441
ちょっと待て。
プロパティはPublicでメンバ変数はPrivateなんだろ?
普通それで出来ると思うんだが。

メンバ変数の型は何だ?それもインスタンスなら、SetterはLetの代わりにSet使わなければエラーになるし、
GetterでもSetterでも代入の祭には頭にSet付けていなければVBAだとエラーになるぞ。

構造体と言うかユーザ定義型ならまたちょっと違う問題が有るんだが今回は関係無さそうだな。

ひょっとしてそう言うオチなんじゃないのか?
0446デフォルトの名無しさん2016/03/13(日) 16:25:05.49ID:lSMOH+xf
ああ、よく読んだら同じクラスで生成した別インスタンスで
Private指定したメンバ変数を持って来ようって話か。
そらダメだろな。

>>444
VBAのクラスってFriendのスコープ使えるんだ。
初めて知った。
0447デフォルトの名無しさん2016/03/13(日) 16:33:32.91ID:bEOCVA73
>>444
Friend?
ちょっと試してみるけど、VBAのFriendってどういう効果が生まれるのかググってもいまいちわからんね...
0448デフォルトの名無しさん2016/03/13(日) 16:47:33.48ID:Wv1UMaca
>>446
何故かフィールドには適用できないけどな
タイプライブラリに書きこまれないとか、どうも実行時にいろいろ小細工してそう

Friendって、1ブック内でしか処理しないのなら実はPublicと大差ないからあまり意味が無いけどな
0449デフォルトの名無しさん2016/03/13(日) 16:54:13.20ID:bEOCVA73
privateの意味についてちょっとググってみた

クラスメンバーのアクセス修飾子
https://hydrocul.github.io/wiki/programming_languages_diff/class/modifier.html

C++とJava ⇒ 同一クラスであれば他のインスタンスからもアクセス可能。
Scala のprivateは他のインスタンスからのアクセスが可能なものと不可能なものの2種類あるようだ

VBAの場合はC++やJavaと異なり、他インスタンスからのアクセスも禁止するすごく厳密な仕様なんだな。
0450デフォルトの名無しさん2016/03/13(日) 21:34:12.60ID:kQ6WFkk9
厳密なんじゃなくて手抜きなだけ
Rubyなんかもそうだけど、コンパイル時の静的バインディングのない言語で素直にprivateを実装するなら
単に「インスタンス外からは見えない」ということにして実装してしまうのが簡単なんだよ
レキシカルスコープは実装面倒だからな
0451デフォルトの名無しさん2016/03/13(日) 21:54:51.85ID:Wv1UMaca
VBAは参照設定された奴は(可能ならば)コンパイル時にバインディングしてる筈だけどな
静的かどうかにかかわらず、外部公開しないことにして実現してるのはその通りだろうけど
0452デフォルトの名無しさん2016/03/13(日) 22:15:56.20ID:bEOCVA73
>>450
まあできないことを愚痴ってもしゃあないんで、適当にヌルーしながらほげふがすることにします。
具体的には単にメソッド一覧に載せないことをもってprivateとするとか...
(swapマジックでなんとかならないかな・・・)
0453デフォルトの名無しさん2016/03/14(月) 02:13:40.95ID:g7NdZw4d
ネットのページのソースから、
@カッコで囲まれた4つのランダムな数字(****)の数字部分を全て取り出し、変数に
格納したいです。なお、このカッコで囲まれた数字は複数存在し、ランダムに配置されています。

A別のページのソースでは、****pdpsという風に、後ろに特定の文字列
0454デフォルトの名無しさん2016/03/14(月) 02:18:01.77ID:g7NdZw4d
すみません、途中で途切れました。
A上記のように、文字列 "pdps" が後ろに必ずついている状態で、これも同様に数字部分を
全て取り出したいのですが、どのようにすればよいでしょうか?
0455デフォルトの名無しさん2016/03/14(月) 05:07:45.91ID:813TYYJm
VBA 正規表現 でググって正規表現の使い方を覚えるんだ
実際のパターンは正規表現のスレがあったはずだからそこで聞いてみてくれ
0456デフォルトの名無しさん2016/03/14(月) 12:42:43.00ID:v6y0Q57V
「"変数の値"と"同じ名前の変数"に加算」する場合の記述の仕方を教えて下さい。


「arr」と「みかん」という2つの定義済み配列があります。
arr(0)の値には商品名が入っています。
この値(商品名)と同じ名前の配列変数(今回の場合だと「みかん」)に、金額や個数を加算するプログラムを作りたいです。

例えば以下の様な場合、
--------------------------------------------
'売れた商品
arr(0) = "みかん" '商品名
arr(1) = 3 '個数
arr(2) = 120 '金額

'加算処理
みかん(1) = みかん(1) + arr(1) 'みかんの売れた個数をみかん(1)に加算
みかん(2) = みかん(2) + arr(2) 'みかんの売れた金額をみかん(2)に加算
--------------------------------------------
arr(0)の値は「みかん」なので、「みかん」という配列変数に個数と金額を加算したいです。

商品は数百種類ある為、商品ごとにif文等で加算処理を書くのはキツいので、なんとか自動的に商品名と同じ変数名に加算処理をしたいです。
よろしくお願いします。
■ このスレッドは過去ログ倉庫に格納されています