1 名前:デフォルトの名無しさん [2017/11/08(水) 11:26:30.13 ID:+KUB1/9hd.net] スレ立ての際は一行目に !extend:checked:vvvvv:1000:512 と入れてスレ立てして下さい ExcelのVBAに関する質問スレです コード書き込みや作成依頼もOK ※関連スレ VBAなんでも質問スレ Part2 mevius.2ch.net/test/read.cgi/tech/1432173164/ Access VBA 質問スレ Part1 mevius.2ch.net/test/read.cgi/tech/1328536426/ Excel総合相談所 126 https://mevius.2ch.net/test/read.cgi/bsoft/1496487719/ ※前スレ Excel VBA 質問スレ Part50 mevius.2ch.net/test/read.cgi/tech/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured 👀 Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
365 名前:デフォルトの名無しさん mailto:sage [2017/12/06(水) 19:37:25.77 ID:sdGXOm2ja.net] >>354 デバッグ クリア VBAで検索したら 幸せになれるかもよ
366 名前:デフォルトの名無しさん mailto:sage [2017/12/06(水) 21:02:08.65 ID:H8Zs2M1B0.net] VBAでコンボボックスのリストのみクリアってどうやってやるんですか?
367 名前:デフォルトの名無しさん mailto:sage [2017/12/06(水) 23:12:55.48 ID:ClwZMpdPa.net] >>357 正式にやるのは多分すごく難しい。 Win32APIでコンボボックス内のリストボックスに対してどうにかするということになると思う。 しかし、単純に strCombo=ComboBox1.Text ComboBox1.Clear ComboBox1.Text=strCombo でテキストが一瞬クリアされたのは見えないから現実的な案だと思う。
368 名前:デフォルトの名無しさん [2017/12/07(木) 10:43:49.53 ID:cGZzJnMw0.net] シートの非表示設定について Sheets(”sheet1").Visible = False でシート非表示設定をしたのですが元々非表示だとバグになってしまいます。 釦を押せば特定のシートのみを表示できるようにしたいんですけど表示時非表示時がランダムで 非表示時でもそのコード無視するかと思ったら非表示なのに非表示にするんじゃねぇと怒られた。
369 名前:デフォルトの名無しさん mailto:sage [2017/12/07(木) 10:55:46.75 ID:SgQPpSGG0.net] >>359 VisibleプロパティがBooleanで状態を返すのでIfで分岐させる If Sheets("sheet1").Visible Then Sheets("sheet1").Visible = False Else Sheets("sheet1").Visible = True End If こうすると実行するたびに表示/非表示が切り替えられる
370 名前:デフォルトの名無しさん [2017/12/07(木) 11:24:06.29 ID:cGZzJnMw0.net] >>35 8 ありがとうございます。できました。 なんとなく、if文使うのかなと思ったのですがif文が思いつかなかった。 Elseの下を消すことで、非表示時は非表示のままのする思い通りの事が出来ました。
371 名前:デフォルトの名無しさん mailto:sage [2017/12/07(木) 11:50:17.69 ID:/U/N3RBoa.net] >>360 それだと非表示の時は表示されるからElseはいらねえだろ。 俺も Sheets("sheet1").Visible=(Not Sheets("sheet1").Visible) と最初考えたけどやっぱIf文にしないと駄目かと考えた。
372 名前:デフォルトの名無しさん mailto:sage [2017/12/07(木) 12:06:28.65 ID:SgQPpSGG0.net] >>361 たぶん他人にも使わせるのだと思いますが シートをシート名じゃなくオブジェクト名で指定すると 誰かが勝手にシート名を変えても関係ないのでオススメ。 さらにわかりやすいオブジェクト名に書き換えると、尚良し。 オブジェクト名はVBEのプロパティウィンドウの(オブジェクト名)を見てね。 初期値はSheet1なので Sheets("sheet1")をSheet1に置き換えてもうごくはず。 >>362 あとから余計なこと書いたかなーと思ったけど、本人が気づいてくれてよかった。
373 名前:デフォルトの名無しさん [2017/12/07(木) 13:06:30.92 ID:cGZzJnMw0.net] 〉〉361 ど素人で何もわからないままマクロの記述させながら必要なところ コピペしてとネットコピペでほとんどコード打ち込まず作ってるので まだ、オブジェクトまで触ってません。 今度触ってみたいと思います。 標準モジュールは逆になんのモジュールかわからなくなるの必要なモジュールと区別するために名前つけてるけど sheet名はそのままです。
374 名前:デフォルトの名無しさん mailto:sage [2017/12/07(木) 21:42:15.17 ID:F/BnOZfeM.net] >>287 ワシはティンコを2本もっている 2本目はとっておきだ(´・ω・`)b
375 名前:デフォルトの名無しさん [2017/12/07(木) 22:24:29.94 ID:QxT2u2P9d.net] >>365 マジ気になるわー V字になってるのか、真ん中で2段になってんのか、前後に生えてんのか? 1本は普通だが、もう1本はデコに生えてんのか?
376 名前:デフォルトの名無しさん [2017/12/08(金) 00:07:26.11 ID:8mEkhztWa.net] コードのコメントについて どこまで記入してますか? 素人なもんで変数の内容から 変更前のコードまでコメント化してるからコード自体が長くなる。 社内のVBAコード見るとコメントほとんど書いてなくてf8で追っても、よくわからないからなにがいいか分からない
377 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 00:27:27.18 ID:tPe4A27O0.net] 設計さえキチンとしていれば大抵はコメント要らない。 Dim SLine As Long:SLine = 3 '読み込むファイルのヘッダーが二行ある為 みたいにプログラム依存でないパラメータを解説する時に使ったりはする。 ある程度の習熟が必要なので、ステップ実行でも何してるか分からない(正常に追えない原因が分からない)のであれば、 まだコメントの必要性について論ずる段階では無いので特に要らないんじゃないかな。 自分の昔書いたコードを改修しようとして訳分からないみたいなのを何度も経験して始めてコメントの要点が掴めると思う。
378 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 00:40:24.89 ID:MH/bn/0fH.net] >>367 変数名からなるべく中身を類推できるようにつけてコメは最小限にしてる。 後で迷うくらいならつけたほうがいいと思う。コード記述して直後は完全にわかってるから迷うポイントに気づけない。一週間後とかに再レビューして、「コレなにやってんだろ?」と引っかかった所はポイントかな。 あとExcel本体の不具合、制限回避とかコメしてないと中々思い出せないことがある。
379 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 00:50:05.27 ID:04xg1k3G0.net] コメントは書いた方が良いんだが、余計なのはいらない。 変数名で分かるものは必要ない。 むしろどういう処理かのコメントを書く場合が多い。 それもそこのメンバーのレベルによる。 書ける奴らが集まってるなら、こんなもん分かるだろと書かない場合も多い。
380 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 08:12:21.44 ID:WX0K1LcLa.net] コメントは処理の内容についてはしない なぜその処理をするのかつかみにくいとリッキーだったり使用上やむを得ないときに理由を簡潔に書く 変更履歴をコード上に書くのは愚の骨頂だけどVBAだとほかに方法が少ないから自分かチームでルール決めるしかないな
381 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 08:13:11.00 ID:WX0K1LcLa.net] とリッキー→トリッキー 使用→仕様
382 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 18:16:29.95 ID:3k7CQU1Hd.net] 質問です。 シミュレータソフトをVBAを使って制御しています。順々にモデルを解析していき、逐次計算結果がエクセルに反映表示されるような動作をします。 ただそのとき、きちんと逐次結果が表示されていく場合と画面に全く結果が表示されずプログラムが終わった途端に一気に数値が表示される場合とがあります。 途中でも解析結果が分かるよう安定して逐次表示するようにしたいのですが解決策分かる方いたら教えてください。 なお画面更新はもちろんオンです。調べたところdo eventsというのでWindowsに制御を渡すやり方もあるようですが、途中の動作が割り込む可能性がありそれは避けたいです。
383 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 19:13:35.05 ID:jJUgyerEM.net] 自分も普段はほとんどコメント書かない。 適切な命名とコードの流れで処理は説明して、意図や補足説明にコメントを書くのが正しいと思ってる。 ただ、VBAではかなり細かく書いてる。理由は、VBAの時点でどうやっても読みづらいから。 勝手に行間調整するせいで int n WorkBook book みたいな整列ができないし、Dim n As Integerって構文自体が無駄な単語多くて、数並んでいると読む気がなくなる。 スコープの区切りにEndを使うのも()よりコードに埋もれて見づらいしVBEの色設定は貧弱だし。 VBAに限ってはコメントで処理追った方が楽だって最近は思ってる。 早くエクセル操作に向いたもっとまともな言語出ないかな。
384 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 19:16:35.83 ID:wpv6YuQca.net] そうか、ここもvba方式なんだった。 int__________a WorkBook___book みたいにタイプと変数名で表っぽく配置することね。
385 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 19:34:22.58 ID:tPe4A27O0.net] >>374 VBAは宣言しないのがデフォなんだから、いちいちDimなんちゃらってやってたら、そりゃ不便だろ。
386 名前:デフォルトの名無しさん [2017/12/08(金) 20:15:19.13 ID:F+K0Jtko0.net] >>376 そうではなくて、変数の宣言構文がシンプルではないところを言っていると思うよ。
387 名前:デフォルトの名無しさん [2017/12/08(金) 20:45:47.90 ID:kuqPkTCcd.net] やれやれ、また長い関数を書いてしまった
388 名前:デフォルトの名無しさん mailto:sage [2017/12/09(土) 01:25:45.78 ID:naguWC2La.net] 宣言しない奴のコードは読みたくないな。 宣言全部入れてから持って来いと言うかも。
389 名前:デフォルトの名無しさん mailto:sage [2017/12/09(土) 01:27:01.02 ID:vu3Y0INla.net] >>375 VBAに慣れてれば、そんなの違和感無いけどな。
390 名前:デフォルトの名無しさん mailto:sage [2017/12/09(土) 01:39:08.64 ID:vu3Y0INla.net] >>373 それじゃコメントのしようがない。 どんな風に制御しているのかとか、結果はそのシュミレータソフトから取ってきてるんだろうけど、そこから逐次結果が得られてるのかとかの詳細が分からんと何とも言えない。
391 名前:デフォルトの名無しさん [2017/12/09(土) 11:52:36.39 ID:oQ1pndO0d.net] Debug.Print もApplication.Statusbar もちょっと処理が重くなってくると表示が止まって役に立たない
392 名前:デフォルトの名無しさん mailto:sage [2017/12/09(土) 13:26:29.70 ID:Px3+LsGd0.net] >>382 Debug.Printの次にDoEventsを書けばすぐに出力される
393 名前:デフォルトの名無しさん [2017/12/09(土) 20:32:20.11 ID:uW7BpcjHa.net] コメント関連ありがとう。 もう、人には見せない用だけどくどいくらいコメント書きまくってるw
394 名前:デフォルトの名無しさん [2017/12/10(日) 08:18:11.50 ID:PzHPENwqa.net] VBAの開発環境について デバッグ作業してると2画面欲しくなるんだけど皆さんどうしてる? vBEの画面と通常の画面をフルスクリーンで見たいし、VBEもコード書き込む画面のほかに現在の変数が分かる画面と実行結果が分かる画面が欲しいからノート1台でやってると画面グチャグチャ
395 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 08:41:31.53 ID:2VZ9i3vi0.net] ノートはUPS付きのデスクトップとして使ってる 24インチのモニタに繋いで 無線キーボードとマウスで操作
396 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 09:29:22.82 ID:s+zBVK9X0.net] モニタ2枚でやってるけど ツールボックスのウィンドウとかフォームが画面の境界に表示されたりして 地味に対応していない感を醸し出してる。 フルHD以上なら1枚でもVBEを端っこによけておけば窮屈じゃないと思う。 それよりエディタの貧弱ぶりをどうにかしてほしい。 今時のIDEを触ると、VBEはふた昔前のオマケ機能なんだなと思い知る。
397 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 12:22:00.56 ID:w7IPLNC5r.net] まあデバッグが必要になる様なマクロなんかこさえんなっで事だ
398 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 13:02:23.44 ID:rJurKCVR0.net] デバグが不要なマクロって相当短くないと無理だろ
399 名前:デフォルトの名無しさん [2017/12/10(日) 19:23:33.18 ID:RKQe6ZfS0.net] バグ発生に関与する要因としてコードの量のみを気にかけている → 初心者またはそれに準ずる低スキルのもち主 >>388 を受けてバグが一切発生しない事を想定している → 0か100でしか物事を考えられないアスペ デバッグをデバグと言っている → ガチのジジイか極端にセンスの悪い意識高い系 たった一言でここまでプロファイリング出来ました
400 名前:デフォルトの名無しさん [2017/12/10(日) 20:54:53.56 ID:DUp9AezHa.net] え??コード書き書きしたら一度も動作チェックしないで実装するの? すげー! ほぼ途中で止まって黄色くなる身としては信じられない. 全ての動作の確認と変数の動作に変な所がないか見るの楽しい. それに人が書いたコードで動作チェックするにもf8必要だし ただ、F8連打も大変だから超ゆっくり動作する機能でもあればいいのに
401 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 21:56:00.33 ID:tyDER63C0.net] 虫見付けるたんびに「バッグだ!バッグだ!」言うんか 自分の発言に違和感無いんか
402 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 22:02:23.86 ID:UfhTQ4hV0.net] プログラムがおかしい以上バグはバグだ 開発中に個人で見つけてるから影響が小さいというに過ぎないが べつにいいじゃんバグでも
403 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 22:28:29.51 ID:rJurKCVR0.net] リリース版を出すかどうかをデバグ作業と呼ぶかどうかの境界線にしてるって事なのかな? バグまみれでリリースして、ネット経由でパッチを当てるのが当たり前になった事が原因で、 そういう感覚が生まれたって考えるとなかなか興味深い現象だな。
404 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 22:54:03.35 ID:5raOMeRU0.net] お前、リアルで嫌われ者だろ たった一文でここまでプロファイリング出来ました
405 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 23:42:33.59 ID:05lOR9eq0.net] 質問です。(スレチかもだけど、他よりここの人たちのほうがLevel高そうなので) Excel2013 @Win10 64bit Core i7 Mem8GB ここ数日でAutoFilterのパフォーマンスが急に悪くなったと感じています。 テーブルは2000行*50列程度。 症状としてはフィルタリング済みのシートをSelectする際にタイムラグが発生します。 最初原因が分からなかったのですが、設計を少しずつ切り落としていった結果、 フィルタ範囲に入力規則が設定されていたのが原因でした。 その内容はIMEOffのみ。 フィルタがかかってない場合は瞬時にシート切替できるのに、フィルタリングされていると 切替に数秒待たされます。 フィルタ列が増えるとラグが倍増します。 また、列要素の先頭行付近の要素でフィルタされている場合の方が影響が大きいです。 2〜3日前までこのようなことはなかったのに、、何かExcel環境自体がかわったのかと 思いくまなく調べるのですが、原因が掴めません。 (つづく)
406 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 23:43:42.33 ID:05lOR9eq0.net] >>396 (つづき) マクロやシート上の把握できていない設計要素の影響を除外するために新規xlsxファイル で試しました。 前提:評価ブック以外のブックは開かない。 シート1:2000行*50列の表を作成、A-Zの1文字をランダムに埋め、AutoFilter設置。 書式設定、条件付き書式等は一切行わない。 入力規則は評価条件とする。(IME制御なしの場合とIME-Offの場合) フィルタ実施時は、2列絞り込む。 シート2:空シート 評価用Macro(シート1) Option Explicit Dim st As Single, ed As Single Private Sub Worksheet_Deactivate() st = Timer End Sub Private Sub Worksheet_Activate() ed = Timer: Debug.Print ed - st End Sub (つづく)
407 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 23:44:00.59 ID:05lOR9eq0.net] >>396 (つづき) 評価方法: 1)フィルタ設置のシート1を表示 2)Ctrlキーを押しながら、PgDn→PgUpを連続して押下。 3)Immediateウィンドウで計測時間を確認。 上記を5回程度実施 条件と結果: Case IME制御なし+フィルタなし ▼平均時間:約70msec Case IME制御なし+フィルタ-On ▼平均時間:約70msec Case IME-Off+フィルタなし ▼平均時間:約70msec Case IME-Off+フィルタ-On ▼平均時間:約7000msec ちなみに1列フィルタリングした場合は、約1400msec程度でした。 対症療法としては「入力規則使うな」となりそうですが、2〜3日前までは上記 現象は発生していなかったので、、原因療法が知りたいです。 どなたか上記現象分かるかたいらっしゃいませんか?
408 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 23:47:36.15 ID:VPQqZskd0.net] >>398 思い当たるのは、FCUでIMEの挙動がおかしくなったという報告多数な件
409 名前:デフォルトの名無しさん mailto:sage [2017/12/11(月) 03:47:36.99 ID:/hRyHJmR0.net] >>399 Version1703なのでまだFallは当たってないようです。
410 名前:デフォルトの名無しさん mailto:sage [2017/12/11(月) 11:20:26.75 ID:TIu41blJ0.net] ホントMSはアップデートなのかウイルスなのか分からんことするよな・・・
411 名前:デフォルトの名無しさん mailto:sage [2017/12/11(月) 13:06:28.39 ID:NoGJiqM0H.net] >>401 ちなみに職場の環境 Excel2010 @Win7 Excel2013 @Win8 では再現しませんでした。 やっぱりなんらかのUpdateが当たったのか、それとも自分でなんかやらかしてるのか、、、
412 名前:デフォルトの名無しさん mailto:sage [2017/12/11(月) 13:32:28.01 ID:pEROMoD00.net] 午前中にメッセージが出てアプデするか? とか聞きゃあがったから「あいよ」ってんで気軽に再起動した 90%ぐらい完了した後で Cannot だってやんの しょーもないから電源落として午後
413 名前:再起動したら また「アプデするか?」 って もうね、アホかと [] [ここ壊れてます]
414 名前:デフォルトの名無しさん mailto:sage [2017/12/12(火) 01:03:48.16 ID:vtwEo9S/0.net] Windows 押しつけがましいアップデートメッセージが出て いいえしまくってたんだけど ちょっと目を離して風呂入ってたら勝手に合意したことにしてOSインストールされてた そんな俺が客先で作らされてるのは顧客が一日黙ってたら契約に合意したことになるシステム
415 名前:デフォルトの名無しさん mailto:sage [2017/12/12(火) 04:17:56.67 ID:VGkGFTOK0.net] 質問です。 LastCellって簡単に取得できるのにHomePositionってこれといった決定打がないんですかね? SendKeys以外で簡単に安定して取得する方法ってありますか? できればSelectしなくてよい方法で。
416 名前:デフォルトの名無しさん [2017/12/12(火) 11:56:45.28 ID:R9+tEHmjd.net] ADODB.Streamで大きめのテキストファイルを読むときLoadFromFileが重いので、Openの引数でファイル指定してから ReadTextするようにしたいんですがうまくいきません。 パスをそのまま書いても、"file://C:temp/data.txt"のような書き方をしてもことごとくOpenのところで落ちてしまいます。 どう書けばいいんでしょうか? ちなみに先頭100行を試し読みするときとかに使いたいです。
417 名前:名無し mailto:sage [2017/12/12(火) 12:18:28.61 ID:KlMiw57eM.net] >>406 それならコード貼ったほうが早い 使い方云々が知りたいだけならググればいいし
418 名前:デフォルトの名無しさん [2017/12/12(火) 12:50:26.86 ID:R9+tEHmjd.net] >>407 スマホなのでちょっと待ってて
419 名前:デフォルトの名無しさん mailto:sage [2017/12/13(水) 11:40:21.94 ID:5F7kXiJk0.net] 名前を付けて保存する際 最近使った“アイテム”が 今週〜,先週〜,しばらく前,という順番で使用履歴の各ファイル名が表示されます。 これを表示させない設定を教えてください。 よろしくお願いいたします。 スペック ↓ OS=Win10 Excel2016 Officeバージョン=1710
420 名前:デフォルトの名無しさん mailto:407 [2017/12/13(水) 14:40:49.78 ID:5F7kXiJk0.net] ↑すいません、質問するべき板を間違えました。ここはVBAでしたね。 他で聞いてみます。
421 名前:デフォルトの名無しさん mailto:sage [2017/12/13(水) 22:03:05.49 ID:lbNGI0B20.net] チョイ前に変数の宣言が話題になってたから俺も一ネタ言いたい 「redim で変数の宣言が出来る仕様はやめて欲しい」 変数名を間違えた時にエラーで気付けるように普段から変数の宣言を強制してるんだけど、 redim で配列を変更する時に変数名を間違えても 新たな別の変数扱いされてエラーにならないから気付かないことがある 配列変数でも宣言は dim 、要素変更は redim っていう風にしといてくれたらと願ってやまない
422 名前:デフォルトの名無しさん [2017/12/13(水) 23:22:51.89 ID:b+I23nON0.net] Application.GetOpenFilename でファイルのパスを求められることが分かった Application.GetOpenFilename Workbooks.Open.Filename:=Application.GetOpenFilename ってできないことが意味がわらない あと Workbooks(Application.GetOpenFilename)ってやるとパス付のでエラーになってしまうこともわかった Workbookオブジェクトに適当な変数を宣言して iとする i = Application.GetOpenFilename i.worksheet()ってできない意味がわからない i = Workbooks.Open(filename:= ApplicationGetOpenFilename) i.worksheets() これならできる意味がわからない ()で戻り値をくくるのはわかる でもこの場合の戻り値はパス付戻り値であるから Applcation.GetOpen.... はいらないのでは?パス付戻り値ならば i = Application.GetOpenFilename でもできるのでは?WorkBookオブジェクト変数だから 誰か答えられる?
423 名前:デフォルトの名無しさん mailto:sage [2017/12/13(水) 23:34:03.63 ID:fRI8/I3E0.net] そういう言語仕様なので
424 名前:デフォルトの名無しさん [2017/12/13(水) 23:49:56.82 ID:b+I23nON0.net] わりと真面目に答えてくれ オブジェクト変数に直接パス付のファイル名をぶち込んでエラーになるのが意味わからない なんのためのオブジェクト変数なんだ Workbooks.Open(filename:= ApplicationGetOpenFilename) これもパス付のファイル名なのになんで格納できるんだ?
425 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:01:33.96 ID:iqnmwrCv0.net] まず型というものを理解してください つぎに、プロパティというものを理解してください つぎに、オブジェクトにはデフォルトプロパティというものがあるのを理解してください あと名前付き引数に対する理解も必要ですね VBAではSetでの代入とLet(を省略した)代入では意味が違うので、それもちゃんと区別してください いちいち全部ここで解説はせんが このぐらい理解すればたぶん答えはわかるだろ
426 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:13:48.84 ID:iqnmwrCv0.net] まじめに答えといてやるけど >オブジェクト変数に直接パス付のファイル名をぶち込んでエラーになるのが意味わからない たぶんお前がやってるのは、そのオブジェクト変数のデフォルトプロパティに代入しようとした で、そのオブジェクトがそれを受け入れないからエラーがでたんだろうな >Workbooks.Open(filename:= ApplicationGetOpenFilename) >これもパス付のファイル名なのになんで格納できるんだ? 格納の意味が分からん ApplicationGetOpenFilename(の結果)をたんにOpenの(filename)引数として渡してるだけ ApplicationGetOpenFilenameの結果がOpenのfilename引数として適当だからエラーが出なかっただけ
427 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:14:33.99 ID:FrwGQASIx.net] パス付戻り値っていう表現が凄い Application.GetOpenFilenameの戻り値は、パス文字列か、パス文字列の配列か、ダイアログがキャンセルされたときに返されるFalseかのいずれかしかない パス付って、何にパスがくっついてると理解してるんだろう パスが戻り値そのものだろう
428 名前:デフォルトの名無しさん [2017/12/14(木) 00:18:35.88 ID:oVDd8Fug0.net] >>416 意味がわからん 初心者相手に専門用語で勝った気になるなよ
429 名前:デフォルトの名無しさん [2017/12/14(木) 00:21:23.88 ID:oVDd8Fug0.net] >>417 パスってのは ¥C:のことだろ? openメゾットの戻り値も¥C:ついてるのに WBオブジェクト変数に格納できる意味がわからない 専門用語でこたえるな わかりやすく答えろ 外人相手に口喧嘩して勝ち誇ってるやつと同じだわ
430 名前:デフォルトの名無しさん [2017/12/14(木) 00:23:38.19 ID:oVDd8Fug0.net] workbookのオブジェクト変数のデフォルトプロパティってなんだよ そこを答えろ 答えろって言わないと答え出て来ねえのかよ
431 名前:デフォルトの名無しさん [2017/12/14(木) 00:24:22.55 ID:oVDd8Fug0.net] ちなみにおれはVBA初めて3時間 ここまでの疑問が出るだけすごいと思うけど
432 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:24:26.11 ID:0XKK4N9O0.net] >>412 >Workbooks.Open.Filename:=Application.GetOpenFilename >ってできないことが意味がわ「か」らない Workbooks.Open Filename:=Application.GetOpenFilename なら動くんだが、それではダメ?(open と filename の間は半角スペース) 何故かと言えば言語の仕様として 引数はピリオドで繋ぐものではないからとしか言いようがない (workbooks はオブジェクト、open はメソッド、filename:=~ はその引数) >i = Application.GetOpenFilename >i.worksheet「s」()ってできない意味がわからない 変数i が workbook型だとして、Application.GetOpenFilename の戻り値はworkbook型ではない。 戻り値はvariant型なんだけど、キャンセル時に false になるだけで、ファイルが選択されていれば文字列が返される 複数ファイルが選択されてても文字列が配列で帰るだけ それに、i がworkbook型変数なので set を付けないとダメ i が variant型変数 なら文字列か false が帰るだけでヤッパリ workbook としての挙動はしない i.worksheet「s」() っていうのも、worksheetオブジェクトは 既に開いているブックのシートしか指定出来ないから、i がブックとしてオープンしてなきゃ当然ダメ >i = Workbooks.Open(filename:= ApplicationGetOpenFilename) >i.worksheets() >これならできる意味がわからない set i = Workbooks.Open(filename:= ApplicationGetOpenFilename) じゃないと動かないよ 理由は前述のとおり
433 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:32:01.43 ID:FrwGQASIx.net] >>419 Openメソッドの戻り値はパスではなく、Workbookオブジェクトそのものだ 開いているブックの集まりであるWorkbooksコレクションオブジェクトに、引数Filenameで指定したブックを追加して、戻り値としてそのブックそのものを返す処理だ 何か根本的に勘違いしてるだろ君
434 名前:デフォルトの名無しさん [2017/12/14(木) 00:33:36.37 ID:oVDd8Fug0.net] >>422 お前がまだわかりやすいな ただし おれはすでに開いているファイルじゃないと操作できないとかは全部知っている オブジェクト型変数の前にsetステートメントを置くことも知っている つまり Application.GetOpenfilename = ファイルを開いた時は文字列が返される workbook型に返せないのか? 答えはパス付きの文字列で帰って来るためにノーだ これも知ってる Workbooks.Open filename:=Application.GetOpenfilename これも知っている しかし結果としては ファイルを選択で開いたパス付き文字列を開く という命令なはず 同じパス付き文字列なのにworkbook型に格納できないのが意味がわからない
435 名前:デフォルトの名無しさん [2017/12/14(木) 00:35:42.03 ID:oVDd8Fug0.net] >>423 ん?なんで? msgboxで表示されてもパス付きになるよ?
436 名前:デフォルトの名無しさん [2017/12/14(木) 00:41:28.15 ID:oVDd8Fug0.net] またも意味不明な現象が起きた 拡張子を指定しなかったのに開いた 拡張子を指定したらなぜかエラーが出た なんでだ? https://i.imgur.com/lqUNtRU.jpg
437 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:42:52.81 ID:FrwGQASIx.net] >>420 オブジェクトには、特にプロパティ名を指定しないでアクセスする場合に、優先的に参照されるプロパティが決められていて、それをデフォルトプロパティと呼ぶ オブジェクト型に合わないデータを代入してしまう構文になっているときでも、データの型がデフォルトプロパティの型に適合していればVBAはデフォルトプロパティへの代入として解釈して処理を受け付ける
438 名前:デフォルトの名無しさん [2017/12/14(木) 00:44:33.92 ID:oVDd8Fug0.net] >>423 Workbooks.Open(filename:= ApplicationGetOpenFilename) →\C:〜〜〜〜という文字列が返される ApplicationGetOpenFilename →これも同じ なぜ前者はWorkbook変数に格納できて 後者はできないんだ?
439 名前:デフォルトの名無しさん [2017/12/14(木) 00:45:53.39 ID:oVDd8Fug0.net] >>427 そんなもん知ってるわ Rangeやcellsのvalueみたいなもんだろ? Workbookオブジェクトのデフォルトプロパティはなんだ?
440 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:48:20.20 ID:0XKK4N9O0.net] >>424 悪いけど>>412 の書き方じゃ分かってるようには見えない set を付けてない時点でこの人は分かってないんだなと判断されても仕方ない そして >Application.GetOpenfilename = ファイルを開いた時は文字列が返される も間違い Application.GetOpenfilename は、 あくまでもファイルのパス情報を文字列(或いは false)で返すだけで 実際にブックを開けることはしない だから正確に書くと Application.GetOpenfilename = ファイルを「選択した」時は文字列が返される というべきで、そのブックを開くためにworkbooks.open を用いる必要がある
441 名前:デフォルトの名無しさん [2017/12/14(木) 00:51:58.64 ID:oVDd8Fug0.net] >>430 set オブジェクト変数を代入するとこに扱うステートメント
442 名前:デフォルトの名無しさん [2017/12/14(木) 00:53:08.36 ID:oVDd8Fug0.net] >>430 ファイルを開いたっていうのは 選択したって意味なんだが オブジェクトとOPENメゾットで初めて開く こんなの知っている
443 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:53:19.64 ID:0XKK4N9O0.net] >>430 でもまだ不正確だった より正確に言うと Application.GetOpenfilename = 「開きたい(あるいは移動、コピー、改名、削除など何らかの操作をしたい)」ファイルを「選択した」時は文字列が返される ですね
444 名前:デフォルトの名無しさん [2017/12/14(木) 00:55:08.87 ID:oVDd8Fug0.net] >>433 んなもんしってるわ キャンセル押されたらフェイルス ファイルを選択したらパス文字列
445 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:56:13.50 ID:0XKK4N9O0.net] >>432 いや、それが分かってるなら何を問題にしてるのかがよく分からない それと「メゾット」じゃなくて「メソッド」ね
446 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:56:39.81 ID:pIjJ7/MG0.net] 真面目に答えるんじゃなくて わりと真面目に答えるように
447 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:58:18.78 ID:FrwGQASIx.net] >>420 ちなみにworkbookオブジェクトのデフォルトプロパティは存在しない 存在しないから当然、workbook型に合わないデータは代入できない
448 名前:デフォルトの名無しさん [2017/12/14(木) 01:00:54.08 ID:oVDd8Fug0.net] >>437 じゃあなんで workbook.openのパス文字列は入るんですかねえ
449 名前: [] [ここ壊れてます]
450 名前:デフォルトの名無しさん [2017/12/14(木) 01:01:13.61 ID:oVDd8Fug0.net] ここまで答えなしだが 誰もわからないのか?
451 名前:デフォルトの名無しさん [2017/12/14(木) 01:01:34.43 ID:oVDd8Fug0.net] おれの質問ってVBAの穴をついた?
452 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 01:04:09.93 ID:0XKK4N9O0.net] 質問の意味がわからないんですよね 何が疑問なのか、独自表現を用いずに、 set やなんかも省略せずに正しく動作するコードと 動作しない理由が知りたい動かないコードを書いてみてもらえます?
453 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 01:05:31.95 ID:FrwGQASIx.net] >>428 workbooksは、workbookクラスではない 別のオブジェクトのクラスだ それから、さっきも書いたが、Openメソッドの戻り値は引数で指定されたパスを持つWorkbookオブジェクトなのであって、Openメソッドによってパス自体が戻ってくる訳ではない パスを返してくるApplicationクラスのGetOpenFilenameメソッドとは全く働きが違う プロパティやクラスや引数の名前で何となくbookとかfileとか付けばパス付のWorkbookオブジェクトが返ってくるものと混同してるようだが、きちんと区別しないといけない
454 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 01:13:20.35 ID:FrwGQASIx.net] >>438 Openメソッドが要求する名前付き引数Filenameに、GetOpenFilenameで取得したパスを設定して、その結果新しく開いたWorkbookオブジェクトが返っているからだよ このFilenameはApplication.GetOpenFilenameメソッドの戻り値ではあるけど、Workbooks.Openメソッドの戻り値ではない Worksheets.Item(Index:=ActiveSheet.Name)みたいな処理と一緒だと言えば少しは分かるか?
455 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 01:13:59.17 ID:FrwGQASIx.net] >>440 突いてない 典型的な初心者の質問
456 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 01:17:18.86 ID:LaUulqGP0.net] 典型ではないな 低次元な初心者の質問
457 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 01:22:45.67 ID:FrwGQASIx.net] たぶんこの質問者は、コレクションを知らないタイプだな、 それから、式に含まれるプロパティ名やメソッド名をオブジェクトのクラス名と同一視しているタイプだろう
458 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 01:34:07.25 ID:n2gI2QxJ0.net] たぶんハイパーリンクでパスが表現される事が多いところから、 パスが文字列とは異なるデータ型を持つ何かだと勘違いしてるだけじゃないの?
459 名前:デフォルトの名無しさん [2017/12/14(木) 07:32:56.86 ID:oVDd8Fug0.net] >>443 workbooks.open filename:=Application.GetOpenfilename この場合はworkbooksオブジェクトに選択したパス文字列が格納されるのか? だからworkbook型に格納できるのか?
460 名前:デフォルトの名無しさん [2017/12/14(木) 07:37:06.65 ID:oVDd8Fug0.net] >>446 ん? workbooks worksheets rows これはコレクションだろ? コレクションはオブジェクトの最上位 プロパティはオブジェクトの何? メゾットはオブジェクトに命令 違うか?
461 名前:デフォルトの名無しさん [2017/12/14(木) 07:40:17.60 ID:oVDd8Fug0.net] マジでわかりやすい答えがない
462 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 08:30:04.65 ID:mohvOYX1x.net] >>448 君の言う「格納」は、コレクションへのオブジェクトインスタンスの追加、プロパティ値の設定、変数への代入、引数の受け渡し等がごちゃごちゃになっていると思う まず、Workbooksコレクションに、データの代入はできない WorkbooksコレクションはWorkbookオブジェクトの集まりを要素に持つコレクションオブジェクトだから それから、Workbooks.Open Filename:=Application.GetOpenFilenameという構文は、Workbook型の変数に値を代入しているわけではない Filenameという名前付きで定義されたOpenメソッドの文字列型の第一引数に値を渡していて、その結果としてOpenメソッドがWorkbookオブジェクトを返しているわけで、オブジェクト型変数への代入ではない
463 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 08:45:33.01 ID:YV9D93CW0.net] >>449 コレクションは最上位じゃない 一番上にあるのはオブジェクト
464 名前:デフォルトの名無しさん [2017/12/14(木) 08:46:43.07 ID:QIiUylbtp.net] >>451 いやそんなのしってるんだけど dim i string dim wb workbook application.Getopen filename:=で目的のファイルを開く そしたら「¥:目的のワークブック.xlsx」が文字列として帰って来る workbooks.open filename:=目的のファイル これで初めて目的のファイルが開く ここで本題 どちらも目的のファイルのバス名が返ってきているのに set wb = application.GetOpen filename だとエラーで set wb = workbooks.open (filename :=目的のワークブック.xlsx) これならwbオブジェクト型変数に代入される意味がわからない これをはっきり答えろ わかりやすくな
465 名前:デフォルトの名無しさん [2017/12/14(木) 08:47:18.91 ID:QIiUylbtp.net] >>452 一番上 ↓ 最上 日本語やり直したほうがいい