Excel VBA 質問スレ Part63
■ このスレッドは過去ログ倉庫に格納されています
!extend:checked:vvvvv:1000:512 ExcelのVBAに関する質問スレです コード書き込みや作成依頼もOK ※前スレ Excel VBA 質問スレ Part62 https://mevius.5ch.net/test/read.cgi/tech/1561303297/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured CreateObject("VBScript.RegExp") VBScript のオブジェクトを作っているのだろ。 別のプロセスか、DLL から作っているのだろ とても、スタックとは思えない そもそも占有領域とはなにを指しているのか VBAのローカル変数はスタックにとられる それ以上はそのオブジェクト次第 >>773 VBScriptの正規表現オブジェクトはIE付属のエンジンだからヒープにインスタンス作成してるだろうし、参照カウンタ0になったら自動破棄されてるんじゃないの このサブルーチンからの参照がなくなっても別の参照が発生してたらインスタンスは残るでしょ だから、このサブルーチンが正常終了するかどうかとメモリリークが起きるかどうかは別問題だと思う サブルーチン外に制御が渡った段階でこの正規表現オブジェクトがどこかのプロセスによって参照されていて、そっちの制御フローの中に猛烈なメモリ負荷が発生する処理が存在すれば、メモリリークの原因になりうる execループで空文字をマッチさせていてindexが進まずに無限ループしたりとかね それと、あなたの認識通り、End Subでスタック内のローカル変数のアドレス空間自体が解放されるので、End Subの直前にこの変数SEにNothingを代入する理由はない モジュールレベルの変数やグローバル変数を使う場合は逆に、制御フロー上の要求としてサブルーチン終了時に参照アドレスをクリアしなければならない場合もある Windows10で、SetLayeredWindowAttributesのLWA_COLORKEYを正常動作させる方法ある? Windows7でやる方法は知ってるので、7の場合の回答は不要。 with cells(i,j) .cut .offset(1,0) .value=k end with cells(i,j)にkが入らず、cells(i+1,j)にkが入るんだけど仕様? >>790 普通に Cells(i, j).Value = k では駄目なのか? >>790 cut貼り付けでセルそのものが移動してるから >>791 >>792 仕様なんですね ありがとうございます 仕様というか、代入先を自分で変えてることは伝わってるんだろうか >>790 仕様ではなくて君のコードの動作の問題 同じ綴りのオブジェクト式の記述をまとめる文法ルールとしてWithを理解するのは大きな間違い Withで任意のセルを取得して和のセルに貼り付けたらEnd Withまでずっと貼り付けられた先のセルを参照する その状態で.Valueに値を代入したら、当然貼り付けられたセルの値が変わる With Cells(i, j) .Cut .Offset(1,0) End With Cells(i, j).Value = k とすれば何の問題もない >>795 わかってて聞いてるんでしょ わかってなきゃわざわざ「仕様?」なんて聞き方しないだろうし With で参照してるセルを変更した時の挙動を書いてるドキュメントは見たことないから仕様かどうかはよくわからん 誰か見たことある人いる? >>790 仕様 cut後もcells()で返ってくるオブジェクトは同じ そういや上書きされるcells()はどうなるのか、と試してみたらnothingになっていた この辺はExcelのカットアンドペーストなどでおなじみだけど、いざやってみると不思議な気分だ Sub foo() i = 2 j = 3 k = "k-" Set before = Cells(3, 3) With Cells(i, j) .Cut .Offset(1, 0) .Value = k End With Debug.Print before.Value End Sub >>799 不思議でも何でもない 変数によるオブジェクト参照の仕組みをもっと正確に理解すべきだろ カットは貼り付け先のセルの削除と貼り付け元のセルの埋め込みを伴う処理だぞ 貼り付けを行った段階で、変数のスタックに格納されていた貼り付け先のセルのポインタが無効になるので、貼り付け後に変数の中身を評価するとNothingになるだけ セルの仕様ではなくオブジェクト参照の仕組みからして当然 しかし、VBAをやり始めたら仕事がはかどるな 面倒くさい勤務表の処理もマクロで一発やからな VBAで劇的に工数削減できるような単価の低そうな仕事をしているのなら、 今の仕事の効率化なんかよりプログラミングに習熟してITエンジニアに転職したほうが金を稼げるのではないだろうか >>803 そのやりかたは? フリーランサーになればたくさん稼げる? 在宅ワークも可? >>803 >>804 ここで回答するのもアレだが VBAは基本的に常駐で保守のゴツイ仕事のみ。仕事自体が少なく稼げない。稼ぐなら別のプログラム言語の方が良い。 在宅の案件は更に無い。ゼロと思ったほうが良い(web業者がついでにAccessのVBAをメンテする、といった事例は聞いたことがある) VBAはマクロ記録も出来るし、やりたいことをちょいググればいくらでもサンプルコード載ってるからね Excel VBA限定の話だろそれ Outlook とかWordとかPPTのVBAだと途端に情報集めの難易度が上がる Access VBAは衰退傾向だし >>789 動作しなくなったの? あらためて試して無いから分からんけど。 >>807 そういうレベルの話してるから安い話になるんじゃないの? ググってすぐどうにかなることなんて殆ど無い。 というかググって答えが見つからないことは多い。 >>811 そんなレベルの低い話はしてないんだがw >>789 というか、それってExcelそのものに対して透明化したいって話? それは某掲示板で話題になってWindows10から出来ないみたいな話を聞いたような。 >>809 正常動作しなくなったのは7の時点だけど、その時はAeroを切ってどうにか切り抜けた。 しかし10はどうしたものかなと。 LWA_ALPHAの方は全く問題ないんだけど。 複数のPCで確認したから、おま環ではないと思う。 >>814 透明化したいのはExcelそのもの。 結構便利なんだよ。 ウインドウを2枚重ねても、奥側のウインドウを操作できるから。 使えなくなったのか 大昔ハマって透明アプリばっかり作ってた記憶 >>817 使えないっていうか、変な動作をするんだよ。 ThisWorkbook.Application.Hwndでハンドル取ってるのに、 なぜか最初に配置したコマンドボタンのキャプションだけが透過するとか。 >>816 透過はするけど透明にならないんだろ。 無理矢理やる方法は思い付いたけど試して無い。 ググったらサンプルコードが見つかるんじゃなかったのか? 初歩的な質問ですみません 標準モジュールとユーザーフォームでプログラムを書いています 1つのモジュール内にプロシージャが沢山あり、読みにくくなってしまいました 本を読むとクラスモジュールでプログラムが読みやすくなると書いてありました どのような時にクラスモジュールを使ったらプログラムは読みやすく出来ますか? サブルーチンやForNext,if等の繰り返し使うものはクラスモジュールを使った方がいいでしょうか? >>824 そんなことをここで聞くような人には無理 >>825 わかりました もっと勉強してきます 失礼しました ぶしつけで恐縮ですが、シート内の改行を一気に削除する方法を教えていただけないでしょうか。 cellsで指定してreplaceメソッドってやってもできないので、誰かよろしくお願い申し上げます。 新しいシート作って改行をl削除したデータをコピーすればいいんじゃないかな Dim R As Range For Each R In ActiveSheet.UsedRange R = Replace(R, vbCr, "") R = Replace(R, vbLf, "") Next あるいは Cells.Replace What:=vbCr, Replacement:="" Cells.Replace What:=vbLf, Replacement:="" >>827 VBAスレなんで余談だけど VBAでやるんなら>>829 手動なら検索窓に「ctrl+J」を入れて全て置換って方法もある いちおう説明 excel内の改行コードはLFが基本らしいんだけど マクロ使ったりでCRLFも入力出来るらしい なのでCRとLFで分けて処理させてみた >>824 クラスモジュールというのはユーザーが独自にメソッドやプロパティ、イベントを定義して使えるオブジェクトのことで、本質的にはユーザーフォームと変わらない設計とコーディングに結構手間がかかる オブジェクト化によるカプセル化がどうしても必要なら試してもいいが、肥大化したモジュールのコードの可読性改善くらいの目的であればやらない方がいいかもしれない クラス内に定義された関数を呼び出すにも、そのクラスの型をもつ変数を宣言してインスタンスを生成してメソッドを呼び出なければならなくなるのでね モジュールがごちゃごちゃして嫌なら、モジュールに記載している関数を機能カテゴリに分類して、各機能カテゴリごとモジュールを分ければいいんじゃないのかな 文字列操作系、メール送信機能系、メッセージダイアログ系、みたいな感じの切り分けで >>833 ありがとうございます おっしゃる通りで今問題なく動くプログラムをわざわざ変える必要は無いですね まずはモジュールを分けるところから始めてみます 今後プログラムを作る際の参考にさせていただきます シートやセルと変数の定義が重複するようなときに一カ所まとめられて便利 >>788 ヒープエリアに展開されるのはその通りだけど VBAにガベージコレクションの概念は無いよ >>837 なにをガベージコレクションと言ってるのかわからんけど、VBAはCOM扱ってるから参照カウンタは使ってるよ まあCOMをVBAの機能と言うかについてはいろんな意見があるだろうけど >>837 参照追跡方式の本当のガベコレは利用できないけどCOM標準の参照カウンタ方式のリソース管理システムはバックグラウンドで使ってるだろ 循環参照が発生してるとリソース解放できないやつね A列の値が「ア行」、B列の値が「あいうえお」のうちどれかであればC列を赤く塗り、 同じく「カ行」で「かきくけこ」のうちどれかであれば青く塗る、というような処理をしたくて 以下のようにしたところ一応うまくいったのですが、 「ア行 and あ」or「ア行 and い」or …… というような複数条件の書き方はこれであっているのでしょうか? If InStr(Range("A2").Value, "ア行") > 0 And InStr(Range("B2").Value, "あ") > 0 Or InStr(Range("B2").Value, "い") > 0 Or InStr(Range("B2").Value, "う") > 0 Or InStr(Range("B2").Value, "え") > 0 Or InStr(Range("B2").Value, "お") > 0 Then Range("C2").Interior.Color = RGB(255, 0, 0) ElseIf InStr(Range("A2").Value, "カ行") > 0 And InStr(Range("B2").Value, "か") > 0 Or InStr(Range("B2").Value, "き") > 0 Or InStr(Range("B2").Value, "く") > 0 Or InStr(Range("B2").Value, "け") > 0 Or InStr(Range("B2").Value, "こ") > 0 Then Range("C2").Interior.Color = RGB(0, 0, 255) >>843 間違ってる AndとORは左側からの計算になるんで false and false or true …がtrueになる Or の連続部分を括弧で囲まないといけない >>843 > 「ア行 and あ」or「ア行 and い」or …… > というような複数条件の書き方はこれであっているのでしょうか? ダメ AndよりOrの方が優先順位が低いので InStr(Range("A2").Value, "ア行") > 0 And InStr(Range("B2").Value, "あ") > 0 Or InStr(Range("B2").Value, "い") > 0 Or InStr(Range("B2").Value, "う") > 0 Or InStr(Range("B2").Value, "え") > 0 Or InStr(Range("B2").Value, "お") > 0 は (InStr(Range("A2").Value, "ア行") > 0 And InStr(Range("B2").Value, "あ") > 0) Or InStr(Range("B2").Value, "い") > 0 Or InStr(Range("B2").Value, "う") > 0 Or InStr(Range("B2").Value, "え") > 0 Or InStr(Range("B2").Value, "お") > 0 のように解釈される なのでA2が "ア行" でなくてもB2が "い" だと成立しちゃう 詳しくは https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/operator-precedence を見て >>843 そもそも > A列の値が「ア行」 と言うなら Range("A2").Value = "ア行" と書けばいい InStr(Range("A2").Value, "ア行") > 0 だとA2が "マレーシア行きのバスはここから出ます" でも成立しちゃうけどそれはいいのか? あらそうだったんですね。ということは InStr(Range("A2").Value, "ア行") > 0 And (InStr(Range("B2").Value, "あ") > 0 Or InStr(Range("B2").Value, "お") > 0) Then という感じにすればいいんでしょうか? >>845 の左順って間違いだったは 変更はそれでOK ああなるほど。文言は固定でかぶってる言葉がなかったので大丈夫だったんだと思います すでにあった文言の組み合わせの違うVBAをいじったもんですからそれを大枠はそれをそのまま 使ったんですけどそう言われればそうですね If Range("A2").Value = "ア行" And (InStr(Range("B2").Value, "あ") > 0 Or InStr(Range("B2").Value, "お") > 0) Then Elseif Range("A2").Value = "カ行" And (InStr(Range("B2").Value, "か") > 0 Or InStr(Range("B2").Value, "こ") > 0) Then こうでしょうか? もいちょい頑張って正規表現使ったらいいんじゃないでしょうか 正規表現だと If Range("A2").Value = "ア行" And (Range("B2").Value Like "[あ, い, う, え, お]" Then これであってますか? >>853 厳密には"[あ-お]"または"[あいうえお]" それだと,でも反応する 簡略化するためにあいうえおを使いましたが、実際は2〜10文字程度の文字列なので、 And (Range("B2").Value Like "東京|大阪|名古屋" Then こうすればいいのかな? 確かにただ | を使っただけでは反応しませんね とりあえずOrいっぱい使って直します、ありがとうございました TestメソッドがTrueを返してきたら処理するって形にすればいい 質問スレなんだから構わないだろ 気に入らないなら無視しとけアホ 他人が作ったマクロなんて読みづらいに決まってんじゃん… 今更グダグダ言ってもあとの祭りさ。 自分が作ったマクロもだぞ 数年前どころか一ヶ月もするとわからなくて四苦八苦することがある プログラミングの実習で教授が言ってたわ 明日の自分は他人だから、いつでも他人が見てもわかるように書けって >>868 昨日の昼飯がなにか?なんて思い出せなくなりました… >>869 ボケがはじまっているのでわ? アルツハイマーだとやっかいですよ >>870 ビタミン剤をしこたま飲んでるんですけど、やっぱりだめですかね… >>867 集中してるとそこまで対処してるか!みたいなのが書ける時があって 後から見てなんでこんなのあるんだ?って思うことがある 同じことやろうと思っても出来なかったり だから自分に対してのコメント必須だわ 昨日の自分は今日の敵 今日の自分は明日の(自分にとっての)敵 >>819 >>832 もうちょっと調べてみたが、 種類に関係なく、最初に配置したオブジェクトだけが透過することがわかった。 しかも、コマンドボタンは常時透過するが、 テキストボックスとラベルは、アクティブになっている時だけ透過するっていう。 だから、どでかいコマンドボタンに特大フォントで■(四角)を書くとか、 本当に無理矢理やろうと思えば出来るんだろうけど、それはちょっとねぇ・・・。 VBAでChromeのタブブラウザを思い通りに操作することってできます? IEのタブブラウザも思い通りに操作する方法も知りたいけど。 Seleniumでもタブ操作は無理だから無理なんじゃねーの Ruby で、Selenium Webdriver を使っているけど、タブ移動は出来る! url_0 = "URL 0" url_1 = "URL 1" driver.navigate.to url_0 # url_0 を開く driver.execute_script( "window.open()" ) # 新しいタブを開く driver.switch_to.window( driver.window_handles.last ) # 新しいタブへ移動する driver.navigate.to url_1 # url_1 を開く all_handles = driver.window_handles # すべてのタブ driver.switch_to.window( all_handles[ 0 ] ) # url_0 へ移動する driver.execute_script( "window.open()" ) # 新しいタブを開く driver.execute_script で、JavaScript のソースコードを書ける >>874 以前の挙動ってセル罫線は見えるけどセル自体は透過して、下への入力が出来るというものだった記憶があるんだけど、そういう動作を望んでるってことだよね。 単純にセル範囲全体、もしくは部分を完全透過するって意味じゃ無いよね。 セル範囲、もしくは部分を完全透過して下へ入力出来るっていうのなら簡単に実現出来ると思う。 試して無いけど。 >>879 そう。 SetLayeredWindowAttributesではなく、違う発想でやるってこと? >>880 SetLayeredWindowAttributesは多分無理だと思う。 使ったことないけどUpdateLayeredWindowも同じかな? この種のAPIは諦めて、リージョン使ってウィンドウの形状をくり抜いた形に変形する方法を使って出来たけど、色指定とかも出来ないし、くり抜いた部分は問答無用で透過する。 当然、罫線も透過する。 それからブックのウィンドウを移動すると元に戻る。 こっちはサブクラスでどうにか出来なかったかな。 くり抜く部分は右端列、下端行の見切れる所を正確に取得するのが面倒くさい。 指定セル範囲なら簡単なんだけど。 元々、無理矢理やろうとしてたのは半透明にしてその描画をメモリに取得してから完全透明にして、デスクトップに取得した描画を書き込むことを考えたけど、再描画で無茶苦茶チラつきそうで断念した。 ググレばサンプルや答えが見つかるとか言ってた奴がいたけど、ググってどうにかなるようなレベルの低いものは、問題にすらならないわけでね。 わざわざ覚えるようなことをしてないだけでググレば答えが見つかるのが分かってるんだよ。 一方、問題になるようなレベルの高いものはググっても答えが見つかることは殆ど無いわけだ。 最近独学ではじめたんだがググっても出ないから質問させてくれ if の条件式をセルから読み取ることできない? 例えば セルA1に1+1=2って入力してあって VBAで if cells(1,1).value then end if 的なことを実行したいんだが・・・ ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる