Excel VBA 質問スレ Part51
■ このスレッドは過去ログ倉庫に格納されています
スレ立ての際は一行目に !extend:checked:vvvvv:1000:512 と入れてスレ立てして下さい ExcelのVBAに関する質問スレです コード書き込みや作成依頼もOK ※関連スレ VBAなんでも質問スレ Part2 http://mevius.2ch.net/test/read.cgi/tech/1432173164/ Access VBA 質問スレ Part1 http://mevius.2ch.net/test/read.cgi/tech/1328536426/ Excel総合相談所 126 https://mevius.2ch.net/test/read.cgi/bsoft/1496487719/ ※前スレ Excel VBA 質問スレ Part50 http://mevius.2ch.net/test/read.cgi/tech/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured 👀 Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f) >>371 それじゃコメントのしようがない。 どんな風に制御しているのかとか、結果はそのシュミレータソフトから取ってきてるんだろうけど、そこから逐次結果が得られてるのかとかの詳細が分からんと何とも言えない。 Debug.Print もApplication.Statusbar もちょっと処理が重くなってくると表示が止まって役に立たない >>380 Debug.Printの次にDoEventsを書けばすぐに出力される コメント関連ありがとう。 もう、人には見せない用だけどくどいくらいコメント書きまくってるw VBAの開発環境について デバッグ作業してると2画面欲しくなるんだけど皆さんどうしてる? vBEの画面と通常の画面をフルスクリーンで見たいし、VBEもコード書き込む画面のほかに現在の変数が分かる画面と実行結果が分かる画面が欲しいからノート1台でやってると画面グチャグチャ ノートはUPS付きのデスクトップとして使ってる 24インチのモニタに繋いで 無線キーボードとマウスで操作 モニタ2枚でやってるけど ツールボックスのウィンドウとかフォームが画面の境界に表示されたりして 地味に対応していない感を醸し出してる。 フルHD以上なら1枚でもVBEを端っこによけておけば窮屈じゃないと思う。 それよりエディタの貧弱ぶりをどうにかしてほしい。 今時のIDEを触ると、VBEはふた昔前のオマケ機能なんだなと思い知る。 まあデバッグが必要になる様なマクロなんかこさえんなっで事だ バグ発生に関与する要因としてコードの量のみを気にかけている → 初心者またはそれに準ずる低スキルのもち主 >>386 を受けてバグが一切発生しない事を想定している → 0か100でしか物事を考えられないアスペ デバッグをデバグと言っている → ガチのジジイか極端にセンスの悪い意識高い系 たった一言でここまでプロファイリング出来ました え??コード書き書きしたら一度も動作チェックしないで実装するの? すげー! ほぼ途中で止まって黄色くなる身としては信じられない. 全ての動作の確認と変数の動作に変な所がないか見るの楽しい. それに人が書いたコードで動作チェックするにもf8必要だし ただ、F8連打も大変だから超ゆっくり動作する機能でもあればいいのに 虫見付けるたんびに「バッグだ!バッグだ!」言うんか 自分の発言に違和感無いんか プログラムがおかしい以上バグはバグだ 開発中に個人で見つけてるから影響が小さいというに過ぎないが べつにいいじゃんバグでも リリース版を出すかどうかをデバグ作業と呼ぶかどうかの境界線にしてるって事なのかな? バグまみれでリリースして、ネット経由でパッチを当てるのが当たり前になった事が原因で、 そういう感覚が生まれたって考えるとなかなか興味深い現象だな。 お前、リアルで嫌われ者だろ たった一文でここまでプロファイリング出来ました 質問です。(スレチかもだけど、他よりここの人たちのほうがLevel高そうなので) Excel2013 @Win10 64bit Core i7 Mem8GB ここ数日でAutoFilterのパフォーマンスが急に悪くなったと感じています。 テーブルは2000行*50列程度。 症状としてはフィルタリング済みのシートをSelectする際にタイムラグが発生します。 最初原因が分からなかったのですが、設計を少しずつ切り落としていった結果、 フィルタ範囲に入力規則が設定されていたのが原因でした。 その内容はIMEOffのみ。 フィルタがかかってない場合は瞬時にシート切替できるのに、フィルタリングされていると 切替に数秒待たされます。 フィルタ列が増えるとラグが倍増します。 また、列要素の先頭行付近の要素でフィルタされている場合の方が影響が大きいです。 2〜3日前までこのようなことはなかったのに、、何かExcel環境自体がかわったのかと 思いくまなく調べるのですが、原因が掴めません。 (つづく) >>394 (つづき) マクロやシート上の把握できていない設計要素の影響を除外するために新規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 (つづく) >>394 (つづき) 評価方法: 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日前までは上記 現象は発生していなかったので、、原因療法が知りたいです。 どなたか上記現象分かるかたいらっしゃいませんか? >>396 思い当たるのは、FCUでIMEの挙動がおかしくなったという報告多数な件 >>397 Version1703なのでまだFallは当たってないようです。 ホントMSはアップデートなのかウイルスなのか分からんことするよな・・・ >>399 ちなみに職場の環境 Excel2010 @Win7 Excel2013 @Win8 では再現しませんでした。 やっぱりなんらかのUpdateが当たったのか、それとも自分でなんかやらかしてるのか、、、 午前中にメッセージが出てアプデするか? とか聞きゃあがったから「あいよ」ってんで気軽に再起動した 90%ぐらい完了した後で Cannot だってやんの しょーもないから電源落として午後再起動したら また「アプデするか?」 って もうね、アホかと Windows 押しつけがましいアップデートメッセージが出て いいえしまくってたんだけど ちょっと目を離して風呂入ってたら勝手に合意したことにしてOSインストールされてた そんな俺が客先で作らされてるのは顧客が一日黙ってたら契約に合意したことになるシステム 質問です。 LastCellって簡単に取得できるのにHomePositionってこれといった決定打がないんですかね? SendKeys以外で簡単に安定して取得する方法ってありますか? できればSelectしなくてよい方法で。 ADODB.Streamで大きめのテキストファイルを読むときLoadFromFileが重いので、Openの引数でファイル指定してから ReadTextするようにしたいんですがうまくいきません。 パスをそのまま書いても、"file://C:temp/data.txt"のような書き方をしてもことごとくOpenのところで落ちてしまいます。 どう書けばいいんでしょうか? ちなみに先頭100行を試し読みするときとかに使いたいです。 >>404 それならコード貼ったほうが早い 使い方云々が知りたいだけならググればいいし 名前を付けて保存する際 最近使った“アイテム”が 今週〜,先週〜,しばらく前,という順番で使用履歴の各ファイル名が表示されます。 これを表示させない設定を教えてください。 よろしくお願いいたします。 スペック ↓ OS=Win10 Excel2016 Officeバージョン=1710 ↑すいません、質問するべき板を間違えました。ここはVBAでしたね。 他で聞いてみます。 チョイ前に変数の宣言が話題になってたから俺も一ネタ言いたい 「redim で変数の宣言が出来る仕様はやめて欲しい」 変数名を間違えた時にエラーで気付けるように普段から変数の宣言を強制してるんだけど、 redim で配列を変更する時に変数名を間違えても 新たな別の変数扱いされてエラーにならないから気付かないことがある 配列変数でも宣言は dim 、要素変更は redim っていう風にしといてくれたらと願ってやまない 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オブジェクト変数だから 誰か答えられる? わりと真面目に答えてくれ オブジェクト変数に直接パス付のファイル名をぶち込んでエラーになるのが意味わからない なんのためのオブジェクト変数なんだ Workbooks.Open(filename:= ApplicationGetOpenFilename) これもパス付のファイル名なのになんで格納できるんだ? まず型というものを理解してください つぎに、プロパティというものを理解してください つぎに、オブジェクトにはデフォルトプロパティというものがあるのを理解してください あと名前付き引数に対する理解も必要ですね VBAではSetでの代入とLet(を省略した)代入では意味が違うので、それもちゃんと区別してください いちいち全部ここで解説はせんが このぐらい理解すればたぶん答えはわかるだろ まじめに答えといてやるけど >オブジェクト変数に直接パス付のファイル名をぶち込んでエラーになるのが意味わからない たぶんお前がやってるのは、そのオブジェクト変数のデフォルトプロパティに代入しようとした で、そのオブジェクトがそれを受け入れないからエラーがでたんだろうな >Workbooks.Open(filename:= ApplicationGetOpenFilename) >これもパス付のファイル名なのになんで格納できるんだ? 格納の意味が分からん ApplicationGetOpenFilename(の結果)をたんにOpenの(filename)引数として渡してるだけ ApplicationGetOpenFilenameの結果がOpenのfilename引数として適当だからエラーが出なかっただけ パス付戻り値っていう表現が凄い Application.GetOpenFilenameの戻り値は、パス文字列か、パス文字列の配列か、ダイアログがキャンセルされたときに返されるFalseかのいずれかしかない パス付って、何にパスがくっついてると理解してるんだろう パスが戻り値そのものだろう >>414 意味がわからん 初心者相手に専門用語で勝った気になるなよ >>415 パスってのは ¥C:のことだろ? openメゾットの戻り値も¥C:ついてるのに WBオブジェクト変数に格納できる意味がわからない 専門用語でこたえるな わかりやすく答えろ 外人相手に口喧嘩して勝ち誇ってるやつと同じだわ workbookのオブジェクト変数のデフォルトプロパティってなんだよ そこを答えろ 答えろって言わないと答え出て来ねえのかよ ちなみにおれはVBA初めて3時間 ここまでの疑問が出るだけすごいと思うけど >>410 >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) じゃないと動かないよ 理由は前述のとおり >>417 Openメソッドの戻り値はパスではなく、Workbookオブジェクトそのものだ 開いているブックの集まりであるWorkbooksコレクションオブジェクトに、引数Filenameで指定したブックを追加して、戻り値としてそのブックそのものを返す処理だ 何か根本的に勘違いしてるだろ君 >>420 お前がまだわかりやすいな ただし おれはすでに開いているファイルじゃないと操作できないとかは全部知っている オブジェクト型変数の前にsetステートメントを置くことも知っている つまり Application.GetOpenfilename = ファイルを開いた時は文字列が返される workbook型に返せないのか? 答えはパス付きの文字列で帰って来るためにノーだ これも知ってる Workbooks.Open filename:=Application.GetOpenfilename これも知っている しかし結果としては ファイルを選択で開いたパス付き文字列を開く という命令なはず 同じパス付き文字列なのにworkbook型に格納できないのが意味がわからない >>421 ん?なんで? msgboxで表示されてもパス付きになるよ? またも意味不明な現象が起きた 拡張子を指定しなかったのに開いた 拡張子を指定したらなぜかエラーが出た なんでだ? https://i.imgur.com/lqUNtRU.jpg >>418 オブジェクトには、特にプロパティ名を指定しないでアクセスする場合に、優先的に参照されるプロパティが決められていて、それをデフォルトプロパティと呼ぶ オブジェクト型に合わないデータを代入してしまう構文になっているときでも、データの型がデフォルトプロパティの型に適合していればVBAはデフォルトプロパティへの代入として解釈して処理を受け付ける >>421 Workbooks.Open(filename:= ApplicationGetOpenFilename) →\C:〜〜〜〜という文字列が返される ApplicationGetOpenFilename →これも同じ なぜ前者はWorkbook変数に格納できて 後者はできないんだ? >>425 そんなもん知ってるわ Rangeやcellsのvalueみたいなもんだろ? Workbookオブジェクトのデフォルトプロパティはなんだ? >>422 悪いけど>>410 の書き方じゃ分かってるようには見えない set を付けてない時点でこの人は分かってないんだなと判断されても仕方ない そして >Application.GetOpenfilename = ファイルを開いた時は文字列が返される も間違い Application.GetOpenfilename は、 あくまでもファイルのパス情報を文字列(或いは false)で返すだけで 実際にブックを開けることはしない だから正確に書くと Application.GetOpenfilename = ファイルを「選択した」時は文字列が返される というべきで、そのブックを開くためにworkbooks.open を用いる必要がある >>428 set オブジェクト変数を代入するとこに扱うステートメント >>428 ファイルを開いたっていうのは 選択したって意味なんだが オブジェクトとOPENメゾットで初めて開く こんなの知っている >>428 でもまだ不正確だった より正確に言うと Application.GetOpenfilename = 「開きたい(あるいは移動、コピー、改名、削除など何らかの操作をしたい)」ファイルを「選択した」時は文字列が返される ですね >>431 んなもんしってるわ キャンセル押されたらフェイルス ファイルを選択したらパス文字列 >>430 いや、それが分かってるなら何を問題にしてるのかがよく分からない それと「メゾット」じゃなくて「メソッド」ね 真面目に答えるんじゃなくて わりと真面目に答えるように >>418 ちなみにworkbookオブジェクトのデフォルトプロパティは存在しない 存在しないから当然、workbook型に合わないデータは代入できない >>435 じゃあなんで workbook.openのパス文字列は入るんですかねえ 質問の意味がわからないんですよね 何が疑問なのか、独自表現を用いずに、 set やなんかも省略せずに正しく動作するコードと 動作しない理由が知りたい動かないコードを書いてみてもらえます? >>426 workbooksは、workbookクラスではない 別のオブジェクトのクラスだ それから、さっきも書いたが、Openメソッドの戻り値は引数で指定されたパスを持つWorkbookオブジェクトなのであって、Openメソッドによってパス自体が戻ってくる訳ではない パスを返してくるApplicationクラスのGetOpenFilenameメソッドとは全く働きが違う プロパティやクラスや引数の名前で何となくbookとかfileとか付けばパス付のWorkbookオブジェクトが返ってくるものと混同してるようだが、きちんと区別しないといけない >>436 Openメソッドが要求する名前付き引数Filenameに、GetOpenFilenameで取得したパスを設定して、その結果新しく開いたWorkbookオブジェクトが返っているからだよ このFilenameはApplication.GetOpenFilenameメソッドの戻り値ではあるけど、Workbooks.Openメソッドの戻り値ではない Worksheets.Item(Index:=ActiveSheet.Name)みたいな処理と一緒だと言えば少しは分かるか? たぶんこの質問者は、コレクションを知らないタイプだな、 それから、式に含まれるプロパティ名やメソッド名をオブジェクトのクラス名と同一視しているタイプだろう たぶんハイパーリンクでパスが表現される事が多いところから、 パスが文字列とは異なるデータ型を持つ何かだと勘違いしてるだけじゃないの? >>441 workbooks.open filename:=Application.GetOpenfilename この場合はworkbooksオブジェクトに選択したパス文字列が格納されるのか? だからworkbook型に格納できるのか? >>444 ん? workbooks worksheets rows これはコレクションだろ? コレクションはオブジェクトの最上位 プロパティはオブジェクトの何? メゾットはオブジェクトに命令 違うか? >>446 君の言う「格納」は、コレクションへのオブジェクトインスタンスの追加、プロパティ値の設定、変数への代入、引数の受け渡し等がごちゃごちゃになっていると思う まず、Workbooksコレクションに、データの代入はできない WorkbooksコレクションはWorkbookオブジェクトの集まりを要素に持つコレクションオブジェクトだから それから、Workbooks.Open Filename:=Application.GetOpenFilenameという構文は、Workbook型の変数に値を代入しているわけではない Filenameという名前付きで定義されたOpenメソッドの文字列型の第一引数に値を渡していて、その結果としてOpenメソッドがWorkbookオブジェクトを返しているわけで、オブジェクト型変数への代入ではない >>447 コレクションは最上位じゃない 一番上にあるのはオブジェクト >>449 いやそんなのしってるんだけど 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オブジェクト型変数に代入される意味がわからない これをはっきり答えろ わかりやすくな >>450 一番上 ↓ 最上 日本語やり直したほうがいい >>451 Set wb = Application.GetOpenFilename は、String型をWorkbook型のポインタへ代入しようとしてエラー吐いてる。 Set wb = Workbooks.Open(Application.GetOpenFilename) Set wb = Workbooks.Open("目的のワークブック.xlsx") は、OpenメソッドにString型変数を渡しているから機能する。 >>453 workbook型のポインタってなに? これがわかればすっきり >>447 コレクションはオブジェクトの最上位、という発想がそもそも間違い コレクションは子要素に追加されているデータやオブジェクトへのアクセス等を提供する、子要素からは独立したオブジェクトだ 更に、WorkbooksコレクションオブジェクトはWorkbookオブジェクトのみを要素に持つようにあらかじめ最適化された規定のコレクションオブジェクト >>453 WB型変数に文字列代入は不可 メゾットの戻り値の代入は可能ってこと? なんで? >>452 日本語だけ知ってても言語仕様を正確に説明する難しいんだよ コンピューター業界では「上位」などの言葉には特別な意味を持たせる場合もあるし、 とくに相手がド素人だと、言葉の意味から説明するのも面倒だから、あえて上位という単語は避けた上で なんとなく通じてくれそうな「上」って言い方をしたんだよ お前の態度が気に入らないからワッチョイ Spc7はNGするわ 人に何か質問する時は最後までていねいな言葉を使え >>457 うんこーwwwwwwwwwwうんこーwwwwwwwwww >>451 そもそもApplication.GetOpenFilenameはブックを開いてブックへの参照を返すメソッドじゃなくて、ユーザーにダイアログ画面上で選択させたファイルのパスを返すメソッドなんだが メソッド名で混乱してるだろ君 >>459 いやしってるけど キャンセルが押されたらフェイルスだし 選択したらパス名が返って来る 何回言えば気がすむんだよ Openメゾットはただブックを開くだけだろ? ただし 引数を戻り値として得られる つまり 開いたファイル名がOpenメゾット内にある 違うかい?いい線いってる? >>456 なんでも何もデータ型が一致するかどうかが問題であって、メソッドの戻り値の型は一致するってだけ。 たぶんJavaScriptから始めたせいで認識がおかしくなってるんだろうけど、 普通はデータ型が異なる変数同士の代入は出来ない。 この質問者みたいな人が言語仕様について思い込みや勘違いをしたまま共用マクロを組んだりすると、会社にとって迷惑なだけなんだよな 作ったマクロを他人と共有しないことを祈るのみ >>460 それ俺がきのう説明したことだよねw オブジェクト型変数にGetOpenFilenameから返った文字列型データやデータ配列を設定しようとしてるのがおかしいんだがw データ型とか一回学んだ方が良いと思うよ それから蛇足だけど、フェールスじゃなくて、フォルス、フォールス、ファルスの何れかの表記にしないと、Falseのことだと理解してもらえないことが多いと思うよ >>461 引数の文字列は戻り値にならない Openの戻り値はWorkbookオブジェクトの実体だ Workbookオブジェクトの実体とパス文字列はイコールじゃない それから、メゾットじゃなくてメソッドな あんまり特徴的な言葉づかいしてるとメゾット君と フェールス君とか呼ばれたりするかもしれないから気を付けなよ >>465 実体でなに?どころどころで補足質問しねえといけねえのかよ >>462 変数同士? workbook型あとは何? これも補足質問 >>464 データ型の参考ページは? 猿でもわかるやつ >>468 その言い方は猿に対して失礼だぞメゾット君 WordやPowerPointのVBAと違ってExcelは「Excel VBA データ 型」でググれば腐るほど情報が出てくるから、好きなページを読んで出直してきたらいいさ インスタンスもググってみたらいいよ >>466 Workbookの実体とは開いて実行しているエクセルブックのことだよ。ブックはVBAが管理しているメモリ上のデータではないってこと。そこにアクセスする為の情報だけがWorkbook型変数には格納されている。 これ以上はググったほうがいいな。メゾットちゃんには言葉だけでは通じないみたいだし。 どう考えてもこいつは型も文法も戻り値も理解できてないだけだろ インスタンスはお湯かけて3分で完成するよ (´・ω・`)b 体系だてた答えがほしいならオブジェクト指向あたりの本読んだ方がいいんじゃねえの 正確にはオブジェクト指向じゃないけどクラスとインスタンス(やそれにくっついてるメソッドやプロパティ)の関係を理解するにはそれがはや道だわ ここは教科書じゃないから >>470 ふーん 開いてから格納する これだけだよね?詰まる所は Openメソッドで開かないと workbook型に入らない それは結果に過ぎない ちゃんと原因や理屈を押さえないとまた同じことで詰むぞ >>477 それをわかりやすく教えて ほんとにわかりやすく ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる