X



Excel VBA 質問スレ Part70
■ このスレッドは過去ログ倉庫に格納されています
0283デフォルトの名無しさん (ワッチョイ 9f68-1iXq)
垢版 |
2021/04/18(日) 10:09:19.29ID:a83COmqy0
>>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
0284デフォルトの名無しさん (ワッチョイ 9f68-1iXq)
垢版 |
2021/04/18(日) 10:09:41.04ID:a83COmqy0
すまん、Application.EnableEvents = Falseだった上に遅かった
0285デフォルトの名無しさん (ワッチョイ 9ff0-B9Cj)
垢版 |
2021/04/18(日) 10:53:16.67ID:AhVY6Zxk0
すばやい返答ありがとうございます
少し早くてびっくり

VBAははじめて2年ぐらいです
5年後ぐらいにプロになれたらいいな

Private Sub Worksheet_Change(ByVal target As Range)
object.EnableEvents = false
上記を先頭2行と置き換えて

object.EnableEvents = true
endsub
↑この2行は最終行に書けばいいのですか?

素人ですいません!
0286デフォルトの名無しさん (JP 0Hbb-tdH6)
垢版 |
2021/04/18(日) 11:21:49.65ID:JCpiu5BAH
>>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
0287デフォルトの名無しさん (ワッチョイ b768-1iXq)
垢版 |
2021/04/18(日) 12:11:13.84ID:ORj5XeNB0
>>285
ごめーん、object.EnableEvents = false  は間違いです
>>286さんが正しいです
0288デフォルトの名無しさん (ワッチョイ 9ff0-B9Cj)
垢版 |
2021/04/18(日) 14:57:21.70ID:AhVY6Zxk0
先生たちありがとうございます!
新設丁寧頭もいい
0289デフォルトの名無しさん (ワッチョイ 9ff0-B9Cj)
垢版 |
2021/04/18(日) 14:58:49.68ID:AhVY6Zxk0
自分の力で解決できるようにがんばります!
0290デフォルトの名無しさん (ワッチョイ 7701-ubdj)
垢版 |
2021/04/18(日) 16:07:16.06ID:c/Nu40gb0
>>281
それコピペして動かしてみたけど全然重くなかったよ
1900年から今日までにしても4秒くらい
これで固まるのは別の原因があると思う

その場所以外にとても複雑な計算式があって
Cells(y, 1) = d の度に計算して重くなってるとか

そうであれば計算を手動に変えて最後に自動にするとか
セルじゃなくて配列にdを入れて最後に一回だけ出力するとか

UpdateDates()を1行ずつ動かせばどの行で固まってるか分かると思うよ
0293デフォルトの名無しさん (ワッチョイ 7701-ubdj)
垢版 |
2021/04/18(日) 20:47:27.38ID:c/Nu40gb0
>>291
検証しました。
対象セルの書き換えはないから普通は無限ループにならないと思うけど
環境によって何か違うのかな?

とにかく一行ずつ動かしてどこで固まるか調べた方がいいと思います。
0297デフォルトの名無しさん (ワッチョイ bf7c-mkHL)
垢版 |
2021/04/19(月) 10:20:37.00ID:gkbaJTWH0
Name As でExcel以外のJpegファイル等のファイル名を変えることができると思いますが、そもそもなんでEXCELで他のソフトウェアのファイル名変えられるんでしょ?
便利だからいいんですけど
0298デフォルトの名無しさん (JP 0Hbb-tdH6)
垢版 |
2021/04/19(月) 10:27:18.04ID:BhG1xyLeH
>>297
ファイル操作はOSの基本機能の一つだから
逆に制限する方が、作るのも使うのも面倒になってメリットがなさすぎるという設計上の理由
0300デフォルトの名無しさん (ワッチョイ 778e-u7Bp)
垢版 |
2021/04/19(月) 21:03:08.15ID:K5RFczke0
>>299
馬鹿?
0301デフォルトの名無しさん (ワンミングク MM7f-wYoi)
垢版 |
2021/04/19(月) 21:19:11.87ID:80cIHSk1M
>>299
知能に問題がある人かな
0305デフォルトの名無しさん (ワッチョイ 9f90-ubdj)
垢版 |
2021/04/20(火) 00:42:55.05ID:LQ8i77JG0
あるシートをコピーした時、
「移動またはコピーしようとしている数式またはシートには、移動またはコピー先のワークシートに既にある名前’○○○’が含まれています。この名前を使用しますか?」
が延々と出てくるのがうざいので、
メッセージを出さないようにするマクロって作れますか?

事前に名前の定義から削除するのではなく、シートをコピーしたら、メッセージを出さずに名前の定義を削除したいです。
詳しい方、ご教示をよろしくお願いいたします。
0310デフォルトの名無しさん (ワッチョイ b768-1iXq)
垢版 |
2021/04/20(火) 07:29:11.43ID:aQV8TqKv0
>>307
基本privateにしておいたほうが色々とトラブルが少ないけど、
特に不満を感じてないならpublicでもどっちでも同じだと思う

privateで意味が出てくるのは大規模・多人数開発だ
0314デフォルトの名無しさん (ワッチョイ b768-1iXq)
垢版 |
2021/04/20(火) 18:45:51.60ID:aQV8TqKv0
変数を隠蔽しておけばgetter・setterを必ず通るからそこさえ監視しておけば後を追える
変数丸出しだとどこから触られるかわからないのでデバッグが死ぬほど大変になる
0319デフォルトの名無しさん (ワッチョイ 9f4f-Xji8)
垢版 |
2021/04/20(火) 21:32:16.88ID:N2s7rCY20
>>318
人が書いたコードは兎も角
自分の書いたコードが読めないのはちょっとね

上からつらつらと書くんじゃなくて
小さな部品から作って
組み合わせて大きな部品を作って
更に組み合わせて・・・みたいに書くと
分かり易いコードを書けるよ

逆に誰が読んでも分かり易いコードが
書けるようになったらもうすぐVBA卒業だよ
0321デフォルトの名無しさん (ワッチョイ ffb3-pj+b)
垢版 |
2021/04/21(水) 00:03:03.35ID:VYKRrHWq0
現場のためにマクロ作ってて
性能確認は現場に投げてるけど
どういう処理をしてるとか一切考慮してなくて正常な処理をバグ言われてちょっと辛い
わかる人いる?
0322デフォルトの名無しさん (ワッチョイ 778e-u7Bp)
垢版 |
2021/04/21(水) 00:28:41.53ID:mZ1GtAH60
わかる。仕様も確定できない馬鹿だと。
0327デフォルトの名無しさん (ブーイモ MMbb-B9Iy)
垢版 |
2021/04/21(水) 12:00:56.40ID:TWzI1JIsM
エラーメッセージ出そうが絵本みたいなマニュアル作ろうが「ちゃんと動かないぞ!ポンコツめ!」って騒ぐオヤジがおる。んでよくよく聞いてみたらメッセージは読まずに閉じるわマニュアルは開くことすらしてねぇわ日付入力しろって書いてある項目に「多分5/10」とか書いてくれちゃうわであぁ何やっても無駄な時は無駄なんだなぁってなった事が何度もある
0328デフォルトの名無しさん (ワッチョイ 9f4f-Xji8)
垢版 |
2021/04/21(水) 12:37:02.29ID:BXHy+8up0
>>327
直接お客さんとやり取りしてるの?
そうで無ければ上司か島のリーダーさんに
中間に入ってもらえば?

もし直接お客さんとやり取りしているなら
そもそもプログラマーとお客さんが
窓口も介さず直接やり取りを行う
形態自体に問題があると思うけど
リーダーさんとか上司に相談するべき

もっとも、自分がその窓口ですと言うのなら
最初っからどこをどうして欲しいか
よーく聞いてから作る方がいい。
どうせ用件定義書なんて存在して
いないんでしょ?
0332デフォルトの名無しさん (ブーイモ MMcf-B9Iy)
垢版 |
2021/04/21(水) 18:25:58.81ID:2kwhHx0qM
>>328
上司に頼まれて作った子会社の人達の作業進捗を確認する為のスケジュール管理ツールなんだ
今まで手書きでやってたのを電子化したかったんだと
要求仕様の箇条書きを渡されて好きに作っていいって言われたから仕様書とかコーディング規約とか諸々自分で用意した
まぁ流石に向こうの課長さんから当事者のおっちゃんに雷落ちたらしいが

>>330
流石に動作前に入力のエラーチェックはかけてるさ
それでlsDateでチェックして日付じゃなけりゃ処理を停止して「No.〇〇の工程の開始予定日が日付じゃねぇから書き直せ」って類のメッセージ出してるんだがメッセージ読んでねぇから「マトモに動かないポンコツツール」って喚き散らしてたんよ
0336デフォルトの名無しさん (ワッチョイ 778e-u7Bp)
垢版 |
2021/04/21(水) 20:18:22.64ID:mZ1GtAH60
>>332
やっぱり馬鹿か
0337デフォルトの名無しさん (ワッチョイ 9f4f-Xji8)
垢版 |
2021/04/21(水) 21:08:21.14ID:BXHy+8up0
>>332
なるほど大体状況は理解出来た
まぁボロくそに言ってたおっちゃんもおっちゃんだけど、果たして君の作ったツールは
今まで手書きでやってた人がいきなりパソコン使って打ち込めるような優しい設計になっていたのかな?

下請けでしかもスケジューラー作成なんて自由度の高いものを上司が君に振ったのはひょっとしたらその辺の事も兼ねて
君が今回それを通してどんなことを学ぶかを見ていた可能性があるね。

そのおっちゃんはボロくそに言ったかも知れないけどそれが現場で作業している人の正直な意見であることには間違いないよ。厳しいかも知れないけどね。
0346デフォルトの名無しさん (ワッチョイ 9f4f-Xji8)
垢版 |
2021/04/22(木) 18:47:47.49ID:aG329xgw0
>>345
やめとけ。まずInstrで何が返ってくるのか確認するんだ
http://officetanaka.net/excel/vba/function/instr.htm

NULLが入って来ることもあるからLEN関数で囲む感じになるのか?
どちらにしても可読性が落ちるようなものやトリッキーなことはなるべく避けた方がいい
そんなこと全般に渡ってやってたら
1月後には自分が作ったソースが読めなくなるぞ
0347デフォルトの名無しさん (アウアウウー Sa1b-jxZb)
垢版 |
2021/04/22(木) 19:10:26.59ID:+FKRqhM4a
うむ
理系のひとはなんでも 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
こうしておく、終電に間に合うぞ
0353デフォルトの名無しさん (ワッチョイ f64f-Opq7)
垢版 |
2021/04/23(金) 04:16:22.24ID:IAv7U8Ah0
>>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が入ると
思ってしまうこともある

単純な式だから「そんなバカいねーよ」と
思うかも知れないけど
これを複雑な式に混ぜられた場合を考えると
結構キツいことになったりもするよ
0356デフォルトの名無しさん (ワッチョイ f64f-Opq7)
垢版 |
2021/04/23(金) 05:51:27.06ID:IAv7U8Ah0
手前側のイコールが代入で後ろのイコールが比較演算子だから他の言語だと
A = B == C;
みたいな書き方になったりするのかな
ただVBAではどっちもイコールひとつで分かり辛いから、その辺ちゃんと分かるように書いた方がいいよと言うのが話の趣旨だね
0359デフォルトの名無しさん (JP 0H98-On6t)
垢版 |
2021/04/23(金) 06:40:22.74ID:TaQs1RgsH
a=b=cがすべて代入になる言語もあるからややこしいって話だと思うけど
手を抜かずに式を分けたりカッコを付ければいいだけ
コメントを書いたり変数名をわかりやすくするのと同列で、ミスを減らす工夫はプログラマーの義務
すべて代入したい時
b=c
a=b
比較したい時
a=(b=c)
0361350 (アウアウウー Sa83-jiG2)
垢版 |
2021/04/23(金) 09:30:59.30ID:fSz9RP/oa
僕が言ったのは次のようなことです

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 と定義されていて、これは比較に用いてもよい
0365デフォルトの名無しさん (ワッチョイ f64f-Opq7)
垢版 |
2021/04/23(金) 09:46:20.67ID:IAv7U8Ah0
>>363
それで合ってるよ
ちなみに-1なのは変数の内容を
ビットとして見たとき全て立っていると
言うことの名残りだって
昔このスレの誰かが言ってた

もっとも今内部的にPコードで
ビットがどれか立っていればって
判断しているかは知らんけど
0366デフォルトの名無しさん (JP 0H98-On6t)
垢版 |
2021/04/23(金) 09:48:01.57ID:TaQs1RgsH
VBやVBAだと0だけがfalse、それ以外はみんなtrueとみなされる
たとえば
a = 100
If a Then
だとaはtrueになってIfの中が実行される
0367デフォルトの名無しさん (アウアウウー Sab5-4hJQ)
垢版 |
2021/04/23(金) 12:40:15.83ID:F+E5VVCoa
2値論理はむかし60年から70年台のワイヤーロジック時代にもて囃されたけど
もう令和なんだし、古すぎるよね
80歳のおじいさんならともかく
若い人は使わないようにしましょ
0369デフォルトの名無しさん (ワッチョイ 412f-1bRV)
垢版 |
2021/04/23(金) 14:08:52.13ID:tTrKrHtH0
Falseが0とかいうのは正確には正しくない
Falseを数値として評価すると0というのが正しくて
暗黙の変換を無視して話すとおかしなことになるぞ

Trueが0以外というのはもっと間違ってて
Trueは数値として評価すると-1
0以外の数値をBooleanとして評価するとTrueというのが正しい

型にゆるいというBASICの伝統を引き継いで暗黙の変換って仕様があるせいなんだが
まあ今更その仕様にどうこう言ってもなぁ
0372デフォルトの名無しさん (ワッチョイ b701-Bsub)
垢版 |
2021/04/23(金) 21:55:04.78ID:TCRfyG2B0
VBAで書くようなコードは変数名をちゃんと書いておけば大体問題ないよ
質問しにくる人のコード見ると、aみたいな意味のない変数名や省略してたりするのが多いんで・・・

VBAってプログラミングの入口になる事が多いので、
妙な向上心から変なテク(特に処理速度関係)を導入しがちだけど、
バカみたいに基本に忠実かつ丁寧にするのがいいと思います。
0374デフォルトの名無しさん (ワッチョイ a68f-On6t)
垢版 |
2021/04/23(金) 22:02:08.91ID:g1z9C06A0
>>372



仕事で使わされてる「しすてむ」のvba部分のソース開いたらまさに

If c = r/2 then
cc = r/2
rr = r/4
End If

みたいな感じで、しかもノーコメントだったわ。何してるルーチンなのかも
説明なくて読む気になれなかった。
0375デフォルトの名無しさん (ワッチョイ a868-8KU9)
垢版 |
2021/04/23(金) 22:29:27.77ID:lNHxMJRv0
色々なデータを引っ張ってきて、加工してピボット作って集計して・・・結局使ってねー!
ってコードを見た時はずっこけた
改修前になにかで使ってたのかもしれないけど
0380デフォルトの名無しさん (ワッチョイ f64f-Opq7)
垢版 |
2021/04/24(土) 08:59:02.95ID:hh64S9E70
俺は嫌い
大体人のもの直せって話が降ってくるときは
他の人が見た後で、ぐっちゃぐちゃで
どんだけスパゲティが好きなんだよ、
お前はこの関数に何をやらせたかったんだよ!
みたいのばっかり

そして大概作り直した方が早い
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況