Excel VBA 質問スレ Part52

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2018/01/27(土) 20:25:05.67ID:Xe+uGT7T
スレ立ての際は一行目に
!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 VBA 質問スレ Part51
http://mevius.2ch.net/test/read.cgi/tech/1510107990/
2018/01/28(日) 00:06:37.18ID:tSF66yjC
>>17
定義もわからんでバカにするってどう言うことなのかよくわからんわ
メゾット君本人でもなけりゃなんも気にならないと思うんだけど
とにかく、そこはわかってないということはわかったからそれ以上興味ないわ
2018/01/28(日) 00:07:58.80ID:mZQyM07n
いや、メゾット君はVBAのコードを読み書き出来ないんだから、このスレでは初歩的な事を聞いてくる初心者より下位やぞ
20デフォルトの名無しさん
垢版 |
2018/01/28(日) 00:12:08.48ID:BSlLksGg
>>18
そりゃキミがバカなんだからわかるわけないよバカさんw
面白い事言うね!さすがバカさんw
2018/01/28(日) 00:13:56.37ID:tSF66yjC
>>20
具体的に
22デフォルトの名無しさん
垢版 |
2018/01/28(日) 00:18:17.28ID:8+IXgyMg
>>21
むしろキミが具体的にキミ自身がバカだと考える理由を説明してくれよバカさんw
ボクはキミの自己紹介を尊重してるだけだよバカさんw
2018/01/28(日) 00:22:13.43ID:NUwCXosq
>>5
ほならね理論で草
2018/01/28(日) 00:26:24.39ID:tSF66yjC
>>22
それはその時のレスそのままの意味だよ
2018/01/28(日) 12:43:11.93ID:iOPSu+uz
メゾット君1とはなんぞや
26デフォルトの名無しさん
垢版 |
2018/01/28(日) 13:52:51.41ID:8+IXgyMg
無能の>>1のことなんじゃね?しらんけど
2018/01/28(日) 14:14:41.52ID:XZzu/jLR
ここまで何の技術も質問も無い件
2018/01/28(日) 16:29:29.49ID:mZQyM07n
>>25
メゾット君とはプログラミングについての知識が一切無いにも関わらず、このスレに三年ほど前から張り付いていて、
具体性の無い罵詈雑言をレスし続けている名無しの一人

Methodの読み方が分からず「メゾット」と呼んだ事が名称の由来
まともな社会経験が無い為なのか、実用性が極端に薄い独特な思考法で会話をしようとする為、
回線を三つほど使い回して自演している時でも本人と特定出来てしまう

偶然映り込むよう装ってロレックスの腕時計を見せびらかすように写メに撮ってみたり(映り込み方は非常に不自然)、
プログラミングの本を読んで「変数」という概念の存在を数時間で認知できたことを褒めて欲しいと再三強調したり、
どうも虚栄心が異様に強い傾向にあるらしいが、現実では満たされない為に、このスレで他人を罵倒して鬱憤を晴らしてる様だ

平日の日中は反応が無い事が多いので労働に従事しているらしい事が見受けられるが、
中古と思われる書籍しか購入していないなど、知識に対する評価が低い点から見て、社会的地位が低い仕事だと思われる

メゾット君であるかどうかに関わらず、具体的な指摘、コードの付与がないレスはスルーする事をお勧めする
29デフォルトの名無しさん
垢版 |
2018/01/28(日) 17:09:44.50ID:8+IXgyMg
あれ?レス番飛んでるけどメゾット君何かレスしたの?
2018/01/28(日) 18:08:50.22ID:xEeIgRKG
スレ保守のついでに相手してやったのよ
以後はスルーするつもり
2018/01/30(火) 03:46:22.71ID:kllVg4gx
2点質問いいでしょうか
1.下記コードのコメントアウトで挟んだ部分の実行時間を短縮したいのですが何かいい方法はありますか?
やりたいことは各セルに@区切りで3つのランダムな数字が入った状態から、その3つの数字で入力規則のドロップダウンリスト作成→1つ目選択です(実際は1万セル前後あります)
2.複数回実行した時にかかる時間が増えていくのは何故でしょうか?
Excel2016です、よろしくお願いします

Option Explicit

Dim i As Long, start As Long, num As String, area As Variant

Sub test()

start = Timer
area = Range("B3:B5003")
For i = 1 To UBound(area)
area(i, 1) = Int(Rnd * 1000) & "@" & Int(Rnd * 1000) & "@" & Int(Rnd * 1000)
Next i
Range("B3:B5003") = area
'//////////
For i = 3 To 5003
num = Replace(Range("B" & i), "@", ",")
With Range("B" & i).Validation
.Delete
.Add Type: = xlValidateList, _
Formula1: = Replace(Range("B" & i), "@", ",")
End With
Range("B" & i) = Split(num, ",")(0)
Next i
'//////////
Range("D3") = Round(Timer - start, 2) & " 秒"

End Sub
2018/01/30(火) 07:48:44.61ID:gBU+LQhN
>>31
いちいちセルからデータを持ってこない
何度も同じ処理をしない

'//////////
area = Range("B3:B5003")
For i = 3 To 5003
num = Replace(area(i - 2, 1) , "@", ",")
With Range("B" & i).Validation
.Delete
.Add Type: = xlValidateList, _
Formula1: = num
End With
area(i - 2, 1) = Split(num, ",")(0)
Next i
Range("B3:B5003") = area
'//////////
2018/01/30(火) 08:10:08.93ID:R3oCXQqF
どうでもいいけど、セルのインデックスを文字列で指定するのは明らかにスマートじゃない気がする
確かcellsの方が多少速度早いんじゃなかったか
2018/01/30(火) 08:27:38.31ID:aDcByURH
B列固定でとりあえず動作すりゃいいってのならどっちでもいいんじゃない。
将来的に変更可能性あるなら別だけど
2018/01/30(火) 12:45:58.02ID:vLC2w8Bp
>>34
ま、好き好きなんだけどね
自分がこのプログラム引き継いだら書き直すなって思う
2018/01/30(火) 14:45:24.44ID:kllVg4gx
>>32-33
修正しました、ありがとうございます

質問2の複数回実行した時にかかる時間が増えていくのは何故でしょうか?
2018/01/30(火) 15:19:01.11ID:5GO1HuBo
>>36
実行毎にどんどん加算されていくんなら、なんかキャッシュしたまま離してないんじゃないの。
マクロの終わりにEndステートメント使ってみて改善するかどうかだね。
2018/01/30(火) 16:11:27.88ID:kllVg4gx
>>37
最後を
Range("D3") = Round(Timer - start, 2) & " 秒"
End '←追加
End Sub
にしたら加算されなくなりました
新規の列だとならなかったので作成したドロップダウンリストの何かが残ってるのかなと思ってたのですがEndは今回初めて知りました

みなさんありがとうございました
2018/01/30(火) 16:16:06.37ID:kllVg4gx
すみません、こっちでした
Cells(4, 4) = Round(Timer - start, 2) & " 秒"
End
End Sub
2018/01/30(火) 17:49:35.13ID:2erBHUms
たぶん変数をモジュールレベルで宣言してるからじゃないのこれ
プロシージャ内に宣言して不都合なことある?
2018/01/31(水) 01:14:12.85ID:3K34O5TZ
>>33AやBなら列番号のでもイイかと思うけど
列が多くて256列目にとかなってくると
セルよりrangeで文字の方が追っかけ易いよ
42デフォルトの名無しさん
垢版 |
2018/01/31(水) 01:42:08.16
なるほど、マクロの最後にはおまじないとしてEndを書いといたほうがいいのか
2018/01/31(水) 07:52:17.18ID:1/FNqCDn
>>40
それだな。
プロシージャ内ならENDは要らないと思う。
END使うのは個人的にスマートじゃなくて嫌。止むを得ず止めたい処理にだけ使うけど。
2018/01/31(水) 07:55:30.29ID:1/FNqCDn
訂正、スマートってよりは場当たり的って感じで嫌
2018/01/31(水) 08:12:45.84ID:bjoCXrds
>>42
普通にコーディングしてたらそんな必要はない
2018/01/31(水) 08:20:37.67ID:bjoCXrds
>>41
列をループさせないかつ列名がついてないような表なら無しではないかもしれないね
列名ついてるならEnumなりユーザー定義型なりで名前つけてやるべきだろうと思うが
引数に文字列の結合式を書くことが個人的にはすごく気持ち悪いけどまあそれは人それぞれかもしれないね
2018/01/31(水) 08:23:10.53ID:1/FNqCDn
あとモジュールレベルの変数名はiとか他でも使うような名前にしない方がいいぞ。
他で使っちゃってたりして予期せぬエラーの原因になる。
48デフォルトの名無しさん
垢版 |
2018/01/31(水) 10:32:40.89ID:y6ZUdqMb
ここで質問するか微妙ですが質問します。
エクセル起動すると
1004エラーmacrooptionsのエラーが出ます
スタートメニューのすべてのプログラムからエクセルを起動しても同様のエラーがでます
オフィスを再インストールしても同様エラーが出るのですが解決策ないでしょうか?
2018/01/31(水) 11:59:35.68ID:sVXcwb3a
他のバージョンのOffice製品が混在していないか
インストールされたプログラムで「修復」を試みたか
MSの fix it も試してみるべき
2018/01/31(水) 12:12:55.39ID:QBWxlyAw
>>47
さらに言えば、モジュール変数はm,グローバル変数はgを先頭に付けたほうが保守しやすい(俺は)
2018/01/31(水) 12:38:18.79ID:/yXosPjR
>>50
え・・・
グローバル変数使ってるの?
2018/01/31(水) 13:51:36.51ID:NL/gtaqq
モジュール変数なら許せてグローバル変数が許せない、ということではないよな?
2018/01/31(水) 14:08:57.02ID:4YhVePXS
>>52
スコープが広がるごとに許容範囲は狭まるだろ
クラス使うならモジュールレベルの変数は普通に使うつーか、使わんと大したもん作れない
2018/01/31(水) 15:23:18.93ID:1/FNqCDn
自分は他のソフトを制御するのにVBA使ってるけど、モジュールレベル変数やグローバル変数を使うとインスタンスが残って不具合出ることが多かったから使わないようにしてる。
解放させる手もあるけど、タイミングに気を使うし記述も面倒。そしてなにより不具合発生原因の特定がスコープが広すぎるときつい。
だったらプロシージャ内で終わるの前提で設計する方が楽という結論になった。

あと、公式でプロシージャレベル変数が保持されることに期待するマクロは推奨しないみたいなコメントなかったっけ。
2018/01/31(水) 17:43:55.07ID:QBWxlyAw
そうそう。
フォームもクラスも使ったプログラミングを始めるとグローバル変数を使わざる負えない場合がある。
下手にENDを使われると同時に開いてるアドインが使い物にならない可能性があるので注意したほうが良いかも
2018/01/31(水) 17:55:21.63ID:4YhVePXS
>>55
クラスにろフォームにしろそのモジュール内で完結させるのは前提だけどね
標準モジュールでもモジュールレベル変数が有効なことがないこともないがね
完全にパブリックなグローバル変数は可能な限り使わないのが基本だろう
2018/01/31(水) 19:46:12.53ID:/yXosPjR
今までグローバル変数を使わなければ
ならなかった局面に当たったことがない

どんな時に使わなければならなくなる?
いや、いつも外部とのやり取りは
パブリックなメソッドやプロパティで
やってるんだけど
2018/01/31(水) 19:50:56.33ID:wkRhZUuX
>>56
ID変わったけど55です。それについては異論はないかな。
ただ>>42のように勘違いする人が出てきそうなので、ENDを使わないのも基本だとして根拠を上げてみた。

例えばアドインでは常駐フォームとかWithEventsでイベントをフックするためのクラスを制御するのにグローバル変数を使わないといけない。
しかもENDを使った瞬間に開いてるフォーム全部消えるんだよね。
せめて同一プロジェクトのみのメモリ解放だと良いんだがExcel VBA全体のメモリが開放されてしまう。

ENDはおまじないはおまじないでも、バルスだと思って使って欲しい。
59デフォルトの名無しさん
垢版 |
2018/01/31(水) 20:27:34.36
Endを使われても問題が生じない堅牢なアドインの作り方としては、設定値はレジストリに保持しておいてグローバル変数はあくまでキャッシュとして使うのがいいのかな?
(グローバル変数を使う前に必ず存在チェックして、NothingやEmptyなら都度レジストリから値を読み出してインスタンス再生成)
60デフォルトの名無しさん
垢版 |
2018/01/31(水) 20:31:58.29
ちなみにグローバル変数と書いたけど、Endでモジュールレベルの変数もクリアされるという理解
61デフォルトの名無しさん
垢版 |
2018/01/31(水) 20:42:31.70ID:8SvFgWa2
>>57
可愛い質問やなグローバル変数もプロパティも同じ事やで
お前はまずグローバル変数使わなきゃいいってもんやないて事を覚えた方がええな
2018/01/31(水) 20:43:12.79ID:wkRhZUuX
>>57
確かにモジュール変数にパブリックメソッドを経由してアクセスするようにすればグローバル変数は必要ないかな。
「使わざるを得ない」という表現は撤回するよ。

>>59
アドイン開発ではそれが基本かな。
ENDに相当する「停止」ボタンをデバッグ中に頻繁に押すから事前とそういう作り方になると思う。

あとレジストリも良いけど俺はXML派かな。
理由はPC間の移行がユーザーレベルでも出来るからだけど、今にして思えばインポートはダブルクリックで出来るレジストリのほうが簡単だな。エクスポートはちょっと厄介だけど。
2018/01/31(水) 20:43:32.54ID:QI8wXuam
>>59
そんなことしなくても
ちゃんとスコープ毎に解放する作りにしとけば
いいんじゃない?
処理が走り終わったときはこれこれ、
ブックが閉じるときはこれこれ、
といった感じで
2018/01/31(水) 20:47:16.36ID:QI8wXuam
>>61
あー・・・

同じと思ってるんだね
2018/01/31(水) 21:19:51.64ID:pJssMamu
プリミティブな値を保持するコンテナが欲しいとき、ほとんどの場合はグローバル変数やモジュールレベル変数を使うまでもなくセルなどに書き込むだけで事足りる
セルへのアクセス時には組み込みのイベントがいくつも走るのでそこは要注意だし、巨大な動的配列を使用する場合は処理速度の問題が出てくるけど
2018/01/31(水) 21:22:46.33ID:aBe463em
サーバーの監視業務からいきなりVBAでデータ抽出したりする部署に飛ばされたんだけど、なんかいい勉強方法あります?
SQLサーバから引っ張ったりしてます。
2018/01/31(水) 21:32:20.06ID:4YhVePXS
endはホントに終わらせたいときにしかつかっちゃダメだろう
PCで言えば強制終了と同じようなもんだ
仕方なしに使うもんで、グローバル変数と同じように出来るだけ使わないようにするもの
少なくともおまじない感覚はダメだな
2018/01/31(水) 21:39:56.78ID:JpECFIQ2
エクセルはメモリを適切に解放しない事が多々あるので、Endが有効な場面もそれだけ増えるというのが困りもの
69デフォルトの名無しさん
垢版 |
2018/01/31(水) 21:56:08.56ID:niw7tDFN
すみません質問です。初心者です
曜日を順番に表示したいのですが、出てくる曜日がデタラメなのです。
どこか悪いんでしょうが、さっぱりわかりません。
ベテラン様、教えてくだされ。

Dim 年 As Integer, 月 As Byte, 日 As Byte
年=2018
月=1
i = 1
For 日 = 1 To 31
Cells(i + 3, 3).Value = Format(年 / 月 / 日, "aaa")
i = i + 1
Next
2018/01/31(水) 22:02:51.06ID:QI8wXuam
>>69
適当だけどセルに設定されてる値が
日付型になってないことない?
71デフォルトの名無しさん
垢版 |
2018/01/31(水) 22:13:47.19ID:niw7tDFN
>>70
日付型にしてみたけど、やはりダメみたいです。
72デフォルトの名無しさん
垢版 |
2018/01/31(水) 22:14:33.51
>>69
> Format(年 / 月 / 日, "aaa")
なんで割り算してるの?
73デフォルトの名無しさん
垢版 |
2018/01/31(水) 23:18:11.45ID:q0yM2zae
Cells(i + 3, 3).Value = Format(DateValue(年 & "/" & 月 & "/" & 日), "aaa")
2018/02/01(木) 00:24:06.09ID:vMTE7P+w
>>53
クラスモジュールのやつはインスタンスごとに別の実体だからモジュール変数じゃない。
75デフォルトの名無しさん
垢版 |
2018/02/01(木) 06:16:45.45ID:6FACDdoC
>>72
>>73
うまくいきました。
助かりました、ありがとうございました。
2018/02/01(木) 08:11:40.86ID:qON5QokW
急いでるとよく間違えるよな。しかも思い込みでミス発見に時間かかかるかる
2018/02/01(木) 19:37:02.10ID:cx2O6kE2
>>73
わざわざ日付を文字列にしなくてもいいよ
Cells(i + 3, 3).Value = Format(DateSerial(年, 月, 日), "aaa")

>>76
禿げ同
しょうがないので
> Cells(i + 3, 3).Value = Format(年 / 月 / 日, "aaa")
の行にブレーク掛けて止まったらイミディエートウィンドで
Debug.Print Format(年 / 月 / 日, "aaa")
Debug.Print 年 / 月 / 日
Debug.Print 年
...
ってやってる
78デフォルトの名無しさん
垢版 |
2018/02/01(木) 19:45:37.17ID:mRcX8hpa
>>77
禿乙
79デフォルトの名無しさん
垢版 |
2018/02/02(金) 10:09:17.92ID:VDaFhWcz
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/bingo_game.html
すみません このページでダブルビンゴの判定を追加しようと思うのですがうまくいきません。。。
2018/02/02(金) 10:42:11.74ID:+j1MBhFC
ワシはティンコを2本もっている
2本目はとっておきだ(´・ω・`)b
2018/02/02(金) 18:16:54.37ID:ZpXsrnJV
>>80
バケモノじゃねーか
82デフォルトの名無しさん
垢版 |
2018/02/02(金) 23:02:56.20
>>79
試してないけどこんな感じかね

・関数の先頭に「Dim cn5 As Integer」を追加
・「cn1 = 0: cn2 = 0」の直前行に「cn5 = (cn1 ¥ 5) + (cn2 ¥ 5)」を追加 (「/」ではなく「¥」)
・「cn3 = 0: cn4 = 0」の直前行に「cn5 = (cn3 ¥ 5) + (cn4 ¥ 5)」を追加
・「End With」の直前行に以下を追加
If cn5 = 5 Then
.Range(cf(k)).Value = "BINGO!!"
Beep
End If
83デフォルトの名無しさん
垢版 |
2018/02/02(金) 23:03:49.77
>>82
間違えた

× If cn5 = 5 Then

○ If cn5 >= 2 Then
84デフォルトの名無しさん
垢版 |
2018/02/08(木) 00:16:22.23ID:MSYeXSpW
クロスワードパズル、迷路探索アルゴリズムをExcelVBAで作ることができたので、
今度はテトリス作ってみようと思う。
が、飛躍しすぎ?
キー操作で回転させるとか、→押下で横に移動しつつ落下するとかは、難しそうだな。
タイマとかも張らないといけない?
2018/02/08(木) 07:26:16.72ID:XpMtH+Ey
>>84
5年くらい前に作った。
余裕とは言わないけどぷよぷよ作るよりは楽。
タイマーはAPIで見てる。
ブロックはセルに数字を入れて
条件付き書式で着色した。

今作ればクラスの理解があの頃とは全然違うので
多分また違う作りになると思う。
2018/02/08(木) 13:17:56.16ID:qQDxntOi
テトリスってWinAPIに慣れるために最初に作るようなヤツだから構造的にはそこまで難しくないだろうな
でもエクセルだと描画速度の問題があるから・・・
2018/02/08(木) 13:25:02.66ID:f2SIrsod
>>86
大丈夫。EXCELとは言えそこまで遅くはないよ。
むしろ遅くなったら作りに問題があると考えていいと思う。
2018/02/08(木) 19:21:45.57ID:aY4A4Yk1
宣言済みの変数を全て初期化するにはどうしたらいいですか?
2018/02/08(木) 19:31:17.27ID:8qhKGghx
>>88
律儀に全部の変数になにかを代入すりゃいいだけだろ
2018/02/08(木) 19:48:57.07ID:aY4A4Yk1
>>89
それはそうなんですが変数を追加とかしたときに初期化漏れが出そうで・・・
その方法しかないんですかね?
2018/02/08(木) 19:51:00.94ID:fuTq97cg
>>88
宣言した直後は初期化されてる
マクロの動作がすべて終了したら自動的に初期化される

マクロの動作の途中ですべての変数を初期化したいなら、初期化するプログラムをいちいち書くしかないけど、
それはもともとの設計が悪い、方針がおかしい
92デフォルトの名無しさん
垢版 |
2018/02/08(木) 19:52:33.01ID:x393c3Y0
構造体の初期値とかな
2018/02/08(木) 19:53:04.95ID:fuTq97cg
>>90
そもそも初期化漏れってなんだ?たとえば

Dim AAA As Integer

みたいに書いてあると、マクロが実行開始された時点ではAAAは必ず0になってるんだけど
ほかの言語と勘違いしてないか
94デフォルトの名無しさん
垢版 |
2018/02/08(木) 20:07:30.59ID:nI+/jCYy
Integerとか使うなよw
2018/02/08(木) 20:12:43.47ID:aY4A4Yk1
設計が悪いのは確かです。私がVBAド初心者の頃から改良・機能追加を繰り返したコードでぐちゃぐちゃしてます。Public変数だらけなんです。
まとめて初期化する方法はなさそうですね、残念ですがレスありがとうございました。
2018/02/08(木) 20:55:54.86ID:XpMtH+Ey
>>93
欲しい初期値がデフォルト値とは限らない
2018/02/08(木) 21:31:08.51ID:YcyG5pes
リセットするプログラム組んでおいて呼び出すとか
2018/02/08(木) 21:43:42.80ID:wjl/A/KY
変数のスコープは短い方がメンテナンス性がいいと思います
2018/02/08(木) 21:48:43.16ID:Cj1tzdzh
変数の値なんて必要に応じてセットするもんだろ
なんだよ「全変数初期化」って
プログラミングの基礎からやりなおした方がいい
2018/02/08(木) 21:50:33.84ID:fuTq97cg
初期化するサブルーチンを作れ
101デフォルトの名無しさん
垢版 |
2018/02/08(木) 21:52:16.55ID:nI+/jCYy
>>88が必要だと思ったから聞いてんだろw
何を訳のわからん事言ってんだコイツはw
2018/02/08(木) 22:08:53.43ID:aY4A4Yk1
>>97
後からPublic変数を追加した場合、その"リセットするプログラム"も変更の必要ありますよね?
Public変数を一括で初期化できるならいいんですが
>>98
そうですよね。今更ですが実感しています。
>>99
そうです。変数の値を必要に応じてセットしたいんです。
必要な状態とは、変数宣言直後の値なんです。
できませんかね?
>>100
一括で初期化するサブルーチンってできますか?
2018/02/08(木) 22:30:18.23ID:gEZZVs8q
>>102
それを検討する間にソースを書き換えた方が早そう。
それもできない程、巨大なモノならVBAの範疇を超えてると思う。
2018/02/08(木) 22:47:07.92ID:XpMtH+Ey
>>102
ひとこと言わせてもらうと
そもそも「一括で全ての変数を初期化する」と言う
機能が必要になっている時点で多分構成的に
破綻していると思う。

変数を設定する前にどんなプログラムをどんな構成で組むのか、
そのためにはどんなライフサイクルの変数が必要で
スコープはどうするのか
次回から考えて作るようにした方がいい。

もっとも、今そんなことを言っても
多分取り返しのつかないようなコードになっているだろうから
とりあえず一つクラスを作っておいて
今パブリック変数として使っている変数を
そのクラスのプロパティとして移してやって、
生成する際にコンストラクタで初期化してやったら
どうだろうか。
条件によって初期値が変わるのならそのクラス内に
そのためのメソッドを作ってもいいと思う。

あまりいい作りとは言えないけど
そのクラスのインスタンスを
モジュール変数にセットしておいて
初期化したいときは新たに生成したものを
その変数に入れてやればとりあえずは
現状よりはもう少し手が入れやすくなると思う。
105デフォルトの名無しさん
垢版 |
2018/02/08(木) 22:48:28.42
>>102
setvar, letvar, getvar, setarray, letarray, getarray みたいな共通関数を作りましょう。
型ごとに letstrvar, getintvar みたいなのも作っといたほうが便利かな。
まあ大きな関数5〜6個と小さな関数30個くらい実装すれば事足りるでしょう。
既存の g_FooBar, g_Baz みたいなPublic変数へのアクセスを全部 letstrvar("g_FooBar", local_str), local_int = getintvar("g_Baz") のような形式に書き換えましょう。
共通関数の中では、実際の値は巨大な配列に保持して、名前とインデックスを紐付けて管理しましょう。
こうすればグローバル変数の置換は機械的にできるし、変数の初期化も一発です。
健闘を祈ります。
2018/02/08(木) 23:00:19.46ID:aY4A4Yk1
>>103
>>104
レスありがとうございます。
このVBAコードは自分しか使わないし、自分以外がメンテすることはありえないので、
ろくにプログラミングの基本マナーなんてものを勉強しないまま、コード追加追加でわけわからなくなってしまったものです。
自分の書き込みから短時間で、お前のコードの設計が悪いんだとのレスを多く頂いて正直落ち込んでおります・・・
薄々気付いてはいましたが、他の方から指摘されると流石にこたえました。
少しずつ改善していこうと思います。
その上で、>>104をやっていこうと思います。
現時点で>>104の内容は理解できていませんが、なんかすごい貴重なアドバイスなような気がします。参考にさせていただきます。ありがとうございました。
2018/02/08(木) 23:48:09.40ID:XpMtH+Ey
>>106
構成に関しては単一責任原則に沿って作れば
上達が早くなると思うので
もし知らなければググってみた方がいいかも。

初期化というのは実はそこそこ奥の深い話で
ファクトリーパターンやファクトリーメソッドとか
ググると色々出てくるのだけれど
かなりObject指向寄りの話になってしまうので
ここではまぁ興味があればということで。

頑張ってくださいね。
2018/02/09(金) 06:47:45.10ID:Oqb9O2xf
>>102
> 後からPublic変数を追加した場合、その"リセットするプログラム"も変更の必要ありますよね?
変更すればいいじゃない
そもそも今あるPublic変数はともかく今後もPublic変数バンバン増やしちゃるって思ってるの?
2018/02/09(金) 08:10:43.77ID:pONSvQ5P
j自分しか使わないってんなら現状使っているのはそのまま置いといて、いい機会だと
思って新たに作るぐらいの気持ちで、「少しずつ改善」なんて小手先のことやらずに1度徹底的
に作り直したほうが良い。
2018/02/09(金) 12:00:04.92ID:liPrOEdm
グローバル変数、「さっき設定した値を後でまた参照する」的な意味でどうしても必要になることは理解できるけど、
あったとして一つか二つがいいところ。
データセット的なものを配列使わず保持するならたくさん必要になるけど、さすがにそれは配列かコレクション使え。
2018/02/09(金) 19:07:16.76ID:pFe+ikyv
毎回初期化が必要なグローバル変数があるならいっそ値をワークシートに保存して管理した方が安全だよな
112デフォルトの名無しさん
垢版 |
2018/02/09(金) 19:29:49.16
誰か>>105を巨大配列じゃなくてワークシートに記録するやり方で実装してください。
113デフォルトの名無しさん
垢版 |
2018/02/09(金) 19:45:27.04ID:mfiNCmZ5
>>105さん渾身のネタ、スベる
2018/02/10(土) 01:27:55.34ID:UqvxHzys
Worksheet_Calculateが頻繁に呼び出され、これが主な処理であるとき
Public変数だらけになったことはある
初心者だから他にもっといい方法があったのかもしれんが
2018/02/10(土) 04:42:12.40ID:sZXQwMqu
でもみんなPublicな変数使ってて怖くない?
標準、あるいはクラスモジュール単位で
作られたメンバ変数が勝手に外部から
書き換えられちゃうんだよ?
しかもブレークポイントにもかからないから
いろんなところから頻繁に書き換えられたら
変な値が入っても犯人探しが大変だし。

前にも書いたけどプロパティにしたり
関数にしたりしてアクセサつけといた方がいいと思うよ。
読み取り専用にも出来るしね。
2018/02/10(土) 05:43:42.77ID:FhCw4HrB
マクロの設計にもよるだろうけどグローバル変数使わずに大がかりなマクロ作ったことあるから、
絶対に避けられないというのは疑問だな。

だいたい初期化が必要な時点でグローバル変数にするのは不適当だし。
2018/02/10(土) 07:57:32.74ID:vxg4RvSK
初心者あるあるだな
修正や追加を繰り返すうちにコードがスパゲッティになって、変数がどこで書き換えられたか追跡できなくなったもんだから特定のタイミングで一気に初期化したい
すごい手間がかかってるから全面的な書き直しもやりたくない

保守性やモジュール化などの概念がわかってきたところで覚悟を決めて、設計からやり直した方が幸せになれるパターン
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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