[過去ログ] VBAなんでも質問スレ Part2 [転載禁止]©2ch.net (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
20: 2015/07/01(水)23:04 ID:DXkWToqb(2/3) AAS
やってみたけど30日までの月や31までの月などがあって
上手く行かないのです。
21: 2015/07/01(水)23:05 ID:DXkWToqb(3/3) AAS
どこかにサンプルコードでも落ちてないでしょうか?
22: 2015/07/02(木)02:39 ID:9jOibGQm(1) AAS
翌日の日付が「1」だったらコードを実行するようにしたらいいんでない?
23: 2015/07/02(木)11:43 ID:mBr3NkR3(1/2) AAS
>>18
年と月が指定されればその月の日数は求められるよ
(月だけだとうるう年があるから2月に対応出来ない)

具体的やり方は複数あるだろうけど
例えばDateserial関数で指定月の翌月のゼロ日(ツイタチの前日)を求めれば出る

2015年7月の日数を求めたらこんな感じ

Sub Test()
Dim 年指定 As Long
Dim 月指定 As Long
Dim 日数 As Long
年指定 = 2015
月指定 = 7
日数 = Day(DateSerial(年指定, 月指定 + 1, 0))
End Sub
24: 2015/07/02(木)13:00 ID:ww5oQ+GG(1) AAS
>>18
フォーム更新のタイミングは?
ファイルを開いたときに自動で更新するの?
25
(1): 2015/07/02(木)14:46 ID:AbwDTtrn(1) AAS
年月は、ボックスからプルダウンリストで指定
するだけです。ただ、指定年月の1〜月末までの日付、曜日を月報の1.2行目に縦に列記するコードが出来ないのです。
26: 2015/07/02(木)16:13 ID:mBr3NkR3(2/2) AAS
>>25
こんなんでどう?
対象のワークシートと年、月、を引数に指定してコールすれば
対象のシートのA列に日付、B列に曜日を書き込むよ
年と月は省略可能で、省略すると当日の年・月を指定したとみなして処理を実行するよ

Sub test(sh As Worksheet, Optional ByVal yr As Long = 0, Optional ByVal mo As Long = 0)
Dim i As Long
Dim cnt As Long
If yr = 0 Or mo = 0 Then
yr = Year(Date)
mo = Month(Date)
End If
cnt = Day(DateSerial(yr, mo + 1, 0))
With sh
 .Cells.ClearContents
 .Columns(2).NumberFormatLocal = "aaa"
For i = 1 To cnt
.Cells(i, 1) = i
.Cells(i, 2) = Weekday(DateSerial(yr, mo, i))
Next i
End With
End Sub
27: 2015/07/02(木)19:18 ID:zxCnKqA7(1) AAS
何とかできそうです。ありがとうございました。
28
(1): 2015/07/02(木)20:29 ID:Mdba4OI7(1) AAS
>>14
なんやわからん英語で書かれている方がよっぽど分かりずらいので、
あくまでもEXCELマクロで使用するスクリプトなのでコメントに書いている
そのコードを外人に見せるなら英語が望ましいけど、
漢字をそのまま使えばいいかと。
工事名称等は重複してるので、設定_工事名称とかになるんでしょうかねー。

セル番地の固定値を変数で持っているのが引っかかっているみたいですけど、
メンテするときはコードのメンテも込みになるでしょうから、
変数に代入して整理してるし良いのでは?
というか、そういう風にルールを敷けばいいとおもうの。
29
(5): 2015/07/03(金)08:49 ID:IELcwsmr(1) AAS
>>28
全体を一行下にずらす、とかするとき数十個ある変数を個々にメンテするの?
工事_A = "AO1" → 工事_A = "AO2"
工事_B = "AP1" → 工事_B = "AP2"
・・・
30: 2015/07/03(金)14:52 ID:aFtg1Cyl(1) AAS
>>29
それでいいと思うよ
どうやろうとしてるのか知らんけど、この手の奴は分かりやすいのが一番だと思う
31
(5): 2015/07/03(金)16:20 ID:L435uo00(1) AAS
分りやすいっていうか、直接的だから理解はしやすいけど
修正が面倒で間違いも起きやすいね
レイアウト自体の変更ではなく、全体を一気に動かすなら
最初の一要素だけ絶対アドレスで指定して
あとはそこからの相対参照(要するにオフセット)にしておくというのもひとつの手だと思う
それなら1個いじれば全部まとめて直せる
32
(1): 2015/07/06(月)05:20 ID:UMBaWGrv(1/2) AAS
>>31
数十行にわたるコードのメンテぐらいで不満がある程度なら、
プログラム書くのは向いていないので、長いコードは書かないほうがいいと思う。
あと、ただ一つ変えれば全部まとめて直せるコードでも、
そのコードを知らない他人から見れば、結局全部見ることになると思うよ。
本当にそれでいいのかという部分も含めてテストすることになるから。
で、結局のところ別にどっちでもいいとなる。
33
(1): 2015/07/06(月)08:42 ID:fhp0P+BJ(1/3) AAS
>>31
項目増えて、途中に一行追加されたら似たようなことになるでしょ
34: 2015/07/06(月)13:55 ID:henE3y4I(1) AAS
向き不向きに関する思い込みだな
35
(1): 2015/07/06(月)17:53 ID:J6N5PkHq(1/3) AAS
>>32
数十行だろうと数万行だろうと
ひとつの変更で複数の変更箇所が出てくる構造自体のほうが問題だと思うよ

>そのコードを知らない他人から見れば、結局全部見ることになる

云々はベタに一個ずつ指定していても同じ確認コストを要するわけで
適切なコメントをつけとくなりなんなりで対応しないとしょうがないんじゃないの?

>>33
いや、だから

>レイアウト自体の変更ではなく、全体を一気に動かすなら

という前提条件をつけた上での話をしてるんだけど
36
(3): 2015/07/06(月)18:38 ID:fhp0P+BJ(2/3) AAS
>>35
> という前提条件をつけた上での話をしてるんだけど
そう言うケースがどれだけあるんだ?
って話でしょ
滅多にないケースに対応するために分かりにくい方法をとる必要はないよね
37
(3): 2015/07/06(月)21:37 ID:J6N5PkHq(2/3) AAS
>>36

表の頭にあとから表題を付け加えるとかで
全体を動かすケースってのはそれなりにあると思うよ、
仕様変更で項目順の変更とか途中に項目追加とかのほうが多いだろうけど。

それに、全体をずらすってのは>>29の発案であって俺が言い出した話じゃないんで
俺はあくまで他人から与えられた前提条件で考えただけの話
38
(1): 2015/07/06(月)22:43 ID:fhp0P+BJ(3/3) AAS
>>37
> 仕様変更で項目順の変更とか途中に項目追加とかのほうが多いだろうけど。
普通はそうでしょ?

> 俺はあくまで他人から与えられた前提条件で考えただけの話
あまりない条件だけ考えることになんか意味があるのか?
39
(1): 2015/07/06(月)23:03 ID:J6N5PkHq(3/3) AAS
>>38
そっちのが多いとは言ったが、全体を動かすのもそれなりにあるって言ってるじゃん
滅多にないとかありえないとかいうほどのレアケースではないよ
40
(1): 2015/07/06(月)23:42 ID:QbnSMTRw(1) AAS
>>39
> ありえないとかいう

誰もそんなことは言ってないだろ?
お前さんも認めてるように

> 仕様変更で項目順の変更とか途中に項目追加とかのほうが多い

なら、そっちの対応を優先して設計した方がいいんじゃね?

って話
41
(1): 2015/07/06(月)23:52 ID:UMBaWGrv(2/2) AAS
>>37
別にセルのアドレスを固定で持ってようが、一つのアドレスに対して
相対で持ってようがどっちでもいいだろ
ケースバイケースで使い分けようとは思わないのか?

俺が言ったのは数十個(行)程度の修正から避けるために
相対座標で組んだ方が良いと思っているならプログラム組むのは
向いてないってことだよ
だから、お前は長いソースを組むような仕事は向いてないよって言ったんだよ。
せいぜい短く済むようなのを探しとけw

分かりやすいソースのほうが、修正工程の見積もりだって立てやすい
お前のいう相対座標は、その一つの絶対座標に対して成り立っているんだから
見出しが追加されてずれる程度ならいいが、途中の箇所に複数追加変更されたら
むしろ修正面倒なんじゃね?
数万も入力させるセルがあるなんてシートの設計のがおかしいと思うが
数万のセルがあちらこちら変更になるのなら簡単で見やすい定義を切っている
ほうが引き継ぎもしやすいし、修正もしやすいってわからんのか?
42
(1): 2015/07/07(火)05:36 ID:PlDHyacp(1/8) AAS
>>40
ああ、ごめん
「ありえない」じゃなくて「あまりない」だったか
どっちにせよレアケースではないのでそこが重要とは思わんけど

>>41
おれも「ひとつの手」だといってますよね?
ということはそれが絶対ということではないですよ。

まぁ、全部直値で指定する場合の変更コストとOffsetで記述した場合の変更コストが
それほど変わるとも思えませんが。

>>29のっぽい例で言えば
工事_A = "AO1" → 工事_A = "AO2"
工事_B = "AP1" → 工事_B = "AP2"
工事_C = "AQ1" → 工事_C = "AQ2"
・・・

というのが

工事_A = "AO1" → 工事_A = "AO2"
工事_B = Range(工事_A).Offset(0,1) → 工事_B = Range(工事_A).Offset(1,1)
工事_C = Range(工事_A).Offset(0,2) → 工事_C = Range(工事_A).Offset(1,2)
・・・

になる程度の話でしょ?

んでもって、何もわからない誰かに保守を引き継ぐのであれば表のレイアウトについてはコメントに書いておくべき物じゃないですかね?

後任の人があらかじめ何の予備知識もないなら全部の要素を直接指定しているのかそうでないか自体、
少なくともコードを全部読まなきゃ判断できないわけで、それなら相対指定で書いてもおなじことです。
43: 2015/07/07(火)05:42 ID:PlDHyacp(2/8) AAS
やべ、工事_AだけRangeで指定してなかったし、全体をずらすだけなら
工事_B以降には変更ないわ

工事_A = Range("AO1") → 工事_A = Range("AO2")
工事_B = Range(工事_A).Offset(0,1) → 工事_B = Range(工事_A).Offset(0,1)
工事_C = Range(工事_A).Offset(0,2) → 工事_C = Range(工事_A).Offset(0,2)
・・・
44: 2015/07/07(火)05:48 ID:PlDHyacp(3/8) AAS
さらに間違ってた
工事_AがRange型ならそれ以降にRange(工事_A)なんて書く必要なかった

まぁ、何も知らずにコードを読んで表のレイアウトを理解できるかどうかとか
表の変更にかかるコストとかには大して影響ない話だけど
45
(1): 2015/07/07(火)07:47 ID:yxtOW/kO(1/4) AAS
>>42
> どっちにせよレアケースではない

いや、レアケースかどうかじゃなくて

> 仕様変更で項目順の変更とか途中に項目追加とか

と比較しての話なんだが...
ひょっとして論理的な思考ができない人なの?

> 少なくともコードを全部読まなきゃ判断できないわけで、それなら相対指定で書いてもおなじことです。

セルアドレスなら一目でどこを指してるのかわかるけど、Offset( ) だとちょっと面倒でしょ?
そもそも、自分で間違えてるようじゃ説得力 0 だしね w
46
(1): 2015/07/07(火)08:33 ID:PlDHyacp(4/8) AAS
>>45
とにかく、コストがさほど変わらん以上、そういうことは重要ではないよね、
って言ってるんだけどそれが論理的に理解できない人なの?

んで、Offsetで(R1C1形式で)書くのがいやなら
RangeでA1形式で書けばいいじゃん
そんなの瑣末なことでしょ

あと、間違えたのは夜中にトイレで起きたときに書き込んだからで
たぶんあのときだとどっちで書いても間違えてる
(普段からR1C1形式で書くのでどっちかってーと俺はA1形式のほうが間違える)
47: 2015/07/07(火)08:34 ID:xJTxnmtV(1) AAS
相対座標がどうたらというのは>>31が言い出したことにすぎないし、"AY0"とかいう文字列で指定すること自体がけしからんという意見。
48
(2): 2015/07/07(火)12:53 ID:yxtOW/kO(2/4) AAS
>>46
> とにかく、コストがさほど変わらん以上、そういうことは重要ではないよね

どう書いてもたいして変わらんから、ごちゃごちゃ言い出した >>29 とか >>31 がバカと言う主張なら納得

> RangeでA1形式で書けばいいじゃん

そう言う問題じゃない
Range("E3").Range("G4")
ってどこ?
ってすぐわからんでしょって話

まあ君にとってはどうでもいい話だったな w
49
(3): 2015/07/07(火)13:20 ID:PlDHyacp(5/8) AAS
>>48
全体を動かす際のコストは明らかに相対参照のほうが上で、
レイアウト変更ならどっちもどっち、って話だよ。

俺個人としては表の各要素の絶対座標よりも表のレイアウト内での相対位置のほうが
重要だと思うんで可読性は相対表記のほうが上だと思う。
もちろん、range("E3").Range("G4")とは書かないよ
だからこそのOffset表記なんであって
仮に書くなら
工事_A = Range("G4")
工事_B = 工事_A.Offset(0,1)
みたいに書けば表の中での位置関係が分りやすい(、と思うってだけなんだけどね)

んでさ、一々相手の人格攻撃するのは止さないか?

反論するのは難しくないけどめんどくさいし
貴方にとっても内容を論理的に言うこと以外に自説の説得力を増す手法なんてないよ
1-
あと 953 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.022s