Excel VBA 質問スレ Part70
■ このスレッドは過去ログ倉庫に格納されています
!extend:checked:vvvvv:1000:512 ↑同じ内容を2行貼り付けるナリ ExcelのVBAに関する質問スレナリ コード書き込みや作成依頼もOKナリ ※前スレ Excel VBA 質問スレ Part69 https://mevius.5ch.net/test/read.cgi/tech/1607786543/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured Private Sub Worksheet_Change(ByVal target As Range) If Intersect(target, Range("A1:A2")) Is Nothing Then Exit Sub End If ClearDates UpdateDates End Sub Sub ClearDates() Range("A4:A999").Clear End Sub Sub UpdateDates() If IsDate(Range("A1").Value) = False Or IsDate(Range("A2").Value) = False Then MsgBox "日付を正しく入力してください" Exit Sub End If Dim d As Date, endDate As Date d = Range("A1").Value endDate = Range("A2").Value Dim y As Long y = 4 Do While d <= Range("A2").Value Cells(y, 1) = d d = d + 1 y = y + 1 Loop End Sub 日付間の日にちが自動で打ちあがるようにしたんですけど めちゃくちゃ重くてパソコンが固まってしまいますご教授ください 素人みたいな質問ですいません。 >>281 Changeイベントをする時は、 処理の前で Application.EnableEvents=False 処理の後で Application.EnableEvents=True が動くようにしないと延々Changeイベントが動いて重くなる >>281 むしろそれでプロだったらびびるけど・・・ Worksheet_Change()はワークシートの内容が変わった時に発火する Worksheet_Change()→ClearDates()→Worksheet_Change()→UpdateDates()→Worksheet_Change()→・・・ 多分無限ループになっている こういう時はイベントを無効にしておけば無限ループにならない Private Sub Worksheet_Change(ByVal target As Range) object.EnableEvents = false '内容 object.EnableEvents = true endsub すまん、Application.EnableEvents = Falseだった上に遅かった すばやい返答ありがとうございます 少し早くてびっくり VBAははじめて2年ぐらいです 5年後ぐらいにプロになれたらいいな Private Sub Worksheet_Change(ByVal target As Range) object.EnableEvents = false 上記を先頭2行と置き換えて object.EnableEvents = true endsub ↑この2行は最終行に書けばいいのですか? 素人ですいません! >>285 直す部分だけ書くと、こう Private Sub Worksheet_Change(ByVal target As Range) Application.EnableEvents = False If Intersect(target, Range("A1:A2")) Is Nothing Then Exit Sub End If ClearDates UpdateDates Application.EnableEvents = True End Sub >>285 ごめーん、object.EnableEvents = false は間違いです >>286 さんが正しいです >>281 それコピペして動かしてみたけど全然重くなかったよ 1900年から今日までにしても4秒くらい これで固まるのは別の原因があると思う その場所以外にとても複雑な計算式があって Cells(y, 1) = d の度に計算して重くなってるとか そうであれば計算を手動に変えて最後に自動にするとか セルじゃなくて配列にdを入れて最後に一回だけ出力するとか UpdateDates()を1行ずつ動かせばどの行で固まってるか分かると思うよ >>290 それはChangeイベントで検証しましたか? >>291 検証しました。 対象セルの書き換えはないから普通は無限ループにならないと思うけど 環境によって何か違うのかな? とにかく一行ずつ動かしてどこで固まるか調べた方がいいと思います。 https://i.imgur.com/8OFf7Pv.jpg B4:E6を画像として出力したいんだけど、Rangeの範囲指定をどういじっても、B3:E6が出力されてしまう。 B4:C6を指定してもB3:E6が出力されてしまう。 どうすればいいの? >>295 thx CurrentRegionとったらあっさり出来たわ。 たまたまググって出てきたサンプルが説明もなくCurrentRegionを使ってて、 それを参考にしたから数時間損したわ。 Name As でExcel以外のJpegファイル等のファイル名を変えることができると思いますが、そもそもなんでEXCELで他のソフトウェアのファイル名変えられるんでしょ? 便利だからいいんですけど >>297 ファイル操作はOSの基本機能の一つだから 逆に制限する方が、作るのも使うのも面倒になってメリットがなさすぎるという設計上の理由 そっか、OSを操作してるんでしたね EXCELもOSも同じメーカーだからこそできる技なんですな 昔のExcelは非公開API使ってたとか噂を聞いたことがある なつかしいなぁ 90年から2000年ぐらいの頃だな あるシートをコピーした時、 「移動またはコピーしようとしている数式またはシートには、移動またはコピー先のワークシートに既にある名前’○○○’が含まれています。この名前を使用しますか?」 が延々と出てくるのがうざいので、 メッセージを出さないようにするマクロって作れますか? 事前に名前の定義から削除するのではなく、シートをコピーしたら、メッセージを出さずに名前の定義を削除したいです。 詳しい方、ご教示をよろしくお願いいたします。 書式設定をコピーしなくて良いなら配列に値を代入して新しいシートに貼り付けが楽じゃない? 書式もって言うなら出力後に書式だけコピーしてやるとか VBAで隠蔽使ってる人はどんな時に使ってますか? ぶっちゃけPropertyGetだけでいい気がしてきてしまったので、適切な使い所を知りたいです >>306 なるほどです! やってみます、ありがとうございます! >>307 二人以上で開発する時、または長期に渡るメンテが必要になりそうな時 >>307 基本privateにしておいたほうが色々とトラブルが少ないけど、 特に不満を感じてないならpublicでもどっちでも同じだと思う privateで意味が出てくるのは大規模・多人数開発だ >>307 メッセージングを行う際にて不必要と思われるメソッド(関数)や変数、プロパティは隠蔽する。 いや? そもそも変数はプロパティかメソッド(関数)の引数や戻り値でしか受け渡ししないから変数は隠蔽しないことは無いか >>307 ぶっちゃけPropertyGetだけでいいです、他のことはやらなくていいです 変数を隠蔽しておけばgetter・setterを必ず通るからそこさえ監視しておけば後を追える 変数丸出しだとどこから触られるかわからないのでデバッグが死ぬほど大変になる みんなが使うのはパブリック 自分だけで使いたいときはプライベート XとかY,Zなんかはプライベートにしましょう たんじゅんに プライベートなら3文字以下 パブリックは5文字以上 そう決めておけばよいよ 人の書いたコードなんて読めない 自分で書いても1ヶ月後には読めない >>318 人が書いたコードは兎も角 自分の書いたコードが読めないのはちょっとね 上からつらつらと書くんじゃなくて 小さな部品から作って 組み合わせて大きな部品を作って 更に組み合わせて・・・みたいに書くと 分かり易いコードを書けるよ 逆に誰が読んでも分かり易いコードが 書けるようになったらもうすぐVBA卒業だよ 現場のためにマクロ作ってて 性能確認は現場に投げてるけど どういう処理をしてるとか一切考慮してなくて正常な処理をバグ言われてちょっと辛い わかる人いる? すごく突っ込みたいけどかなーり年上のおじいちゃんばっかでちょっと言いづらかったり ありがとう、ちょっと楽になった 明日ガツンと言ってやる(笑) >>321 わからんな コミュニケーション不足なだけだろ 正常な処理なら伝えりゃいいだけだろ MsgBox出すなり、シートに書いとくなり、口で言うなりして わからんものを説明するときは5w1hでよいから 聞いているほうも分かった気になる エラーメッセージ出そうが絵本みたいなマニュアル作ろうが「ちゃんと動かないぞ!ポンコツめ!」って騒ぐオヤジがおる。んでよくよく聞いてみたらメッセージは読まずに閉じるわマニュアルは開くことすらしてねぇわ日付入力しろって書いてある項目に「多分5/10」とか書いてくれちゃうわであぁ何やっても無駄な時は無駄なんだなぁってなった事が何度もある >>327 直接お客さんとやり取りしてるの? そうで無ければ上司か島のリーダーさんに 中間に入ってもらえば? もし直接お客さんとやり取りしているなら そもそもプログラマーとお客さんが 窓口も介さず直接やり取りを行う 形態自体に問題があると思うけど リーダーさんとか上司に相談するべき もっとも、自分がその窓口ですと言うのなら 最初っからどこをどうして欲しいか よーく聞いてから作る方がいい。 どうせ用件定義書なんて存在して いないんでしょ? おいおい、エクセルのマクロぐらいで定義書はつくらんだろ ふつうはマクロができてからしようが決まるから 年配のジジイ騙して金取れるなら今の体制維持も考慮すべき >>328 上司に頼まれて作った子会社の人達の作業進捗を確認する為のスケジュール管理ツールなんだ 今まで手書きでやってたのを電子化したかったんだと 要求仕様の箇条書きを渡されて好きに作っていいって言われたから仕様書とかコーディング規約とか諸々自分で用意した まぁ流石に向こうの課長さんから当事者のおっちゃんに雷落ちたらしいが >>330 流石に動作前に入力のエラーチェックはかけてるさ それでlsDateでチェックして日付じゃなけりゃ処理を停止して「No.〇〇の工程の開始予定日が日付じゃねぇから書き直せ」って類のメッセージ出してるんだがメッセージ読んでねぇから「マトモに動かないポンコツツール」って喚き散らしてたんよ 中抜きの現場をそのまま見ているような 人の入力チェックはけっこうノウハウいるのね >>332 なるほど大体状況は理解出来た まぁボロくそに言ってたおっちゃんもおっちゃんだけど、果たして君の作ったツールは 今まで手書きでやってた人がいきなりパソコン使って打ち込めるような優しい設計になっていたのかな? 下請けでしかもスケジューラー作成なんて自由度の高いものを上司が君に振ったのはひょっとしたらその辺の事も兼ねて 君が今回それを通してどんなことを学ぶかを見ていた可能性があるね。 そのおっちゃんはボロくそに言ったかも知れないけどそれが現場で作業している人の正直な意見であることには間違いないよ。厳しいかも知れないけどね。 まあVBAじゃなくとも自分が便利だと思っている価値観を人に理解してもらうのは難しい >>329 仕様書はどういう形式で作るかによる マクロも仕様書に載せるとルール付けしたら必要になる 自分の給料がどこから来るのかを考えれば適当な対応はできないとおもうが VBAでは非0は真として扱われるということでいいですか? ごめんなさい回りくどい質問せずに 直球で質問すると if instr(str1,str2)>0 then の>0って要らなくないか?ってことです >>345 やめとけ。まずInstrで何が返ってくるのか確認するんだ http://officetanaka.net/excel/vba/function/instr.htm NULLが入って来ることもあるからLEN関数で囲む感じになるのか? どちらにしても可読性が落ちるようなものやトリッキーなことはなるべく避けた方がいい そんなこと全般に渡ってやってたら 1月後には自分が作ったソースが読めなくなるぞ うむ 理系のひとはなんでも yes/Noで考えががちだけと そういう論理式はむつかしい 現実にはyes/No/無回答 /cancelの4値だから それに否定<>もあまり多用しないほうがよい A<>false or B<>false or C<>false こういうのわけわからんから IF A=true and B=true and C=true then else ××××××× ENDIF こうしておく、終電に間に合うぞ >>347 演算子や論理式は、何を判定したいかに合わせて使い分けろ そしてコメントを書け VBAでは問題ないのだろうけど、TRUE をイコールで判定するのはどうも… ありがとうございます 素直に省略せずに比較演算子を使うことにします >>350 そうだね まぁそういうときによく話に上がるコードだけども Dim A As Boolean Dim B As Boolean Dim C As Boolean A = False B = False C = False A = B = C こんなコードがあったとして VBAではこれはエラーにならない 慣れてる人ならAにTrueが入ることが すぐ分かるけど 慣れていない人はAにFalseが入ると 思ってしまうこともある 単純な式だから「そんなバカいねーよ」と 思うかも知れないけど これを複雑な式に混ぜられた場合を考えると 結構キツいことになったりもするよ 話の主旨が分からん 代入じゃないんだから「==」にしたいって話? それならBooleanは関係ないよな… >>354 すまん。 最初Integerで書こうかなとも思ったんだけど それだと本当にエラーにならないか自信がなかったんだ。 手前側のイコールが代入で後ろのイコールが比較演算子だから他の言語だと A = B == C; みたいな書き方になったりするのかな ただVBAではどっちもイコールひとつで分かり辛いから、その辺ちゃんと分かるように書いた方がいいよと言うのが話の趣旨だね それは文法の話であって論理(式)の話ではないな 途中で混ざってすり変わってる a=b=cがすべて代入になる言語もあるからややこしいって話だと思うけど 手を抜かずに式を分けたりカッコを付ければいいだけ コメントを書いたり変数名をわかりやすくするのと同列で、ミスを減らす工夫はプログラマーの義務 すべて代入したい時 b=c a=b 比較したい時 a=(b=c) プログラム上の論理式は2値論理がほとんどだから じっさいは仕様によっていくらでも沢山あるからあるから そういうのは丁寧にコメントをいくしかない 僕が言ったのは次のようなことです VBAでいうと、True は -1 だが Dim i As Long i = 123 If i = True Then はイコールと評価される 内部的には CBool(i) = True と評価されているのだと思う C言語では TRUE は 1 と定義されていて、 int i = 123: if (i == TRUE) { では i を暗黙裡に論理型に変換しないので、イコールと評価されない(非0が真である直感に反する) ということでした(123 と 1 を愚直に比較する) FALSE は 0 と定義されていて、これは比較に用いてもよい >>359 > 比較したい時 > a=(b=c) それは… > a=b=cがすべて代入になる言語 だと、結局代入になるからあまり意味はないよ a = b = c = 0 で、a、b、c すべてに 0 を代入したいとか >>363 それで合ってるよ ちなみに-1なのは変数の内容を ビットとして見たとき全て立っていると 言うことの名残りだって 昔このスレの誰かが言ってた もっとも今内部的にPコードで ビットがどれか立っていればって 判断しているかは知らんけど VBやVBAだと0だけがfalse、それ以外はみんなtrueとみなされる たとえば a = 100 If a Then だとaはtrueになってIfの中が実行される 2値論理はむかし60年から70年台のワイヤーロジック時代にもて囃されたけど もう令和なんだし、古すぎるよね 80歳のおじいさんならともかく 若い人は使わないようにしましょ リレーやSWを組み合わせてコンピュータをつくろう そんなチャレンジャーはいるかな Falseが0とかいうのは正確には正しくない Falseを数値として評価すると0というのが正しくて 暗黙の変換を無視して話すとおかしなことになるぞ Trueが0以外というのはもっと間違ってて Trueは数値として評価すると-1 0以外の数値をBooleanとして評価するとTrueというのが正しい 型にゆるいというBASICの伝統を引き継いで暗黙の変換って仕様があるせいなんだが まあ今更その仕様にどうこう言ってもなぁ 結局のところ3ヶ月後の自分がコードの理解ができるかどうかってところよね VBAで書くようなコードは変数名をちゃんと書いておけば大体問題ないよ 質問しにくる人のコード見ると、aみたいな意味のない変数名や省略してたりするのが多いんで・・・ VBAってプログラミングの入口になる事が多いので、 妙な向上心から変なテク(特に処理速度関係)を導入しがちだけど、 バカみたいに基本に忠実かつ丁寧にするのがいいと思います。 >>372 w 仕事で使わされてる「しすてむ」のvba部分のソース開いたらまさに If c = r/2 then cc = r/2 rr = r/4 End If みたいな感じで、しかもノーコメントだったわ。何してるルーチンなのかも 説明なくて読む気になれなかった。 色々なデータを引っ張ってきて、加工してピボット作って集計して・・・結局使ってねー! ってコードを見た時はずっこけた 改修前になにかで使ってたのかもしれないけど 配列を引数にしたときに関数側でVariant()で受け取れないのは何故? Variantカッコなしなら問題ないんだけど理屈が分からない >>370 いいね、 他人がつくったやつを動かんから直してくれ、のほうが多いもんな でも、直してくれというのはユーザーが居るのだから需要は確実だよな 俺は嫌い 大体人のもの直せって話が降ってくるときは 他の人が見た後で、ぐっちゃぐちゃで どんだけスパゲティが好きなんだよ、 お前はこの関数に何をやらせたかったんだよ! みたいのばっかり そして大概作り直した方が早い ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる