Excel VBA 質問スレ P ..
[2ch|▼Menu]
2:デフォルトの名無しさん
18/01/27 20:26:07.63 Xe+uGT7T.net
あとこれ
Excel Python 質問スレ
スレリンク(tech板)

3:デフォルトの名無しさん
18/01/27 20:37:51.59 U6WUbfXx.net
ほす

4:デフォルトの名無しさん
18/01/27 20:40:42.16 v1Vq7O9g.net
>>1
よう無能wスレ立ても満足にできんのかw

5:デフォルトの名無しさん
18/01/27 20:44:44.53 Xe+uGT7T.net
>>4
ならお前が立て直せや無能
そしたら削除依頼だしてくるわ

6:デフォルトの名無しさん
18/01/27 21:18:02.81 U6WUbfXx.net
これはあれか、メゾット君か
パイソンスレでも暴れてるけど
笑えるわ

7:デフォルトの名無しさん
18/01/27 22:30:19.28 v1Vq7O9g.net
>>6
ようメゾット君w久しぶりやなw

8:デフォルトの名無しさん
18/01/27 22:56:24.41 845Tmzax.net
>>7
はよ立て直せよヘタレ

9:デフォルトの名無しさん
18/01/27 23:22:14.86 cbFXqoc1.net
>>7
うんこ擦り付けるのやめてもらえませんかね

10:デフォルトの名無しさん
18/01/27 23:32:58.75 mMQhkopa.net
メゾット君は恥じるって感情を持ち合わせている割に自分より上位の人間に勝てない喧嘩売るのは辞めないってのが不思議

11:デフォルトの名無しさん
18/01/27 23:46:41.45 v1Vq7O9g.net
>>10
キミが下位の人間()だから喧嘩売られるんだよw
不思議でもなんでもないよメゾット君w

12:デフォルトの名無しさん
18/01/27 23:48:38.90 cbFXqoc1.net
>>11
何が下位で何が上位なのか教えてくれよ
言葉の定義揃えてもらえないとわからないバカだから説明してくれ

13:デフォルトの名無しさん
18/01/27 23:51:36.98 v1Vq7O9g.net
>>12
それは上位の人間()を定義した?>>10に聞いたらバカさん

14:デフォルトの名無しさん
18/01/27 23:55:56.46 cbFXqoc1.net
>>13
いや、それに反論した君もその定義を理解してるんだろ?

15:デフォルトの名無しさん
18/01/27 23:58:06.82 v1Vq7O9g.net
>>14
馬鹿にしてるだけなんですけどw
逆に聞くけどキミは上位の人間とか本当にあると思ってるの?バカさん

16:デフォルトの名無しさん
18/01/28 00:01:24.71 tSF66yjC.net
>>15
じゃあ何が上位で何が下位かわからずに噛みついてるってことだね
それがわかれば満足だわ、ありがとう

17:デフォルトの名無しさん
18/01/28 00:03:07.53 8+IXgyMg.net
>>16
あのー、馬鹿にしてるってハッキリ言ったよね?w
人の話ちゃんと聞こうよバカさんw

18:デフォルトの名無しさん
18/01/28 00:06:37.18 tSF66yjC.net
>>17
定義もわからんでバカにするってどう言うことなのかよくわからんわ
メゾット君本人でもなけりゃなんも気にならないと思うんだけど
とにかく、そこはわかってないということはわかったからそれ以上興味ないわ

19:デフォルトの名無しさん
18/01/28 00:07:58.80 mZQyM07n.net
いや、メゾット君はVBAのコードを読み書き出来ないんだから、このスレでは初歩的な事を聞いてくる初心者より下位やぞ

20:デフォルトの名無しさん
18/01/28 00:12:08.48 BSlLksGg.net
>>18
そりゃキミがバカなんだからわかるわけないよバカさんw
面白い事言うね!さすがバカさんw

21:デフォルトの名無しさん
18/01/28 00:13:56.37 tSF66yjC.net
>>20
具体的に

22:デフォルトの名無しさん
18/01/28 00:18:17.28 8+IXgyMg.net
>>21
むしろキミが具体的にキミ自身がバカだと考える理由を説明してくれよバカさんw
ボクはキミの自己紹介を尊重してるだけだよバカさんw

23:デフォルトの名無しさん
18/01/28 00:22:13.43 NUwCXosq.net
>>5
ほならね理論で草

24:デフォルトの名無しさん
18/01/28 00:26:24.39 tSF66yjC.net
>>22
それはその時のレスそのままの意味だよ

25:デフォルトの名無しさん
18/01/28 12:43:11.93 iOPSu+uz.net
メゾット君1とはなんぞや

26:デフォルトの名無しさん
18/01/28 13:52:51.41 8+IXgyMg.net
無能の>>1のことなんじゃね?しらんけど

27:デフォルトの名無しさん
18/01/28 14:14:41.52 XZzu/jLR.net
ここまで何の技術も質問も無い件

28:デフォルトの名無しさん
18/01/28 16:29:29.49 mZQyM07n.net
>>25
メゾット君とはプログラミングについての知識が一切無いにも関わらず、このスレに三年ほど前から張り付いていて、
具体性の無い罵詈雑言をレスし続けている名無しの一人
Methodの読み方が分からず「メゾット」と呼んだ事が名称の由来
まともな社会経験が無い為なのか、実用性が極端に薄い独特な思考法で会話をしようとする為、
回線を三つほど使い回して自演している時でも本人と特定出来てしまう
偶然映り込むよう装ってロレックスの腕時計を見せびらかすように写メに撮ってみたり(映り込み方は非常に不自然)、
プログラミングの本を読んで「変数」という概念の存在を数時間で認知できたことを褒めて欲しいと再三強調したり、
どうも虚栄心が異様に強い傾向にあるらしいが、現実では満たされない為に、このスレで他人を罵倒して鬱憤を晴らしてる様だ
平日の日中は反応が無い事が多いので労働に従事しているらしい事が見受けられるが、
中古と思われる書籍しか購入していないなど、知識に対する評価が低い点から見て、社会的地位が低い仕事だと思われる
メゾット君であるかどうかに関わらず、具体的な指摘、コードの付与がないレスはスルーする事をお勧めする

29:デフォルトの名無しさん
18/01/28 17:09:44.50 8+IXgyMg.net
あれ?レス番飛んでるけどメゾット君何かレスしたの?

30:デフォルトの名無しさん
18/01/28 18:08:50.22 xEeIgRKG.net
スレ保守のついでに相手してやったのよ
以後はスルーするつもり

31:デフォルトの名無しさん
18/01/30 03:46:22.71 kllVg4gx.net
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

32:デフォルトの名無しさん
18/01/30 07:48:44.61 gBU+LQhN.net
>>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
'//////////

33:デフォルトの名無しさん
18/01/30 08:10:08.93 R3oCXQqF.net
どうでもいいけど、セルのインデックスを文字列で指定するのは明らかにスマートじゃない気がする
確かcellsの方が多少速度早いんじゃなかったか

34:デフォルトの名無しさん
18/01/30 08:27:38.31 aDcByURH.net
B列固定でとりあえず動作すりゃいいってのならどっちでもいいんじゃない。
将来的に変更可能性あるなら別だけど

35:デフォルトの名無しさん
18/01/30 12:45:58.02 vLC2w8Bp.net
>>34
ま、好き好きなんだけどね
自分がこのプログラム引き継いだら書き直すなって思う

36:デフォルトの名無しさん
18/01/30 14:45:24.44 kllVg4gx.net
>>32-33
修正しました、ありがとうございます
質問2の複数回実行した時にかかる時間が増えていくのは何故でしょうか?

37:デフォルトの名無しさん
18/01/30 15:19:01.11 5GO1HuBo.net
>>36
実行毎にどんどん加算されていくんなら、なんかキャッシュしたまま離してないんじゃないの。
マクロの終わりにEndステートメント使ってみて改善するかどうかだね。

38:デフォルトの名無しさん
18/01/30 16:11:27.88 kllVg4gx.net
>>37
最後を
Range("D3") = Round(Timer - start, 2) & " 秒"
End '←追加
End Sub
にしたら加算されなくなりました
新規の列だとならなかったので作成したドロップダウンリストの何かが残ってるのかなと思ってたのですがEndは今回初めて知りました
みなさんありがとうございました

39:デフォルトの名無しさん
18/01/30 16:16:06.37 kllVg4gx.net
すみません、こっちでした
Cells(4, 4) = Round(Timer - start, 2) & " 秒"
End
End Sub

40:デフォルトの名無しさん
18/01/30 17:49:35.13 2erBHUms.net
たぶん変数をモジュールレベルで宣言してるからじゃないのこれ
プロシージャ内に宣言して不都合なことある?

41:デフォルトの名無しさん
18/01/31 01:14:12.85 3K34O5TZ.net
>>33AやBなら列番号のでもイイかと思うけど
列が多くて256列目にとかなってくると
セルよりrangeで文字の方が追っかけ易いよ

42:デフォルトの名無しさん
18/01/31 01:42:08.16 .net
なるほど、マクロの最後にはおまじないとしてEndを書いといたほうがいいのか

43:デフォルトの名無しさん
18/01/31 07:52:17.18 1/FNqCDn.net
>>40
それだな。
プロシージャ内ならENDは要らないと思う。
END使うのは個人的にスマートじゃなくて嫌。止むを得ず止めたい処理にだけ使うけど。

44:デフォルトの名無しさん
18/01/31 07:55:30.29 1/FNqCDn.net
訂正、スマートってよりは場当たり的って感じで嫌

45:デフォルトの名無しさん
18/01/31 08:12:45.84 bjoCXrds.net
>>42
普通にコーディングしてたらそんな必要はない

46:デフォルトの名無しさん
18/01/31 08:20:37.67 bjoCXrds.net
>>41
列をループさせないかつ列名がついてないような表なら無しではないかもしれないね
列名ついてるならEnumなりユーザー定義型なりで名前つけてやるべきだろうと思うが
引数に文字列の結合式を書くことが個人的にはすごく気持ち悪いけどまあそれは人それぞれかもしれないね

47:デフォルトの名無しさん
18/01/31 08:23:10.53 1/FNqCDn.net
あとモジュールレベルの変数名はiとか他でも使うような名前にしない方がいいぞ。
他で使っちゃってたりして予期せぬエラーの原因になる。

48:デフォルトの名無しさん
18/01/31 10:32:40.89 y6ZUdqMb.net
ここで質問するか微妙ですが質問します。
エクセル起動すると
1004エラーmacrooptionsのエラーが出ます
スタートメニューのすべてのプログラムからエクセルを起動しても同様のエラーがでます
オフィスを再インストールしても同様エラーが出るのですが解決策ないでしょうか?

49:デフォルトの名無しさん
18/01/31 11:59:35.68 sVXcwb3a.net
他のバージョンのOffice製品が混在していないか
インストールされたプログラムで「修復」を試みたか
MSの fix it も試してみるべき

50:デフォルトの名無しさん
18/01/31 12:12:55.39 QBWxlyAw.net
>>47
さらに言えば、モジュール変数はm,グローバル変数はgを先頭に付けたほうが保守しやすい(俺は)

51:デフォルトの名無しさん
18/01/31 12:38:18.79 /yXosPjR.net
>>50
え・・・
グローバル変数使ってるの?

52:デフォルトの名無しさん
18/01/31 13:51:36.51 NL/gtaqq.net
モジュール変数なら許せてグローバル変数が許せない、ということではないよな?

53:デフォルトの名無しさん
18/01/31 14:08:57.02 4YhVePXS.net
>>52
スコープが広がるごとに許容範囲は狭まるだろ
クラス使うならモジュールレベルの変数は普通に使うつーか、使わんと大したもん作れない

54:デフォルトの名無しさん
18/01/31 15:23:18.93 1/FNqCDn.net
自分は他のソフトを制御するのにVBA使ってるけど、モジュールレベル変数やグローバル変数を使うとインスタンスが残って不具合出ることが多かったから使わないようにしてる。
解放させる手もあるけど、タイミングに気を使うし記述も面倒。そしてなにより不具合発生原因の特定がスコープが広すぎるときつい。
だったらプロシージャ内で終わるの前提で設計する方が楽という結論になった。
あと、公式でプロシージャレベル変数が保持されることに期待するマクロは推奨しないみたいなコメントなかったっけ。

55:デフォルトの名無しさん
18/01/31 17:43:55.07 QBWxlyAw.net
そうそう。
フォームもクラスも使ったプログラミングを始めるとグローバル変数を使わざる負えない場合がある。
下手にENDを使われると同時に開いてるアドインが使い物にならない可能性があるので注意したほうが良いかも

56:デフォルトの名無しさん
18/01/31 17:55:21.63 4YhVePXS.net
>>55
クラスにろフォームにしろそのモジュール内で完結させるのは前提だけどね
標準モジュールでもモジュールレベル変数が有効なことがないこともないがね
完全にパブリックなグローバル変数は可能な限り使わないのが基本だろう

57:デフォルトの名無しさん
18/01/31 19:46:12.53 /yXosPjR.net
今までグローバル変数を使わなければ
ならなかった局面に当たったことがない
どんな時に使わなければならなくなる?
いや、いつも外部とのやり取りは
パブリックなメソッドやプロパティで
やってるんだけど

58:デフォルトの名無しさん
18/01/31 19:50:56.33 wkRhZUuX.net
>>56
ID変わったけど55です。それについては異論はないかな。
ただ>>42のように勘違いする人が出てきそうなので、ENDを使わないのも基本だとして根拠を上げてみた。
例えばアドインでは常駐フォームとかWithEventsでイベントをフックするためのクラスを制御するのにグローバル変数を使わないといけない。
しかもENDを使った瞬間に開いてるフォーム全部消えるんだよね。
せめて同一プロジェクトのみのメモリ解放だと良いんだがExcel VBA全体のメモリが開放されてしまう。
ENDはおまじないはおまじないでも、バルスだと思って使って欲しい。

59:デフォルトの名無しさん
18/01/31 20:27:34.36 .net
Endを使われても問題が生じない堅牢なアドインの作り方としては、設定値はレジストリに保持しておいてグローバル変数はあくまでキャッシュとして使うのがいいのかな?
(グローバル変数を使う前に必ず存在チェックして、NothingやEmptyなら都度レジストリから値を読み出してインスタンス再生成)

60:デフォルトの名無しさん
18/01/31 20:31:58.29 .net
ちなみにグローバル変数と書いたけど、Endでモジュールレベルの変数もクリアされるという理解

61:デフォルトの名無しさん
18/01/31 20:42:31.70 8SvFgWa2.net
>>57
可愛い質問やなグローバル変数もプロパティも同じ事やで
お前はまずグローバル変数使わなきゃいいってもんやないて事を覚えた方がええな

62:デフォルトの名無しさん
18/01/31 20:43:12.79 wkRhZUuX.net
>>57
確かにモジュール変数にパブリックメソッドを経由してアクセスするようにすればグローバル変数は必要ないかな。
「使わざるを得ない」という表現は撤回するよ。
>>59
アドイン開発ではそれが基本かな。
ENDに相当する「停止」ボタンをデバッグ中に頻繁に押すから事前とそういう作り方になると思う。
あとレジストリも良いけど俺はXML派かな。
理由はPC間の移行がユーザーレベルでも出来るからだけど、今にして思えばインポートはダブルクリックで出来るレジストリのほうが簡単だな。エクスポートはちょっと厄介だけど。

63:デフォルトの名無しさん
18/01/31 20:43:32.54 QI8wXuam.net
>>59
そんなことしなくても
ちゃんとスコープ毎に解放する作りにしとけば
いいんじゃない?
処理が走り終わったときはこれこれ、
ブックが閉じるときはこれこれ、
といった感じで

64:デフォルトの名無しさん
18/01/31 20:47:16.36 QI8wXuam.net
>>61
あー・・・
同じと思ってるんだね

65:デフォルトの名無しさん
18/01/31 21:19:51.64 pJssMamu.net
プリミティブな値を保持するコンテナが欲しいとき、ほとんどの場合はグローバル変数やモジュールレベル変数を使うまでもなくセルなどに書き込むだけで事足りる
セルへのアクセス時には組み込みのイベントがいくつも走るのでそこは要注意だし、巨大な動的配列を使用する場合は処理速度の問題が出てくるけど

66:デフォルトの名無しさん
18/01/31 21:22:46.33 aBe463em.net
サーバーの監視業務からいきなりVBAでデータ抽出したりする部署に飛ばされたんだけど、なんかいい勉強方法あります?
SQLサーバから引っ張ったりしてます。

67:デフォルトの名無しさん
18/01/31 21:32:20.06 4YhVePXS.net
endはホントに終わらせたいときにしかつかっちゃダメだろう
PCで言えば強制終了と同じようなもんだ
仕方なしに使うもんで、グローバル変数と同じように出来るだけ使わないようにするもの
少なくともおまじない感覚はダメだな

68:デフォルトの名無しさん
18/01/31 21:39:56.78 JpECFIQ2.net
エクセルはメモリを適切に解放しない事が多々あるので、Endが有効な場面もそれだけ増えるというのが困りもの

69:デフォルトの名無しさん
18/01/31 21:56:08.56 niw7tDFN.net
すみません質問です。初心者です
曜日を順番に表示したいのですが、出てくる曜日がデタラメなのです。
どこか悪いんでしょうが、さっぱりわかりません。
ベテラン様、教えてくだされ。
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

70:デフォルトの名無しさん
18/01/31 22:02:51.06 QI8wXuam.net
>>69
適当だけどセルに設定されてる値が
日付型になってないことない?

71:デフォルトの名無しさん
18/01/31 22:13:47.19 niw7tDFN.net
>>70
日付型にしてみたけど、やはりダメみたいです。

72:デフォルトの名無しさん
18/01/31 22:14:33.51 .net
>>69
> Format(年 / 月 / 日, "aaa")
なんで割り算してるの?

73:デフォルトの名無しさん
18/01/31 23:18:11.45 q0yM2zae.net
Cells(i + 3, 3).Value = Format(DateValue(年 & "/" & 月 & "/" & 日), "aaa")

74:デフォルトの名無しさん
18/02/01 00:24:06.09 vMTE7P+w.net
>>53
クラスモジュールのやつはインスタンスごとに別の実体だからモジュール変数じゃない。

75:デフォルトの名無しさん
18/02/01 06:16:45.45 6FACDdoC.net
>>72
>>73
うまくいきました。
助かりました、ありがとうございました。

76:デフォルトの名無しさん
18/02/01 08:11:40.86 qON5QokW.net
急いでるとよく間違えるよな。しかも思い込みでミス発見に時間かかかるかる

77:デフォルトの名無しさん
18/02/01 19:37:02.10 cx2O6kE2.net
>>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:デフォルトの名無しさん
18/02/01 19:45:37.17 mRcX8hpa.net
>>77
禿乙

79:デフォルトの名無しさん
18/02/02 10:09:17.92 VDaFhWcz.net
URLリンク(www.eurus.dti.ne.jp)
すみません このページでダブルビンゴの判定を追加しようと思うのですがうまくいきません。。。

80:デフォルトの名無しさん
18/02/02 10:42:11.74 +j1MBhFC.net
ワシはティンコを2本もっている
2本目はとっておきだ(´・ω・`)b

81:デフォルトの名無しさん
18/02/02 18:16:54.37 ZpXsrnJV.net
>>80
バケモノじゃねーか

82:デフォルトの名無しさん
18/02/02 23:02:56.20 .net
>>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:デフォルトの名無しさん
18/02/02 23:03:49.77 .net
>>82
間違えた
× If cn5 = 5 Then
○ If cn5 >= 2 Then

84:デフォルトの名無しさん
18/02/08 00:16:22.23 MSYeXSpW.net
クロスワードパズル、迷路探索アルゴリズムをExcelVBAで作ることができたので、
今度はテトリス作ってみようと思う。
が、飛躍しすぎ?
キー操作で回転させるとか、→押下で横に移動しつつ落下するとかは、難しそうだな。
タイマとかも張らないといけない?

85:デフォルトの名無しさん
18/02/08 07:26:16.72 XpMtH+Ey.net
>>84
5年くらい前に作った。
余裕とは言わないけどぷよぷよ作るよりは楽。
タイマーはAPIで見てる。
ブロックはセルに数字を入れて
条件付き書式で着色した。
今作ればクラスの理解があの頃とは全然違うので
多分また違う作りになると思う。

86:デフォルトの名無しさん
18/02/08 13:17:56.16 qQDxntOi.net
テトリスってWinAPIに慣れるために最初に作るようなヤツだから構造的にはそこまで難しくないだろうな
でもエクセルだと描画速度の問題があるから・・・

87:デフォルトの名無しさん
18/02/08 13:25:02.66 f2SIrsod.net
>>86
大丈夫。EXCELとは言えそこまで遅くはないよ。
むしろ遅くなったら作りに問題があると考えていいと思う。

88:デフォルトの名無しさん
18/02/08 19:21:45.57 aY4A4Yk1.net
宣言済みの変数を全て初期化するにはどうしたらいいですか?

89:デフォルトの名無しさん
18/02/08 19:31:17.27 8qhKGghx.net
>>88
律儀に全部の変数になにかを代入すりゃいいだけだろ

90:デフォルトの名無しさん
18/02/08 19:48:57.07 aY4A4Yk1.net
>>89
それはそうなんですが変数を追加とかしたときに初期化漏れが出そうで・・・
その方法しかないんですかね?

91:デフォルトの名無しさん
18/02/08 19:51:00.94 fuTq97cg.net
>>88
宣言した直後は初期化されてる
マクロの動作がすべて終了したら自動的に初期化される
マクロの動作の途中ですべての変数を初期化したいなら、初期化するプログラムをいちいち書くしかないけど、
それはもともとの設計が悪い、方針がおかしい

92:デフォルトの名無しさん
18/02/08 19:52:33.01 x393c3Y0.net
構造体の初期値とかな

93:デフォルトの名無しさん
18/02/08 19:53:04.95 fuTq97cg.net
>>90
そもそも初期化漏れってなんだ?たとえば
Dim AAA As Integer
みたいに書いてあると、マクロが実行開始された時点ではAAAは必ず0になってるんだけど
ほかの言語と勘違いしてないか

94:デフォルトの名無しさん
18/02/08 20:07:30.59 nI+/jCYy.net
Integerとか使うなよw

95:デフォルトの名無しさん
18/02/08 20:12:43.47 aY4A4Yk1.net
設計が悪いのは確かです。私がVBAド初心者の頃から改良・機能追加を繰り返したコードでぐちゃぐちゃしてます。Public変数だらけなんです。
まとめて初期化する方法はなさそうですね、残念ですがレスありがとうございました。

96:デフォルトの名無しさん
18/02/08 20:55:54.86 XpMtH+Ey.net
>>93
欲しい初期値がデフォルト値とは限らない

97:デフォルトの名無しさん
18/02/08 21:31:08.51 YcyG5pes.net
リセットするプログラム組んでおいて呼び出すとか

98:デフォルトの名無しさん
18/02/08 21:43:42.80 wjl/A/KY.net
変数のスコープは短い方がメンテナンス性がいいと思います

99:デフォルトの名無しさん
18/02/08 21:48:43.16 Cj1tzdzh.net
変数の値なんて必要に応じてセットするもんだろ
なんだよ「全変数初期化」って
プログラミングの基礎からやりなおした方がいい

100:デフォルトの名無しさん
18/02/08 21:50:33.84 fuTq97cg.net
初期化するサブルーチンを作れ

101:デフォルトの名無しさん
18/02/08 21:52:16.55 nI+/jCYy.net
>>88が必要だと思ったから聞いてんだろw
何を訳のわからん事言ってんだコイツはw

102:デフォルトの名無しさん
18/02/08 22:08:53.43 aY4A4Yk1.net
>>97
後からPublic変数を追加した場合、その"リセットするプログラム"も変更の必要ありますよね?
Public変数を一括で初期化できるならいいんですが
>>98
そうですよね。今更ですが実感しています。
>>99
そうです。変数の値を必要に応じてセットしたいんです。
必要な状態とは、変数宣言直後の値なんです。
できませんかね?
>>100
一括で初期化するサブルーチンってできますか?

103:デフォルトの名無しさん
18/02/08 22:30:18.23 gEZZVs8q.net
>>102
それを検討する間にソースを書き換えた方が早そう。
それもできない程、巨大なモノならVBAの範疇を超えてると思う。

104:デフォルトの名無しさん
18/02/08 22:47:07.92 XpMtH+Ey.net
>>102
ひとこと言わせてもらうと
そもそも「一括で全ての変数を初期化する」と言う
機能が必要になっている時点で多分構成的に
破綻していると思う。
変数を設定する前にどんなプログラムをどんな構成で組むのか、
そのためにはどんなライフサイクルの変数が必要で
スコープはどうするのか
次回から考えて作るようにした方がいい。
もっとも、今そんなことを言っても
多分取り返しのつかないようなコードになっているだろうから
とりあえず一つクラスを作っておいて
今パブリック変数として使っている変数を
そのクラスのプロパティとして移してやって、
生成する際にコンストラクタで初期化してやったら
どうだろうか。
条件によって初期値が変わるのならそのクラス内に
そのためのメソッドを作ってもいいと思う。
あまりいい作りとは言えないけど
そのクラスのインスタンスを
モジュール変数にセットしておいて
初期化したいときは新たに生成したものを
その変数に入れてやればとりあえずは
現状よりはもう少し手が入れやすくなると思う。

105:デフォルトの名無しさん
18/02/08 22:48:28.42 .net



106:>>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") のような形式に書き換えましょう。 共通関数の中では、実際の値は巨大な配列に保持して、名前とインデックスを紐付けて管理しましょう。 こうすればグローバル変数の置換は機械的にできるし、変数の初期化も一発です。 健闘を祈ります。



107:デフォルトの名無しさん
18/02/08 23:00:19.46 aY4A4Yk1.net
>>103
>>104
レスありがとうございます。
このVBAコードは自分しか使わないし、自分以外がメンテすることはありえないので、
ろくにプログラミングの基本マナーなんてものを勉強しないまま、コード追加追加でわけわからなくなってしまったものです。
自分の書き込みから短時間で、お前のコードの設計が悪いんだとのレスを多く頂いて正直落ち込んでおります・・・
薄々気付いてはいましたが、他の方から指摘されると流石にこたえました。
少しずつ改善していこうと思います。
その上で、>>104をやっていこうと思います。
現時点で>>104の内容は理解できていませんが、なんかすごい貴重なアドバイスなような気がします。参考にさせていただきます。ありがとうございました。

108:デフォルトの名無しさん
18/02/08 23:48:09.40 XpMtH+Ey.net
>>106
構成に関しては単一責任原則に沿って作れば
上達が早くなると思うので
もし知らなければググってみた方がいいかも。
初期化というのは実はそこそこ奥の深い話で
ファクトリーパターンやファクトリーメソッドとか
ググると色々出てくるのだけれど
かなりObject指向寄りの話になってしまうので
ここではまぁ興味があればということで。
頑張ってくださいね。

109:デフォルトの名無しさん
18/02/09 06:47:45.10 Oqb9O2xf.net
>>102
> 後からPublic変数を追加した場合、その"リセットするプログラム"も変更の必要ありますよね?
変更すればいいじゃない
そもそも今あるPublic変数はともかく今後もPublic変数バンバン増やしちゃるって思ってるの?

110:デフォルトの名無しさん
18/02/09 08:10:43.77 pONSvQ5P.net
j自分しか使わないってんなら現状使っているのはそのまま置いといて、いい機会だと
思って新たに作るぐらいの気持ちで、「少しずつ改善」なんて小手先のことやらずに1度徹底的
に作り直したほうが良い。

111:デフォルトの名無しさん
18/02/09 12:00:04.92 liPrOEdm.net
グローバル変数、「さっき設定した値を後でまた参照する」的な意味でどうしても必要になることは理解できるけど、
あったとして一つか二つがいいところ。
データセット的なものを配列使わず保持するならたくさん必要になるけど、さすがにそれは配列かコレクション使え。

112:デフォルトの名無しさん
18/02/09 19:07:16.76 pFe+ikyv.net
毎回初期化が必要なグローバル変数があるならいっそ値をワークシートに保存して管理した方が安全だよな

113:デフォルトの名無しさん
18/02/09 19:29:49.16 .net
誰か>>105を巨大配列じゃなくてワークシートに記録するやり方で実装してください。

114:デフォルトの名無しさん
18/02/09 19:45:27.04 mfiNCmZ5.net
>>105さん渾身のネタ、スベる

115:デフォルトの名無しさん
18/02/10 01:27:55.34 UqvxHzys.net
Worksheet_Calculateが頻繁に呼び出され、これが主な処理であるとき
Public変数だらけになったことはある
初心者だから他にもっといい方法があったのかもしれんが

116:デフォルトの名無しさん
18/02/10 04:42:12.40 sZXQwMqu.net
でもみんなPublicな変数使ってて怖くない?
標準、あるいはクラスモジュール単位で
作られたメンバ変数が勝手に外部から
書き換えられちゃうんだよ?
しかもブレークポイントにもかからないから
いろんなところから頻繁に書き換えられたら
変な値が入っても犯人探しが大変だし。
前にも書いたけどプロパティにしたり
関数にしたりしてアクセサつけといた方がいいと思うよ。
読み取り専用にも出来るしね。

117:デフォルトの名無しさん
18/02/10 05:43:42.77 FhCw4HrB.net
マクロの設計にもよるだろうけどグローバル変数使わずに大がかりなマクロ作ったことあるから、
絶対に避けられないというのは疑問だな。
だいたい初期化が必要な時点でグローバル変数にするのは不適当だし。

118:デフォルトの名無しさん
18/02/10 07:57:32.74 vxg4RvSK.net
初心者あるあるだな
修正や追加を繰り返すうちにコードがスパゲッティになって、変数がどこで書き換えられたか追跡できなくなったもんだから特定のタイミングで一気に初期化したい
すごい手間がかかってるから全面的な書き直しもやりたくない
保守性やモジュール化などの概念がわかってきたところで覚悟を決めて、設計からやり直した方が幸せになれるパターン

119:デフォルトの名無しさん
18/02/10 07:57:57.08 4c5k2dma.net
おまえらにはグローバル変数は決して悪いものではないという事を知って欲しい

120:デフォルトの名無しさん
18/02/10 12:25:34.71 silh4Kun.net
コントロールのイベントプロシージャはプライベートっていう制約があるから
シートと、ユーザーフォーム間のActiveXコントロールで変数の受け渡しをする場合は、パブリック変数を使用するしかいい方法がないと思う

121:デフォルトの名無しさん
18/02/10 12:29:55.88 XBpzoSQ/.net
ワークシートはグローバル変数みたいなもん
印刷さえしなければたいがい便利に使える

122:デフォルトの名無しさん
18/02/10 14:00:23.82 7mQmOVGk.net
シートから直接取ればいいのでは??
使い回すにしてもプライベート変数で事足りると思うけど。
パブリックにして読み書き自由にする必要はないんじゃないか?

123:デフォルトの名無しさん
18/02/10 17:52:03.19 pkIiHatw.net
rangeオブジェクトを分割して2つのrangeオブジェクトにしたいのですがこれだと値がおかしいので解決方法教えてください
Set obj = Range("a1:b100")
set obj1 = obj.range(obj.cells(1,1),obj.cells(100,1))
set obj2 = obj.range(obj.cells(1,2),obj.cells(100,2))

124:デフォルトの名無しさん
18/02/10 18:04:50.18 o71hUKxM.net
>>122範囲をセットしてるだけで
値をセットしているわけではない

125:デフォルトの名無しさん
18/02/10 19:22:41.50 +Zdspcyw.net
>>122
objに設定してるセルが存在するシートの参照式が省略されてるけど、シートはActiveSheetでいいの?
あと、obj1とobj2には値を設定してるわけじゃないんだが、値がおかしいってどういうこと?

126:デフォルトの名無しさん
18/02/10 21:53:50.67 9qCKy78B.net
vbaに関する質問か分からないけど、
他者が作成したexcel vbaマクロの中身をのぞこうとしたら、パスワードがかかって開けなかった。
どうやったらパスワードを特定できる?

127:デフォルトの名無しさん
18/02/10 21:55:42.82 Ohg/Tsol.net
>>125
そんなもの他者が特定出来たらパスワードの意味がないだろう

128:デフォルトの名無しさん
18/02/10 21:55:42.88 yN3uaIXc.net
>>125
パスかけたやつに聞く

129:デフォルトの名無しさん
18/02/10 22:02:18.01 .net
>>125
VBAのパスワード保護なんてあってないようなものだからすぐ解除できる
URLリンク(neos21.hatenablog.com)

130:デフォルトの名無しさん
18/02/10 22:16:02.76 5tf0t1pe.net
>>123-124
Set obj = Application.InputBox("2列選択", Type:=8)
Set obj1 = obj.Range(obj.Cells(1, 1), obj.Cells(obj.Count / 2, 1))
Set obj2 = obj.Range(obj.Cells(1, 2), obj.Cells(obj.Count / 2, 2))
こんな風にした2列選択した後に1列毎のrangeオブジェクトに割り当てようとしています
試しにobj1.Selectとやって範囲を確認してみると関係のないセルが選択されてしまいました

131:デフォルトの名無しさん
18/02/10 23:02:35.50 .net
>>129
Set obj = Application.InputBox("2列選択", Type:=8)
Set obj1 = obj.Worksheet.Range(obj.Cells(1, 1), obj.Cells(obj.Count / 2, 1))
Set obj2 = obj.Worksheet.Range(obj.Cells(1, 2), obj.Cells(obj.Count / 2, 2))

132:デフォルトの名無しさん
18/02/10 23:24:31.56 .net
このほうが汎用的なのかな
Set obj = Application.InputBox("2列選択", Type:=8)
Set obj1 = Application.Range(obj.Cells(1, 1), obj.Cells(obj.Count / 2, 1))
Set obj2 = Application.Range(obj.Cells(1, 2), obj.Cells(obj.Count / 2, 2))

133:デフォルトの名無しさん
18/02/10 23:27:24.03 .net
>>131はだめか
Application.Range プロパティ (Excel)
>オブジェクト修飾子を指定せずにこのプロ


134:pティを使用すると、 ActiveSheet.Range のショートカットとなります。 >>130でいいと思うけど、Range, Cellsの仕様がいまいち分からなかったから理論的になぜかは説明できない



135:デフォルトの名無しさん
18/02/10 23:39:33.30 o71hUKxM.net
set obj = nothing
は最後に入れるべきか、
ほったらかしでも問題無いのか
どうなんだろう?

136:デフォルトの名無しさん
18/02/11 00:18:26.88 q9UPBdZm.net
おまえらには必要

137:デフォルトの名無しさん
18/02/11 04:53:44.34 LDeaRbgm.net
同じADOでもデルファイのクローズはナッシングだけど、VB系の場合はクローズだよねだいたい
たしかクローズせずにナッシングするとクローズできなくなる

138:デフォルトの名無しさん
18/02/11 08:29:24.42 AIGXauyP.net
>>129
例えばC1:D:4を選択した場合
1.obj.Rangeの中で更にobj.Cellsを指定するということは、C列目を基準にC列目を指定をしていることになる。
だからRangeの中にCellsを書く時はobj.Cellsではなく、obj.Worksheet.Cellsが良い。
2.obj1がC1:C4、obj2にD1:D4をセットしたいってことだよな?
obj.Cells(obj.Count / 2, 1)
この書き方だと行数を半分にしているのだがこれは一体・・・
もしC1:F10を指定した場合にC1:D10、E1:F10に分けたいわけじゃないの?
3.可読性が死ぬからRange使うのをやめよう。
範囲指定をする時はResize、Offsetを使ったほうが直感的です。
当初の質問を参考に2の通りだと仮定して
Set obj1 = obj.Resize(, obj.Column / 2)
Set obj2 = obj.Resize(, obj.Column / 2).Offset(,obj.Column / 2)
Objには2列しか選択されない事が確定しているなら
Set obj1 = obj.Resize(, 1)
Set obj2 = obj.Resize(, 1).Offset(,1)

139:デフォルトの名無しさん
18/02/11 10:16:47.04 .net
>>136
1についての文献あれば教えて
2に関しては、2列選択中だから総セル数を2で割れば行数が算出できるってことやろ
obj.Rows.Countのほうがいいとは思うけど

140:デフォルトの名無しさん
18/02/11 10:18:33.85 .net
>>137
>1についての文献
あ、想像で書いてるどっかのブログとかじゃなくて
ちゃんとしたMicrosoftの公式文献ね

141:デフォルトの名無しさん
18/02/11 10:29:03.91 q9UPBdZm.net
文献()読んでもわからんからこんな掃き溜めで質問しとんのやろw
ややこしい奴やなあw

142:デフォルトの名無しさん
18/02/11 10:34:27.69 .net
>>139
俺は回答者側や

143:デフォルトの名無しさん
18/02/11 10:37:10.14 q9UPBdZm.net
>>140
俺は回答者側や(キリッ
あのさあ〜お前羞恥心ないの?www

144:デフォルトの名無しさん
18/02/11 10:38:14.38 YMxCZLKM.net
ほったらかしで問題ない場合と
そうでない場合があるので
よくわからなければ明示的に
Nothing入れといた方がいい

145:デフォルトの名無しさん
18/02/11 10:54:41.06 A61Ds/EI.net
>>138
> あ、想像で書いてるどっかのブログとかじゃなくて
> ちゃんとしたMicrosoftの公式文献ね
偉そうにほざく前にMSDNぐらいググれ
URLリンク(msdn.microsoft.com)

146:デフォルトの名無しさん
18/02/11 10:58:29.29 .net
>>143
どこにobj.Rangeの引数としてobj,Cellsが指定された場合の解釈のされ方が書いてあるの?
どこみてもActiveSheet.Rangeの引数として使ってる例ばっかりだし、内部的にどういう形式に変換されてるのか全然読み取れないんだわ

147:デフォルトの名無しさん
18/02/11 11:40:12.40 A61Ds/EI.net
>>144
> 偉そうにほざく前にMSDNぐらいググれ
って書いてあるのにバカすぎる
URLは単なるヒントな
まあ普通の理解力あればあれで充分だと思うが w

148:デフォルトの名無しさん
18/02/11 11:49:28.10 .net
>>145
煽りはいいから笑
結局探したけど見つけられなかったんだろ?
気持ちは分かるわ

149:デフォルトの名無しさん
18/02/11 12:24:58.11 A61Ds/EI.net
そう思いたいならそれでいいんじゃね w

150:デフォルトの名無しさん
18/02/11 12:56:24.79 AIGXauyP.net
>>137
公式文献は知らないがそういうもんだと納得している。
想像()とか、こんなくらい知ってるわ


151:買Hケとか言われそうだが set ws = Worksheets(1)があると仮定して。 これはどれもRange("B2")への参照を示すわけだが ws.Cells(2,2) ws.Cells(2,2).Cells(1,1) ws.Cells(2,2).Range("A1") CellsとかRangeは同一ワークシート内であれば、いくらでも参照先を変更できる。 例えばこれはどれもRange("C3")への参照。 B2を基準(1,1)として(2,2)を見ていることになるからだ。 ws.Cells(2,2).Cells(2,2) ws.Cells(2,2).Range("B2") ws.Range(ws.Cells(2,2).Range("B2")) 問題の件はobjに既にRangeが格納されているからわかりづらいが Set obj = ws.Range("B2") の場合に obj.Range(ws.Cells(2,2)) というのは ws.Range("B2").Range(ws.Cells(2,2)) ってことだよね 単一セルの場合はws.Range("B2").Cells(2,2)と同一の結果になる。 範囲の場合も考え方は同じだがRange(a,b)でaとbに範囲を渡した場合 aとbを合わせた領域の最端の範囲を示すのは言わずもがな。 結局のところ何も難しい話ではなくて、Offsetの相対指定とResizeの範囲指定を同時にできるのがRangeだっていう話に戻る。 普段ws.Range("A1")と書いているものは、実はws.cells(1,1).Range("A1")の省略形だって考えて俺は納得した。



152:デフォルトの名無しさん
18/02/11 13:17:28.48 A61Ds/EI.net
>>148
素直な君には正解を教えてあげる w
For example, if the selection is cell C3, Selection.Cells(2, 2) returns cell D4
URLリンク(msdn.microsoft.com)

153:デフォルトの名無しさん
18/02/11 16:48:17.26 .net
>>148
ありがとう。
結局、想像でしかないけど、
obj.Range(obj.Cells(x, x), obj.Cells(x, x))
を独自関数
SelectionRangeCells(obj, obj.Cells(x, x), obj.Cells(x, x))
に置き換えると、こんな感じのことをしているのかね。
Function SelectionRangeCells(ByRef rng As Range, ByRef cell1 As Range, ByRef cell2 As Range) As Range
Dim startRow As Long
Dim endRow As Long
Dim startColumn As Long
Dim endColumn As Long
startRow = WorksheetFunction.Min(cell1.Row, cell2.Row)
endRow = WorksheetFunction.Max(cell1.Row, cell2.Row)
startColumn = WorksheetFunction.Min(cell1.Column, cell2.Column)
endColumn = WorksheetFunction.Max(cell1.Column, cell2.Column)
Set SelectionRangeCells = rng.Resize(endRow - startRow + 1, endColumn - startColumn + 1).Offset(startRow - 1, startColumn - 1)
End Function
obj.Range("A1")という形式の場合は公式ドキュメントに明確に書かれてるね。
URLリンク(msdn.microsoft.com)
obj.Range(obj.Cells(x, x), obj.Cells(x, x))
の場合はobj.Cells(x, x)が実体セルを指していてobjとの相対位置も分かってるわけだから
Rangeプロパティ内で相対参照を算出する実装方法も考えられるしそのほうが使う側は分かりやすいはずだけど
そう実装していないという明確な記述がどこにもなかったから実際に動かしてみての想像しかできなかった。
(ちなみに>>149がなにやら勘違いしているようだがCells(x, x)【Cells._Default(x, x)】が何を返すかを知りたかったわけではない)

154:デフォルトの名無しさん
18/02/11 17:24:07.93 A61Ds/EI.net
>>150
> (ちなみに>>149がなにやら勘違いしているようだがCells(x, x)【Cells._Default(x, x)】が何を返すかを知りたかったわけではない)
その理解力で人を勘違い呼ばわりとか w

155:デフォルトの名無しさん
18/02/11 17:54:51.66 q9UPBdZm.net
>>151
俺からしたらおまえも>>150と似たりよったりだからw
まあ今回の件は僅差でお前の勝ちだけどw

156:デフォルトの名無しさん
18/02/11 18:02:54.57 zWT4td5V.net
メゾット君も負けを認められるほど成長したかと感心したもののレス見ると何で勝利宣言してんのか分からなかった

157:デフォルトの名無しさん
18/02/11 21:45:11.45 jnjDiTfu.net
今回の使い方は良いのか悪いのか
ちょっと判断つきかねるなぁ
可読性がちょっとね
扱い方そのものは悪いとは思わない
書いてる人も気付いているか分からないけど
やってることはデコレータパターンの
それにかなり近いんだよね
洗練されればそれなりに便利かも知れないね

158:デフォルトの名無しさん
18/02/11 22:48:44.70 49jQhb5f.net
タスクスケジューラで、Private Sub Workbook_Open()、の記述のあるブックを開くと、
Private Sub Workbook_Open()が実行されるときもあれば、実行されないときもある。
なんでなんだろ?
その違いが今のところ掴めないでいるんですが、どなたか何か情報をお持ちではないですか?

159:デフォルトの名無しさん
18/02/11 23:09:13.81 S5L6PYJ0.net
>>155
ログオフしてるときに動かしたいなら事前にちょっと設定が必要だけどそこら辺は大丈夫?
URLリンク(gagaj.hateblo.jp)

160:デフォルトの名無しさん
18/02/11 23:28:58.59 49jQhb5f.net
>>156
ユーザーがログオンしているときのみ実行する、にチェックが入っていますので違うと思います。
念のため、紹介してもらったサイトに従いフォルダを作成しましたがそれでも変わらずです。
他に情報ありましたらお知らせください。ありがとうございました。

161:デフォルトの名無しさん
18/02/12 07:06:15.59 Mlpgnb6c.net
>>155
実行されない時があるってことは実行される時もあるの?
auto_open()も試してみてよ。
微妙に挙動が異なるので動くかも。
詳しくは違いでググって下さい

162:デフォルトの名無しさん
18/02/12 08:05:14.90 xQy5Bsyb.net
あほやなあオープンマクロが動かんのはオープンしとらんからにきまっとるんやがw

163:デフォルトの名無しさん
18/02/12 08:30:35.08 F3ZoN7fb.net
>>157
> 他に情報ありましたらお知らせください。ありがとうございました。
て言うかまずお前が情報書けよ
> ユーザーがログオンしているときのみ実行する、にチェックが入っていますので違うと思います。
なんて後から言われても困る

164:デフォルトの名無しさん
18/02/12 10:49:27.81 fd37PB9t.net
スケジュールで走らせるのが目的なら
イベントにたよらなくても
VBSからVBAのプロシージャを直で指定して呼べた気がする
でVBSの方をスケジューラーに登録しておく
ググれば方法が見つかると思うのでお試しあれ

165:デフォルトの名無しさん
18/02/12 11:56:54.51 ovw7+iFl.net
>>86
おまえはどんなショボいPCを使っているのか?Windows95でCPUは486DXか?

166:デフォルトの名無しさん
18/02/12 12:41:45.34 F3ZoN7fb.net
>>161
COM経由で操作するなら似たようなもん

167:デフォルトの名無しさん
18/02/12 14:28:15.32 RHpKon14.net
へーsystemアカウント用のDesktopフォルダ作るのか
なるほどね

168:デフォルトの名無しさん
18/02/15 10:49:13.30 n3ZAbmwK.net
VBE起動したあとVBEのウィンドウを最大化するんだけど、
ブックを閉じてVBEを開くと小さいウィンドウで開くから、また最大化する・・・のが面倒なんですが、
前回終了時のウィンドウサイズを記憶させることってできます?

169:デフォルトの名無しさん
18/02/15 14:29:03.19 loppFKn4l
表示してある部分だけ一気に行の高さをかえることできますか?
ドラッグして変えようとすると非表示の部分も変わってしかも表示されてしまします。
例えば2,行目を非表示にして1,4,5行目だけ表示します。1,4,5行目をドラッグして行の高さを変えると,2,3行目まで変わってしかも表示されてしまいます。
よろしくお願い致します。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

147日前に更新/277 KB
担当:undef