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/
0263デフォルトの名無しさん
2016/03/04(金) 22:33:02.77ID:Q+o0VpBQ動的配列って、Dim var() As ... で宣言したやつのことで、
未初期化というのは ReDim する前のことか。
自分は普段
Dim var As Variant
ReDim var (...
のパターンしかやらないからな。
どっちの場合にも使える判定は次元を確認してからやるしかなさそうだ。
0264デフォルトの名無しさん
2016/03/04(金) 22:38:45.11ID:kHA/YI44線形リストくらいなら自作しても大した手間ではないと思うけどね。
Variant型作れって言われたら悶絶するけど。
0265デフォルトの名無しさん
2016/03/04(金) 22:45:59.06ID:JTAQpjsaErase時の挙動は宣言したときの型にも因るみたいだよ
ためしにObject型で宣言した配列でEraseしてみてよ
IsArray がTrue、LBound = 0、UBound = -1、次元は1
になるから
0266デフォルトの名無しさん
2016/03/04(金) 22:54:18.30ID:Q+o0VpBQなるほど、奇怪な挙動だ
ちなみにさっきこんなのも発見した
↓
Erase した配列を IsMissing の引数に入れると、アプリが落ちる
www
0267デフォルトの名無しさん
2016/03/04(金) 23:08:28.79ID:9YWpHsMn> 線形リストくらいなら自作しても大した手間ではないと思うけどね。
リスト自体はたいして難しくないけど、領域の確保・解放が面倒
> Variant型作れって言われたら悶絶するけど。
Win32API を前提にしていいなら意外と簡単
0268デフォルトの名無しさん
2016/03/04(金) 23:08:39.93ID:DcNHwK2hVBAでの配列は、要素の無い状態ってのが実は定義されてないからなぁ
UBoundが-1とか、not notとか、全部保障外の動作
0269デフォルトの名無しさん
2016/03/04(金) 23:49:36.96ID:Q+o0VpBQ素のVBAの機能だけで線形リスト?
かなり無理があると思うけど。
0270デフォルトの名無しさん
2016/03/05(土) 03:36:09.39ID:C1oJ0ySjもう長いことそういう扱いのものはCollectionかDictionary使ってるから忘れたけど
0271デフォルトの名無しさん
2016/03/05(土) 05:28:34.38ID:gRV1tzdLコレクション
0272デフォルトの名無しさん
2016/03/05(土) 09:02:48.20ID:jMWeenKu0273デフォルトの名無しさん
2016/03/05(土) 09:29:02.48ID:rDXleBwt0274デフォルトの名無しさん
2016/03/05(土) 09:53:02.66ID:dXAlBDepどういうことでしょうか?
0275デフォルトの名無しさん
2016/03/05(土) 10:23:53.54ID:JVq4KSH+>Collection
それを使うと、例えば、メモリ上で2次元の入れてもの的なものが作れて、
簡単にレコード追加や削除、要素数の調査などが出来るのかね?
0276デフォルトの名無しさん
2016/03/05(土) 12:27:16.08ID:u3wuja+A出来るんじゃね
0277デフォルトの名無しさん
2016/03/05(土) 12:27:54.96ID:9TDU+P7f少しはググれよ
0278デフォルトの名無しさん
2016/03/05(土) 12:44:32.31ID:c/pBSWps0279269
2016/03/05(土) 13:06:06.56ID:qwZo4R1u「読むは毎日」の「毎日」を「012(まるいちに)」と読むくらい無理があるよ。
0280デフォルトの名無しさん
2016/03/05(土) 13:18:01.29ID:1s6rQbQH0281デフォルトの名無しさん
2016/03/05(土) 13:34:00.19ID:LlD1+gMh(配列の扱いについて)
「スクリプト言語は自動で拡張するがコンパイラ言語は明示的に拡張しないとならないから不便」
↓
「大抵のコンパイラ言語にはListやCollection等の線形リスト型クラスが用意されているので強調するほどの不便さはない」
↓
「だがC言語にはListやCollection等の線形リスト型クラスが存在しないので不便である」
↓
「線形リストであればC言語でも書けるので、ListやCollectionを根拠にするならC言語を強いて分ける理由にはならない」
↓
「C言語ではクラスがないのでメモリの解放が保証されず、これを確実に管理できないのでやはりC言語は不便である」
という感じの流れ。
0282デフォルトの名無しさん
2016/03/05(土) 14:09:05.52ID:JVq4KSH+お前には聞いてないよ
0283デフォルトの名無しさん
2016/03/05(土) 14:31:26.49ID:C1oJ0ySjあ、そう。
0284デフォルトの名無しさん
2016/03/05(土) 18:11:50.55ID:Kra6+IMS>>247です。レス遅くなりすみません。
>まず環境ちゃん書け
Win7 64bit + エクセル2010 32bitです
>>毎朝エクセルファイルを8個開きます(別プロセスで)。
>これが疑わしいんだが
>どうやって別プロセスで動いてる事確認した?単に別ウィンドウなだけじゃないか?
別ウィンドウなのかもしれません。別プロセスで開いていると思ってました。
PC買い換えた時にレジストリいじった覚えはあるのですがよく覚えていません。すいません。
ファイルを開くときはアイコンを単にダブルクリックしているだけです。
タスクマネージャーのプロセスタブには"EXCEL.EXE *32"が複数並ぶので別プロセスで開いていると思っていました。
別プロセスなのか別ウィンドウなのか判別する方法はありますか?
また、単に別ウィンドウで開いているとすると今回の不具合は説明がつくのでしょうか?
0285デフォルトの名無しさん
2016/03/05(土) 19:04:44.01ID:kHthb7bFOKボタンを何千回も押さなければいけなくかなり苦戦していますが、
リアルタイムに変数が今いくつかをわかりやすく表示するいいい方法がありましたら教えてください。
よろしくお願いいたします。
0286デフォルトの名無しさん
2016/03/05(土) 19:06:49.19ID:nsijM3800287デフォルトの名無しさん
2016/03/05(土) 19:15:41.23ID:u3wuja+Adebug.printとか
0288デフォルトの名無しさん
2016/03/05(土) 19:21:11.51ID:kHthb7bFこんな物があるとは、、これは便利ですねありがとうございました。
0289デフォルトの名無しさん
2016/03/05(土) 19:22:23.00ID:LlD1+gMh複数の表示が必要ならユーザーフォーム使うと便利かもしれない
0290デフォルトの名無しさん
2016/03/05(土) 19:34:13.01ID:4DqfsxCG私は最近中小企業に入社しました。
既に退職した方が作っている、VBAアクセスを用いたユーザーフォームに入力する形の勤怠表を使っています。
リストから従業員の名前を選んで、時間とか入力するだけで、そのあたりの使用には全然問題が無いです。
このシステムは複数のパソコンで使えるようになっていて、排他処理が出来ないので使うのは誰か一人だけとなっています。
問題は、私の使っているパソコンでかつて使っていた担当者の名前が自動的に入力印字されることになってしまっており
これをどうにかして自分の名前に変えたいのです。
システムを利用するユーザーフォーム内には無いので、コンピューター内のクエリ?アクセス?を読んでると思うのですが・・・
これどこから読んでるか探す方法ってあるでしょうか?
0291デフォルトの名無しさん
2016/03/05(土) 19:49:06.02ID:kHthb7bFありがとうございます。
これは高度なようでぱっと見どうやるのかわかりませんが挑戦してみます
0292デフォルトの名無しさん
2016/03/05(土) 19:52:59.41ID:LlD1+gMhユーザー名から読み込んでいると思うので、PCが個人名になっているならPCのユーザー名を変えればいいし、
そうでないならユーザー名と照らし合わせている対照表が存在するはずなので、
個人名が記録されたテーブルが無ければコードを全て検索にかければ出てくるんじゃないかな。
0293デフォルトの名無しさん
2016/03/05(土) 19:53:01.73ID:yziJisVBvbaのソースは見れるの?
たぶん実行時にコンピュータ名を取得してんじゃないのかな。
UserNameでソース検索してみると引っ掛かるかも。
0294デフォルトの名無しさん
2016/03/05(土) 19:59:14.70ID:fx7njDcC話はそれからだ
0295デフォルトの名無しさん
2016/03/05(土) 20:21:57.03ID:4DqfsxCGPCは会社名と数字なので、違うと思われます。
>>293
システムを開くと、エクセル画面の手前にユーザーフォームが出て来て、VBAコードをどうすれば見れるか分かりません・・・
どうしたらいいでしょう?
一応基本的なVBAなら学校で習いましたので、私もコードが見れたら分かるとは思うのですが・・
0296デフォルトの名無しさん
2016/03/05(土) 20:25:29.18ID:LlD1+gMhShiftキー押しながら開けば内部が見える。
開いた後にAlt+F11キー押せばコード画面が見える。
PCが会社名と数字ならテーブルで管理している可能性が高い。
0297デフォルトの名無しさん
2016/03/05(土) 20:31:48.48ID:4DqfsxCGありがとうございます
テーブルというのはアクセスでしょうか?
0298デフォルトの名無しさん
2016/03/05(土) 20:39:13.73ID:yziJisVBとりあえずコード見ないと。
テーブルはアクセスのデータ。
名前とかを一人一行で保存してそっからとってるかもね。
あとはエクセルシートに書いてある可能性も。
0299デフォルトの名無しさん
2016/03/05(土) 20:42:31.99ID:4DqfsxCGどうもありがとうございます
月曜日やってみます!
0300デフォルトの名無しさん
2016/03/05(土) 23:47:07.55ID:pW8OrA+LExcel 2003 で、VBAでマクロを組んでいます。
・表の数値を、スクロールバーによって入力させたいです。
・前回作ったものがあり、それはちゃんと動作しています。
・そのBookからスクロールバーをコピーして、今回のBook内にペーストしました。
・貼り付け先の今回のBookでもちゃんと動作し、前回Bookと同じ位置のセルに、数字が表示されます。
・このセル位置を変更したいと思い、デザインモードで、そのスクロールバーを右クリック。
・そしてプロパティを開き、LinkedCellの数値を見ると、J14が入っています。
・この数値を、今回表示したいセル位置の座標値、例えば、C3 と書き込んだのですが、
1. Linked Cellに書き込んでも、文字書けません。白いままです。
以下の画像を見て下さい。
http://imgur.com/jkhPHef
2. 前回に戻そうと、CTRL+Zしたのですが、前回の値にさえも戻りません。
3. 試しにスクロールバーを動かしてみても、どのセルにも表示されません。
4. あきらめて、再度以前のタブからコピーペーストすると、ちゃんと数値表示されます。
5. しかし、Linked Cell の値を変更すると、全く同様になります。
質問
なんとか、思い通りのセル位置にスクロールバーの値を表示させたいのですが、
どのようにしたら良いでしょうか?
どうぞ宜しくお願いします。
0301デフォルトの名無しさん
2016/03/05(土) 23:56:26.68ID:vycAzidd0302デフォルトの名無しさん
2016/03/06(日) 03:55:58.52ID:1eS/+yt+いい気分に浸っていないで、日頃から勉強しておかないと。
0303デフォルトの名無しさん
2016/03/06(日) 10:00:53.14ID:8jI/Xwdu零細企業の職場内での評価なんて>>301もそこまで執着してないと思う
例えてみたら誰かにもらった宝くじがたまたま当たってたとか
せいぜいその程度のもんでしょ
0304デフォルトの名無しさん
2016/03/06(日) 10:03:52.04ID:l5x+OWKs本当にもうvbaなんて書きたくない、俺はもっと高貴なc++とか書きたいんじゃー
0305デフォルトの名無しさん
2016/03/06(日) 10:19:01.07ID:covgZswb本当にもうC++なんて書きたくない、俺はもっと高貴なvbaとか書きたいんじゃー
0306デフォルトの名無しさん
2016/03/06(日) 10:35:11.33ID:EaPvtK9yこれからはXamarinとか使える言語の方がいいよ
0307デフォルトの名無しさん
2016/03/06(日) 11:14:47.28ID:ziAQb5ivあんなゆとり低俗言語やる気しねーわ
0308デフォルトの名無しさん
2016/03/06(日) 12:20:43.48ID:CI3ynwI1会社で使うPCには大抵Office製品が入っている=VBAで書ける環境が整っている=つまり彼は・・・
0309デフォルトの名無しさん
2016/03/06(日) 12:32:55.25ID:euq/4jEg俺はさらに零細の従業員10人の会社にいたけど入社してすぐに参謀格扱いだったわ
AccessでVBA使って社内システム作ってやったわ
社長は何かあるたびに俺に相談、コンピュータ関係は全部俺に丸投げ状態だったわ
0310デフォルトの名無しさん
2016/03/06(日) 12:38:05.50ID:uXhlHP6GVBAで高貴な書き方をする方法をひねり出せばいい。
0311デフォルトの名無しさん
2016/03/06(日) 12:47:46.09ID:Pwozu15r新規でスクロールバー追加してもダメ?
その状況を再現しようとしたけど さすがに Excel2003じゃないから わかんなかった
Linked Cellへ 入力してる時 文字は表示されるの? Enter押すと消えるの?
0312デフォルトの名無しさん
2016/03/06(日) 14:49:21.66ID:EaPvtK9yどうした?
何か辛いことでも有ったのか?
0313デフォルトの名無しさん
2016/03/06(日) 18:06:47.58ID:nfMUp1Uo良いなぁ。俺なんか「これ、ネットで拾ったんだろ?」なんて言われるんで自分だけこっそり使ってる。
VBAどころかシート関数だってSUMしか知らないヤツが大半の底辺企業だから下手に気の利いた事をやってみせると
色々とメンドクセー事をやらされそうだし、「それ、俺に教えろ」と言われるのが一番困る。
0314デフォルトの名無しさん
2016/03/07(月) 00:47:06.08ID:addXPaOO0315デフォルトの名無しさん
2016/03/07(月) 02:14:25.55ID:5wV32mLNどうもありがとうございます。
>新規でスクロールバー追加してもダメ?
すみません、新規での作り方が良くわからないんです。
VBEで、ユーザーフォームを新規で作って、そこに○○ボックスを表示して、その中の
スクロールバーをフォーム上にドラッグする、そこまでは解ったのですが、
スクロールバーだけを、自分のシート上に持っていく方法がわからずに止まっています。
それなら
既存のスクロールバーをcopyして、使い回した方が良いと思い、そうしました。
でも数値表示位置が思い通りにならない、と、ココで止まっています。
>その状況を再現しようとしたけど
わざわざありがとうございます。大変すみません。
>Linked Cellへ 入力してる時 文字は表示されるの? Enter押すと消えるの?
はい、値を入力するときに表示される、縦棒のカーソル(アイカーソル)も出て、
数値も打てて、打っている最中は表示されます。でも、Enterを打った途端に、
値が消えて、真っ白になってしまいます。
何かヒントがあったら、教えてくださいませんでしょうか。
0316デフォルトの名無しさん
2016/03/07(月) 02:29:19.02ID:4xjfDqmL改行されてるだけだったりしない?
0317デフォルトの名無しさん
2016/03/07(月) 02:49:52.90ID:UpfyO0Bs>すみません、新規での作り方が良くわからないんです。
それはユーザーフォームに作成してからシート上に持ってくるんじゃなくて
シート上に直接作成するんですよ
2003を持ってないんでちょっと違うかもですが、
2000だとコントロールツールボックスというのが有りまして
(ちなみにVBEのアイコンとデザインモードのアイコンの間に
コントロールツールボックスのアイコンがありました
スパナとハンマーがX字状に交差したマークのアイコンです)
その中にスクロールバーも用意されてます
そのスクロールバーをシート上の好きな位置に貼り付けて
サイズ適当に整えてから
右クリックでプロパティー出して
LinkedCellのところにセルのアドレス書いて
デザインモードを終了させたら完了です
0318デフォルトの名無しさん
2016/03/07(月) 23:37:36.70ID:i+8zAlAm使用するマクロがこれで
Range("S11:X10000").Sort Key1:=Range("T11"), ORDER1:=xlDescending
Range("S11:X10000").Sort Key1:=Range("S11"), ORDER1:=xlDescending
シートBから範囲をコピーし、シートAに貼り付け後ソートします。その際シートBは開いたままです。
1万行までソート範囲設定してますが、実際は3000ちょいです。
シートAは400万セル計算式が入っており、ソート後ほぼ全てのセルが再計算されます。
計算式自体は簡単なのでソートの時間2秒、再計算2秒くらいです。CPU2600k
クラッシュの原因は分かりますか?
データが重いのは承知しているのですが、他で改善できる点があれば教えて欲しいです
0319デフォルトの名無しさん
2016/03/08(火) 00:27:00.64ID:vutO7knOマクロ中の計算を中止するとか
0320デフォルトの名無しさん
2016/03/08(火) 00:47:53.82ID:8QSEtr5Pソートで落ちてるのか計算で落ちてるのか調べてみては
0321デフォルトの名無しさん
2016/03/08(火) 00:51:54.57ID:RMZNymTqA_B_C_D_E_Fって名前のファイルを
BE_Aにリネームするマクロってどんな感じになりますか?
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) :値渡し
■ このスレッドは過去ログ倉庫に格納されています