トップページ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/
0263デフォルトの名無しさん2016/03/04(金) 22:33:02.77ID:Q+o0VpBQ
>>242の言っていたことがやっとわかった。
動的配列って、Dim var() As ... で宣言したやつのことで、
未初期化というのは ReDim する前のことか。

自分は普段
Dim var As Variant
ReDim var (...
のパターンしかやらないからな。

どっちの場合にも使える判定は次元を確認してからやるしかなさそうだ。
0264デフォルトの名無しさん2016/03/04(金) 22:38:45.11ID:kHA/YI44
>>261
線形リストくらいなら自作しても大した手間ではないと思うけどね。
Variant型作れって言われたら悶絶するけど。
0265デフォルトの名無しさん2016/03/04(金) 22:45:59.06ID:JTAQpjsa
>>262
Erase時の挙動は宣言したときの型にも因るみたいだよ
ためしにObject型で宣言した配列でEraseしてみてよ

IsArray がTrue、LBound = 0、UBound = -1、次元は1

になるから
0266デフォルトの名無しさん2016/03/04(金) 22:54:18.30ID:Q+o0VpBQ
>>265
なるほど、奇怪な挙動だ

ちなみにさっきこんなのも発見した

Erase した配列を IsMissing の引数に入れると、アプリが落ちる

www
0267デフォルトの名無しさん2016/03/04(金) 23:08:28.79ID:9YWpHsMn
>>264
> 線形リストくらいなら自作しても大した手間ではないと思うけどね。
リスト自体はたいして難しくないけど、領域の確保・解放が面倒

> Variant型作れって言われたら悶絶するけど。
Win32API を前提にしていいなら意外と簡単
0268デフォルトの名無しさん2016/03/04(金) 23:08:39.93ID:DcNHwK2h
アンドキュメンテッドな方法で取り扱ったりしてるけど
VBAでの配列は、要素の無い状態ってのが実は定義されてないからなぁ
UBoundが-1とか、not notとか、全部保障外の動作
0269デフォルトの名無しさん2016/03/04(金) 23:49:36.96ID:Q+o0VpBQ
>>264,267
素のVBAの機能だけで線形リスト?
かなり無理があると思うけど。
0270デフォルトの名無しさん2016/03/05(土) 03:36:09.39ID:C1oJ0ySj
要素数が設定されていない配列の状態を確認するにはAPIを使うんじゃなかったっけ?

もう長いことそういう扱いのものはCollectionかDictionary使ってるから忘れたけど
0271デフォルトの名無しさん2016/03/05(土) 05:28:34.38ID:gRV1tzdL
>>240
コレクション
0272デフォルトの名無しさん2016/03/05(土) 09:02:48.20ID:jMWeenKu
確かに話の流れも読めない君にはかなり無理かも
0273デフォルトの名無しさん2016/03/05(土) 09:29:02.48ID:rDXleBwt
言語機能の話とライブラリの話がごっちゃだからか
0274デフォルトの名無しさん2016/03/05(土) 09:53:02.66ID:dXAlBDep
>>228
どういうことでしょうか?
0275デフォルトの名無しさん2016/03/05(土) 10:23:53.54ID:JVq4KSH+
>>270
>Collection
それを使うと、例えば、メモリ上で2次元の入れてもの的なものが作れて、
簡単にレコード追加や削除、要素数の調査などが出来るのかね?
0276デフォルトの名無しさん2016/03/05(土) 12:27:16.08ID:u3wuja+A
>>275
出来るんじゃね
0277デフォルトの名無しさん2016/03/05(土) 12:27:54.96ID:9TDU+P7f
>>275
少しはググれよ
0278デフォルトの名無しさん2016/03/05(土) 12:44:32.31ID:c/pBSWps
いまのところ>>269が無能大賞
02792692016/03/05(土) 13:06:06.56ID:qwZo4R1u
いや無理だよ。
「読むは毎日」の「毎日」を「012(まるいちに)」と読むくらい無理があるよ。
0280デフォルトの名無しさん2016/03/05(土) 13:18:01.29ID:1s6rQbQH
線形リストの意味と実現手段によると思うけど、もとの発言の「自作」ってのはどういう意味だったんだ?
0281デフォルトの名無しさん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+
>>277
お前には聞いてないよ
0283デフォルトの名無しさん2016/03/05(土) 14:31:26.49ID:C1oJ0ySj
>>282
あ、そう。
0284デフォルトの名無しさん2016/03/05(土) 18:11:50.55ID:Kra6+IMS
>>253
>>247です。レス遅くなりすみません。

>まず環境ちゃん書け

Win7 64bit + エクセル2010 32bitです

>>毎朝エクセルファイルを8個開きます(別プロセスで)。
>これが疑わしいんだが
>どうやって別プロセスで動いてる事確認した?単に別ウィンドウなだけじゃないか?

別ウィンドウなのかもしれません。別プロセスで開いていると思ってました。
PC買い換えた時にレジストリいじった覚えはあるのですがよく覚えていません。すいません。
ファイルを開くときはアイコンを単にダブルクリックしているだけです。
タスクマネージャーのプロセスタブには"EXCEL.EXE *32"が複数並ぶので別プロセスで開いていると思っていました。

別プロセスなのか別ウィンドウなのか判別する方法はありますか?
また、単に別ウィンドウで開いているとすると今回の不具合は説明がつくのでしょうか?
0285デフォルトの名無しさん2016/03/05(土) 19:04:44.01ID:kHthb7bF
msgbox で変数が現在いくつかを確認していますがループ処理で何千回も繰り返す場合
OKボタンを何千回も押さなければいけなくかなり苦戦していますが、
リアルタイムに変数が今いくつかをわかりやすく表示するいいい方法がありましたら教えてください。
よろしくお願いいたします。
0286デフォルトの名無しさん2016/03/05(土) 19:06:49.19ID:nsijM380
プロセスとスレッドのちがいわかっていってんのか
0287デフォルトの名無しさん2016/03/05(土) 19:15:41.23ID:u3wuja+A
>>285
debug.printとか
0288デフォルトの名無しさん2016/03/05(土) 19:21:11.51ID:kHthb7bF
>>287
こんな物があるとは、、これは便利ですねありがとうございました。
0289デフォルトの名無しさん2016/03/05(土) 19:22:23.00ID:LlD1+gMh
>>285
複数の表示が必要ならユーザーフォーム使うと便利かもしれない
0290デフォルトの名無しさん2016/03/05(土) 19:34:13.01ID:4DqfsxCG
非常にエスパーな質問になってしまうことを始めに謝罪します。

私は最近中小企業に入社しました。
既に退職した方が作っている、VBAアクセスを用いたユーザーフォームに入力する形の勤怠表を使っています。
リストから従業員の名前を選んで、時間とか入力するだけで、そのあたりの使用には全然問題が無いです。
このシステムは複数のパソコンで使えるようになっていて、排他処理が出来ないので使うのは誰か一人だけとなっています。
問題は、私の使っているパソコンでかつて使っていた担当者の名前が自動的に入力印字されることになってしまっており
これをどうにかして自分の名前に変えたいのです。
システムを利用するユーザーフォーム内には無いので、コンピューター内のクエリ?アクセス?を読んでると思うのですが・・・
これどこから読んでるか探す方法ってあるでしょうか?
0291デフォルトの名無しさん2016/03/05(土) 19:49:06.02ID:kHthb7bF
>>289
ありがとうございます。
これは高度なようでぱっと見どうやるのかわかりませんが挑戦してみます
0292デフォルトの名無しさん2016/03/05(土) 19:52:59.41ID:LlD1+gMh
>>290
ユーザー名から読み込んでいると思うので、PCが個人名になっているならPCのユーザー名を変えればいいし、
そうでないならユーザー名と照らし合わせている対照表が存在するはずなので、
個人名が記録されたテーブルが無ければコードを全て検索にかければ出てくるんじゃないかな。
0293デフォルトの名無しさん2016/03/05(土) 19:53:01.73ID:yziJisVB
>>290
vbaのソースは見れるの?
たぶん実行時にコンピュータ名を取得してんじゃないのかな。
UserNameでソース検索してみると引っ掛かるかも。
0294デフォルトの名無しさん2016/03/05(土) 19:59:14.70ID:fx7njDcC
上に相談して金出させなさい
話はそれからだ
0295デフォルトの名無しさん2016/03/05(土) 20:21:57.03ID:4DqfsxCG
>>292
PCは会社名と数字なので、違うと思われます。
>>293
システムを開くと、エクセル画面の手前にユーザーフォームが出て来て、VBAコードをどうすれば見れるか分かりません・・・
どうしたらいいでしょう?
一応基本的なVBAなら学校で習いましたので、私もコードが見れたら分かるとは思うのですが・・
0296デフォルトの名無しさん2016/03/05(土) 20:25:29.18ID:LlD1+gMh
>>295
Shiftキー押しながら開けば内部が見える。
開いた後にAlt+F11キー押せばコード画面が見える。

PCが会社名と数字ならテーブルで管理している可能性が高い。
0297デフォルトの名無しさん2016/03/05(土) 20:31:48.48ID:4DqfsxCG
>>296
ありがとうございます
テーブルというのはアクセスでしょうか?
0298デフォルトの名無しさん2016/03/05(土) 20:39:13.73ID:yziJisVB
>>297
とりあえずコード見ないと。
テーブルはアクセスのデータ。
名前とかを一人一行で保存してそっからとってるかもね。
あとはエクセルシートに書いてある可能性も。
0299デフォルトの名無しさん2016/03/05(土) 20:42:31.99ID:4DqfsxCG
>>298
どうもありがとうございます
月曜日やってみます!
0300デフォルトの名無しさん2016/03/05(土) 23:47:07.55ID:pW8OrA+L
すみません、教えて下さい。

Excel 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:vycAzidd
従業員数20人の零細企業勤めなんだが、VBA使って仕事してたらメッチャ有能だと勘違いされてええ気分やわ
0302デフォルトの名無しさん2016/03/06(日) 03:55:58.52ID:1eS/+yt+
お山の大将は、スグに抜かれるよ。
いい気分に浸っていないで、日頃から勉強しておかないと。
0303デフォルトの名無しさん2016/03/06(日) 10:00:53.14ID:8jI/Xwdu
>>302
零細企業の職場内での評価なんて>>301もそこまで執着してないと思う
例えてみたら誰かにもらった宝くじがたまたま当たってたとか
せいぜいその程度のもんでしょ
0304デフォルトの名無しさん2016/03/06(日) 10:03:52.04ID:l5x+OWKs
大企業でもvba書ける奴なんて少数だよ。
本当にもうvbaなんて書きたくない、俺はもっと高貴なc++とか書きたいんじゃー
0305デフォルトの名無しさん2016/03/06(日) 10:19:01.07ID:covgZswb
訂正:
本当にもうC++なんて書きたくない、俺はもっと高貴なvbaとか書きたいんじゃー
0306デフォルトの名無しさん2016/03/06(日) 10:35:11.33ID:EaPvtK9y
いや、今からならC#勉強しようよ
これからはXamarinとか使える言語の方がいいよ
0307デフォルトの名無しさん2016/03/06(日) 11:14:47.28ID:ziAQb5iv
c#とかwww
あんなゆとり低俗言語やる気しねーわ
0308デフォルトの名無しさん2016/03/06(日) 12:20:43.48ID:CI3ynwI1
>>306
会社で使うPCには大抵Office製品が入っている=VBAで書ける環境が整っている=つまり彼は・・・
0309デフォルトの名無しさん2016/03/06(日) 12:32:55.25ID:euq/4jEg
>>301
俺はさらに零細の従業員10人の会社にいたけど入社してすぐに参謀格扱いだったわ
AccessでVBA使って社内システム作ってやったわ

社長は何かあるたびに俺に相談、コンピュータ関係は全部俺に丸投げ状態だったわ
0310デフォルトの名無しさん2016/03/06(日) 12:38:05.50ID:uXhlHP6G
このスレで言ってもね。
VBAで高貴な書き方をする方法をひねり出せばいい。
0311デフォルトの名無しさん2016/03/06(日) 12:47:46.09ID:Pwozu15r
>>300
新規でスクロールバー追加してもダメ?
その状況を再現しようとしたけど さすがに Excel2003じゃないから わかんなかった

Linked Cellへ 入力してる時 文字は表示されるの? Enter押すと消えるの?
0312デフォルトの名無しさん2016/03/06(日) 14:49:21.66ID:EaPvtK9y
>>307
どうした?
何か辛いことでも有ったのか?
0313デフォルトの名無しさん2016/03/06(日) 18:06:47.58ID:nfMUp1Uo
>>301
良いなぁ。俺なんか「これ、ネットで拾ったんだろ?」なんて言われるんで自分だけこっそり使ってる。
VBAどころかシート関数だってSUMしか知らないヤツが大半の底辺企業だから下手に気の利いた事をやってみせると
色々とメンドクセー事をやらされそうだし、「それ、俺に教えろ」と言われるのが一番困る。
0314デフォルトの名無しさん2016/03/07(月) 00:47:06.08ID:addXPaOO
自分の作業を自分で効率化するのになんら遠慮する必要はないだろう。
0315デフォルトの名無しさん2016/03/07(月) 02:14:25.55ID:5wV32mLN
>>311
どうもありがとうございます。

>新規でスクロールバー追加してもダメ?
すみません、新規での作り方が良くわからないんです。
VBEで、ユーザーフォームを新規で作って、そこに○○ボックスを表示して、その中の
スクロールバーをフォーム上にドラッグする、そこまでは解ったのですが、
スクロールバーだけを、自分のシート上に持っていく方法がわからずに止まっています。
それなら
既存のスクロールバーをcopyして、使い回した方が良いと思い、そうしました。
でも数値表示位置が思い通りにならない、と、ココで止まっています。

>その状況を再現しようとしたけど
わざわざありがとうございます。大変すみません。

>Linked Cellへ 入力してる時 文字は表示されるの? Enter押すと消えるの?
はい、値を入力するときに表示される、縦棒のカーソル(アイカーソル)も出て、
数値も打てて、打っている最中は表示されます。でも、Enterを打った途端に、
値が消えて、真っ白になってしまいます。

何かヒントがあったら、教えてくださいませんでしょうか。
0316デフォルトの名無しさん2016/03/07(月) 02:29:19.02ID:4xjfDqmL
>>315
改行されてるだけだったりしない?
0317デフォルトの名無しさん2016/03/07(月) 02:49:52.90ID:UpfyO0Bs
>>315
>すみません、新規での作り方が良くわからないんです。

それはユーザーフォームに作成してからシート上に持ってくるんじゃなくて
シート上に直接作成するんですよ

2003を持ってないんでちょっと違うかもですが、
2000だとコントロールツールボックスというのが有りまして
(ちなみにVBEのアイコンとデザインモードのアイコンの間に
コントロールツールボックスのアイコンがありました
スパナとハンマーがX字状に交差したマークのアイコンです)
その中にスクロールバーも用意されてます

そのスクロールバーをシート上の好きな位置に貼り付けて
サイズ適当に整えてから
右クリックでプロパティー出して
LinkedCellのところにセルのアドレス書いて
デザインモードを終了させたら完了です
0318デフォルトの名無しさん2016/03/07(月) 23:37:36.70ID:i+8zAlAm
VBAでソートするとたまにエクセルが動作を停止してしまい困っています。

使用するマクロがこれで
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
Rangeを使用範囲に限定するマクロにするとか
マクロ中の計算を中止するとか
0320デフォルトの名無しさん2016/03/08(火) 00:47:53.82ID:8QSEtr5P
メモリが足りんのだろう
ソートで落ちてるのか計算で落ちてるのか調べてみては
0321デフォルトの名無しさん2016/03/08(火) 00:51:54.57ID:RMZNymTq
スレチかもだけど
A_B_C_D_E_Fって名前のファイルを
BE_Aにリネームするマクロってどんな感じになりますか?
0322デフォルトの名無しさん2016/03/08(火) 01:26:22.87ID:bwi0BspM
>>321
http://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:RMKFy6zt
exit subとかgotoとか使う
0325デフォルトの名無しさん2016/03/08(火) 20:18:05.37ID:fR2CUJwx
>>323
おまえがどういう条件で入ってくる値を分類するかによる。
0326デフォルトの名無しさん2016/03/08(火) 20:32:55.36ID:nBW8sWlC
>>323
多重ネストから抜ける方法じゃなくて回避する方法、とな?
0327デフォルトの名無しさん2016/03/08(火) 20:52:02.31ID:Vc6G9loF
>>323
Accessとかでデータベース弄ってみると解決のヒントになるかも。
俺も最初の頃は物凄い複雑な多重ネストしてたけど、二次元配列にすればだいたい単純化出来ると知った。
0328デフォルトの名無しさん2016/03/08(火) 20:54:03.15ID:9s/oHe/S
>>327
そういう話が聞きたかったのです
ありがとうございます
0329デフォルトの名無しさん2016/03/08(火) 21:07:40.52ID:835pn7ET
>>327
なにそれ
詳しく教えて
0330デフォルトの名無しさん2016/03/08(火) 21:17:39.28ID:h5qI0BBp
単純にネストの深さ下げるのなら別プロシジャに切りだすのが常套手段だが
まあ、ロジック見直すのが第1だな
0331デフォルトの名無しさん2016/03/08(火) 21:31:41.20ID:Vc6G9loF
>>329
多重ネストっていうのは、ネスト階層そのものがメモリの役割を果たしているわけだから、
その階層を記録そのもので代替すればネスト階層を少なく出来るし、ループ処理しやすくなる。
0332デフォルトの名無しさん2016/03/08(火) 21:50:26.37ID:rEDH5rdc
本当に多重ネストが必要なら再帰にするのが普通
そうでないなら条件分けが論理的でないとか
0333デフォルトの名無しさん2016/03/08(火) 22:18:08.86ID:MOSr64Vh
ネストを深くしないコツは、Exit FunctionやExit Subでさっさと弾くこと
そもそも関数に分けてないのは論外
0334デフォルトの名無しさん2016/03/08(火) 22:18:39.27ID:Murbzmcd
for i = hoge to fuga
if 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:Vc6G9loF
VBAにもReturn文はある。あるにはある・・・。
0336デフォルトの名無しさん2016/03/08(火) 23:18:30.06ID:yqVtrlfP
>>334
それな
0337デフォルトの名無しさん2016/03/08(火) 23:41:33.25ID:nBW8sWlC
配列にしたうえで、ループ処理自体を関数化すればかなり簡素化できる。
0338デフォルトの名無しさん2016/03/09(水) 00:10:33.98ID:m+VCUuOs
>>321
ary=sprit("A_B_C_D_E_F", "_")
newname=ary(1) & ary(4) & "_" & ary(0)
0339デフォルトの名無しさん2016/03/09(水) 01:37:19.14ID:ISN2ur/+
do
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:DOBDJjUi
ループに入ると応答無しになるのは
doeventsで対応出来たのですがデメリットなどありますか?
0341デフォルトの名無しさん2016/03/09(水) 19:41:01.70ID:bmHnXMYB
デメリットというか、ググってもらえれば色々書いてあるけど
単純に処理速度が遅くなる、そのループ中にユーザーが他のボタンを押したりや、イベントを発生させる事ができるからどんなエラーが出てもおかしくないってのが挙げられるね
処理中のキャンセルボタンとかには必要だけど、エラー処理しっかりしないと変な使い方されるとバグるよって感じ
0342デフォルトの名無しさん2016/03/09(水) 19:49:50.90ID:8rDFbZP8
>>341
なるほど
その辺はdoevents使うときにグローバル変数でも使えば対象出来そうですね
0343デフォルトの名無しさん2016/03/09(水) 20:18:05.86ID:fhz9XN7U
DoEvents使うような処理は必ずモーダルなユーザーフォーム通すようにルールづけするといい。
世の中に出回る大抵の「ユーザーに途中で弄られるとバグるシステム」は、この方法で回避してる。

ついでに進捗率とキャンセルボタン付けておけば便利。
0344デフォルトの名無しさん2016/03/09(水) 20:37:29.21ID:zuimL+5M
>>343
うーーーん勉強になる!
0345デフォルトの名無しさん2016/03/09(水) 21:02:53.20ID:8rDFbZP8
>>343
進捗率どうやればいいの?
0346デフォルトの名無しさん2016/03/09(水) 21:19:50.18ID:fhz9XN7U
>>345
何が「どう」なのか分からないけど、

・率の計算なら現在値/全体値で出せる。ただし全体の数と、現在を示す値がどれか分かっていなければ当然出来ない。

・進捗率バーを出したいならユーザーフォームのツールボックスの空いてる所を右クリックして
 「その他のコントロール」からProgressBarを選べばいい・・・はずだけど俺のPCでは何故か見あたらない。

・値を表示したいならラベルのCaptionに突っ込んでもいいし、ProgressBarが見当たらなくて自作したいなら、
 適当なラベルで同じ大きさのものを二つ重ねて背景色をつけて、
 上の方に表示されているラベルの横幅を、下の方に表示されているラベルの横幅に進捗率掛けても出来たはず。
0347デフォルトの名無しさん2016/03/10(木) 07:04:11.23ID:+km6LsFg
役にたたねぇ
0348デフォルトの名無しさん2016/03/10(木) 09:40:35.29ID:0HUIwvkk
処理の進捗状況をラベルで表現する
http://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
>>349
奇遇だね。俺は昨日はまった。(マジ)
0351デフォルトの名無しさん2016/03/10(木) 19:41:26.38ID:YDCDLTcE
じゃあ明日は俺がはまるわ。
0352デフォルトの名無しさん2016/03/10(木) 19:43:57.85ID:KtHC/EJ0
値渡しになってしまう条件を正確に特定したい。
カッコで囲んでかつ関数の返り値を捨てるとそうなるのはわかった。
0353デフォルトの名無しさん2016/03/10(木) 19:54:02.89ID:4xET+MUO
>>352
関数とかプロシージャの側でby refとかby val付けたら参照渡し、値渡しじゃなかったっけ?
0354デフォルトの名無しさん2016/03/10(木) 20:03:02.67ID:YDCDLTcE
>>352
Sub 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+MUO
仮説だけど
iでは無く (i)がtest1に渡されるのでは?

関数の形式で書くと
test1( (i) )

call test1(i) 参照渡し
call test1((i)) 値渡し
と予想
0356デフォルトの名無しさん2016/03/10(木) 20:24:42.26ID:ktNP4enh
>>352-355

http://home.att.ne.jp/zeta/gen/excel/c04p11.htm

ここに書いてあった
>括弧で囲まれた引数を式として評価するために一時的にメモリの別領域に値が確保されたためです。
引数として渡したのはあくまで別に確保された領域のポインタを参照渡ししただけで、元のデータの場所ではありません。

ってのが割りと分りやすい説明だと思う
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)     :値渡し
■ このスレッドは過去ログ倉庫に格納されています