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 >>774 教えてよ知ってるなら質問してたからこれも 実際に正常終了する前提ならset RE = nothingしなくてもメモリリーク起きないのか知りたい >>777 やるけど"VBScript.RegExp"の占有領域はスタックかどうかだけ教えて欲しい スタックメモリだと思ってるんだけど >>779 いやここVBA質問スレだよね? その姿勢は本分を果たしてなくないか アインシュタイン「6歳の子供に説明できなければ、理解したとは言えない。」 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 集中してるとそこまで対処してるか!みたいなのが書ける時があって 後から見てなんでこんなのあるんだ?って思うことがある 同じことやろうと思っても出来なかったり だから自分に対してのコメント必須だわ 昨日の自分は今日の敵 今日の自分は明日の(自分にとっての)敵 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる