X



Excel VBA 質問スレ Part70

■ このスレッドは過去ログ倉庫に格納されています
0392デフォルトの名無しさん (ワッチョイ 1e01-K+SG)
垢版 |
2021/04/25(日) 00:02:34.42ID:trooC9Gj0
特にすごいのが他のアプリの操作機能
今まで月に4時間へばりつかないといけなかったのへばり付かないといけなかったの作業が40分で済む
その間することないからスマホいじるか昼食中に動かしても良い
エクセル神すぎん?
0396デフォルトの名無しさん (ワッチョイ 3af0-3cD6)
垢版 |
2021/04/25(日) 09:13:58.07ID:CqRWqB530
Sub 文字列から日付()
ThisWorkbook.Worksheets("1").Activate
With ActiveSheet
Dim yy As Integer, mm As Integer, dd As Integer
yy = Worksheets("1").Range("A1").Value
mm = Worksheets("1").Range("B1").Value
dd = Worksheets("1").Range("C1").Value
Worksheets("1").Range("B2") = DateSerial(Year:=yy, Month:=mm, Day:=dd)
End With
End Sub

自動でB2の日付が変更するようにしたいのですが
どうしたらいいかわかりません

ActivateではなくChangrイベントだと思いますが
どこにどのように記述したらいいのでしょうか?

ここの先生たちにいつもお世話になってます
初心者にご教授してください
0399デフォルトの名無しさん (ワッチョイ 3af0-3cD6)
垢版 |
2021/04/25(日) 10:04:58.97ID:CqRWqB530
DATE関数?
=DATE(A1,A2,A3)
↑これですか?

やってみたのですが、なぜか自動計算されないときがあったので

ユーザーフォームからA1、B1、C1に入力しB2に日付1を表示させ
もう一つA2、B2、C2にもユーザーフォームから入力し日付2を表示させ

日付1から日付2までの期間のすべての日付をD1〜D999に表示したいのですが
初心者過ぎてむずかしいです
0402デフォルトの名無しさん (ワッチョイ 1e01-K+SG)
垢版 |
2021/04/25(日) 10:27:00.72ID:trooC9Gj0
注意
標準モジュールではなくお目当てのシートモジュールに記載すること
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A1:C1")) Is Nothing Or Target.Cells.Count > 3 Then Exit Sub
Application.EnableEvents = False
Dim yy As Integer, mm As Integer, dd As Integer
yy = Range("A1").Value
mm = Range("B1").Value
dd = Range("C1").Value
Range("B2") = DateSerial(Year:=yy, Month:=mm, Day:=dd)
Application.EnableEvents = True
End Sub
0410デフォルトの名無しさん (ワッチョイ 3af0-3cD6)
垢版 |
2021/04/25(日) 10:58:25.82ID:CqRWqB530
>>406
アドバイスありがとうございます!
初心者なのですが業務上ユーザーフォームを使わなければならなくて(泣
Private Sub Worksheet_Change(ByVal Target As Range)
Dim 日付1 As Integer, 日付2 As Integer
日付1 = Datesirial(適当に)
日付2 = Datesirial(適当に)

For day = 日付1 To 日付2
R = R + 1
Cell(R , "D").Value = day
Next d

End Sub

↑こんな感じでしょうか?初心者すぎて変数宣言とかむずかしいです
0411デフォルトの名無しさん (ワッチョイ 1e01-K+SG)
垢版 |
2021/04/25(日) 11:09:05.98ID:trooC9Gj0
まずあの上の命令はWorksheet changeじゃなくてユーザーフォームに書き込む
ユーザーフォームを作らないといけないけど、適当に欄作って
その空欄へ
a1からc2の内容をすべて転記しないといせない
ユーザーフォームの変更があったら逆にa1-c2へ反映

その上で入力用のユーザーフォームをどうにかして表示するところからスタートだね
絶対面倒くさい
0412デフォルトの名無しさん (ワッチョイ 3af0-3cD6)
垢版 |
2021/04/25(日) 11:14:02.50ID:CqRWqB530
ユーザーフォームからA1、B1、C1に入力しB2に日付1を表示させ
もう一つA2、B2、C2にもユーザーフォームから入力し日付2を表示させ

日付1から日付2までの期間のすべての日付をD1〜D7に表示したいのですが
初心者過ぎてむずかしいです

↑ユーザーフォーム経由じゃなくても
上記のようなエクセル表を作りたいのですが
簡単な方法ありますか?
0415350 (アウアウウー Sa83-jiG2)
垢版 |
2021/04/25(日) 11:25:35.70ID:kagSPvTda
予約語じゃなく関数名だから大丈夫じゃないかな
ただ、関数を書いたときに頭文字が小文字になったり嫌だから避けるかな
0417350 (アウアウウー Sa83-jiG2)
垢版 |
2021/04/25(日) 11:40:49.20ID:kagSPvTda
試してみると、同一スコープ内だと
Dim day As Long
day = VBA.day(Now())
Debug.Print day
のように関数名を修飾しないとでした
当たり前か
0418デフォルトの名無しさん (ワッチョイ 3af0-3cD6)
垢版 |
2021/04/25(日) 12:09:23.12ID:CqRWqB530
Private Sub Worksheet_Change(ByVal Target As Range)
Dim 日付1 As Long Integer, 日付2 As Integer
日付1 = Datesirial(適当に)
日付2 = Datesirial(適当に)

For day = 日付1 To 日付2
Dim R As Long

R = R + 1
Cell(R , "D").Value = day
Next day

End Sub

こんな感じでしょうか?
0420デフォルトの名無しさん (ワッチョイ 3af0-3cD6)
垢版 |
2021/04/25(日) 12:36:35.37ID:CqRWqB530
Private Sub Worksheet_Change(ByVal Target As Range)
Dim 日付1 As Long Integer, 日付2 As Integer
日付1 = Datesirial(適当に)
日付2 = Datesirial(適当に)

For day = 日付1 To 日付2
Dim R As Long

R = R + 1
Cell(R , "D").Value = day
Next day

End Sub

Changeしたいシートに記述してみたんですけど構文エラーになりました
0421デフォルトの名無しさん (ワッチョイ 1e01-K+SG)
垢版 |
2021/04/25(日) 12:41:57.46ID:trooC9Gj0
適当にってのは自分で好きな変数に書き換えろってことだぞ…
あとapplication.enableevents=falseにしないと無限ループになるぞ
処理後はtrue
あとdimをループの中に入れないで
詳しくはググって
0422デフォルトの名無しさん (ワッチョイ 1e01-K+SG)
垢版 |
2021/04/25(日) 12:43:38.04ID:trooC9Gj0
あと
If Intersect(Target, Range("A1:C2")) Is Nothing Or Target.Cells.Count > 6 Then Exit Sub

こういうようなのを冒頭に入れないと、どこに何を入れても命令が実行されるから遅くなる
0423デフォルトの名無しさん (アウアウウー Sa83-jiG2)
垢版 |
2021/04/25(日) 12:59:50.89ID:kagSPvTda
結果として上手くいっているのかもしれないけど、
R がループ内で宣言されていると、毎回初期化を期待しているみたいでイヤですね
この場合、R の宣言はプロシジャの先頭にあるものとみなされるのだろうけど
0424デフォルトの名無しさん (ワッチョイ 3af0-3cD6)
垢版 |
2021/04/25(日) 13:05:39.55ID:CqRWqB530
Private Sub Worksheet_Change(ByVal Target As Range)
application.enableevents=false
If Intersect(Target, Range("A1:C2")) Is Nothing Or Target.Cells.Count > 6 Then Exit Sub
Dim 日付1 As Long Integer, 日付2 As Integer
日付1 = Datesirial(Long)
日付2 = Datesirial(Long)

For day = 日付1 To 日付2
Dim R As Long

R = R + 1
Cell(R , "D").Value = day
Next day

End Sub

↑こんな感じでしょうか?
初心者すぎてすいません(汗
0425デフォルトの名無しさん (ワッチョイ 1e01-K+SG)
垢版 |
2021/04/25(日) 13:12:30.82ID:trooC9Gj0
エナブルイベントの場所が違う
exti subのあとにエナブル入れるべきだし
命令終了後にエナブルイベントをtrueにしないとチェンジイベントが実行されなくなる
dateserialの構文はそもそも(変数年、変数月、変数日)
ロングとかいう変数型をぶちこまれても困っちゃうのでは

いっそダイレクトに日付1=(range("a1"),range("b1"),range("c1"))
とかにしてもいいかもね

とりあえず命令一個一個を自分で調べてから実行しないと身にならないよ
0426デフォルトの名無しさん (ワッチョイ 1e01-K+SG)
垢版 |
2021/04/25(日) 13:16:06.52ID:trooC9Gj0
間違えた
日付1=dateserial(range("a1"),range("b1"),range("c1"))
そもそもcellはスペルミスだからcellsじゃないと実行されないと思う
Cellsなどの命令は頭文字が大文字、残りは少文字になるはずだから、そうならないならスペルミスを疑ったほうが良い
0427デフォルトの名無しさん (ワッチョイ 3af0-3cD6)
垢版 |
2021/04/25(日) 13:37:02.20ID:CqRWqB530
Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("A1:C2")) Is Nothing Or Target.Cells.Count > 6 Then Exit Sub
application.enableevents=false

Dim 日付1 As Long Integer, 日付2 As Integer
日付1 = dateserial(range("a1"),range("b1"),range("c1"))
日付2 = dateserial(range("a2"),range("b2"),range("c2"))

For day = 日付1 To 日付2
Dim R As Long

R = R + 1
Cell(R , "D").Value = day
Next day

End Sub

こんな感じでしょうか?
エナブルイベントについてググってみます
0429デフォルトの名無しさん (ワッチョイ 3af0-3cD6)
垢版 |
2021/04/25(日) 13:44:43.40ID:CqRWqB530
Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("A1:C2")) Is Nothing Or Target.Cells.Count > 6 Then Exit Sub
application.enableevents=false

Dim 日付1 As Long Integer, 日付2 As Integer
日付1 = dateserial(range("a1"),range("b1"),range("c1"))
日付2 = dateserial(range("a2"),range("b2"),range("c2"))

For day = 日付1 To 日付2
Dim R As Long

R = R + 1
Cell(R , "D").Value = day
Next day

application.enableevents=true
End Sub

>>あとdim r as longの宣言は日付と一緒におこなって
↑まったくわかりません(泣
0430デフォルトの名無しさん (ワッチョイ 1e01-K+SG)
垢版 |
2021/04/25(日) 14:00:05.29ID:trooC9Gj0
変数宣言の意味がわからないなら
dim系の命令はいっそ全部消しても良いかもね
よくみたら

Dim 日付1 As Long Integer, 日付2 As Integer

ロングインテガーとかいうわけわからん型にしてるし
0431デフォルトの名無しさん (ワッチョイ 3af0-3cD6)
垢版 |
2021/04/25(日) 14:15:56.57ID:CqRWqB530
Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("A1:C2")) Is Nothing Or Target.Cells.Count > 6 Then Exit Sub
application.enableevents=false

Worksheets("1").Range("D1")= dateserial(range("a1"),range("b1"),range("c1"))
Worksheets("1").Range("D2") = dateserial(range("a2"),range("b2"),range("c2"))

End Sub

こんな感じでしょうか?
0433デフォルトの名無しさん (ワッチョイ 3af0-3cD6)
垢版 |
2021/04/25(日) 14:48:07.76ID:CqRWqB530
Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("A1:C2")) Is Nothing Or Target.Cells.Count > 6 Then Exit Sub
application.enableevents=false

Worksheets("1").Range("D1")= dateserial(range("a1"),range("b1"),range("c1"))
Worksheets("1").Range("D2") = dateserial(range("a2"),range("b2"),range("c2"))

R = R + 1
Cell(R , "D").Value = day
Next day

End Sub

こんな感じでしょうか?
0435デフォルトの名無しさん (ワッチョイ 1e01-K+SG)
垢版 |
2021/04/25(日) 15:22:01.39ID:trooC9Gj0
あーもう
Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("A1:C2")) Is Nothing Or Target.Cells.Count > 6 Then Exit Sub
application.enableevents=false


日付1 = dateserial(range("a1"),range("b1"),range("c1"))
日付2 = dateserial(range("a2"),range("b2"),range("c2"))

For 日付 = 日付1 To 日付2

R = R + 1
Cell(R , "D").Value = 日付
Next

application.enableevents=true
End Sub
0436デフォルトの名無しさん (ワッチョイ 1e01-K+SG)
垢版 |
2021/04/25(日) 15:24:13.50ID:trooC9Gj0
間違えた
Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("A1:C2")) Is Nothing Or Target.Cells.Count > 6 Then Exit Sub
columns("d").clearcontents
application.enableevents=false


日付1 = dateserial(range("a1"),range("b1"),range("c1"))
日付2 = dateserial(range("a2"),range("b2"),range("c2"))

For 日付 = 日付1 To 日付2

R = R + 1
Cells(R , "D") = 日付
Next

application.enableevents=true
End Sub
0437デフォルトの名無しさん (ワッチョイ 3af0-3cD6)
垢版 |
2021/04/25(日) 15:32:25.96ID:CqRWqB530
>>436
すごい!!
できました!
コードを見て
私がが2ヶ月かかっても出来ないわけですね
こんなむずかしいことに挑戦していたなんて・・・

これからも勉強していつかは人に教えれるようになりたいです。

感謝!!
0441デフォルトの名無しさん (ワッチョイ 968e-iMGS)
垢版 |
2021/04/25(日) 18:16:22.33ID:vAt0cvBk0
いつものあいつだろ
0442デフォルトの名無しさん (アウアウウー Sab5-4hJQ)
垢版 |
2021/04/25(日) 18:20:31.60ID:nATm0Zraa
なになに役人のつくる書類よりはよほどまし
18ページ手前に書き込む内容が
3ページ後にアドレスをみなから手計算しなければならん
おなじページに書けないのか
こんなのが延々 50ページぐらい続く
ひどいスパゲッテイだよ
0453デフォルトの名無しさん (ワッチョイ f64f-Opq7)
垢版 |
2021/04/26(月) 17:52:36.88ID:Fs15ZcA/0
これ追加すりゃいいんじゃないの?
ChDir ThisWorkbook.Path

自ブックのパスがいやなら
設定用シートでも作っといて
そこに参照したいパス書いといて
それをChDirに設定しとけば?
0454デフォルトの名無しさん (アウアウウー Sa30-rqav)
垢版 |
2021/04/26(月) 18:05:41.03ID:g9sbyhzRa
いや、それがダメなんですよね
chdirで設定したあとGetOpenFilenameを実行するとカレントディレクトリが変わって、で初期フォルダがあらぬ所に設定される
直前直後でdebug.print curdir入れて確認してるから、間違いなくGetOpenFilenameの段階で変更されてる……と思う?

ユーザーフォーム上に置いて繰り返し実行してるけど、どうやら1回目に開いたダイアログを変更すると、変更先のディレクトリを覚えて、次から勝手にそこに変えてくれているみたい
0459デフォルトの名無しさん (ワッチョイ 412f-42zS)
垢版 |
2021/04/26(月) 19:19:25.15ID:/WVOYzSd0
問題がよくわからん
GetOpenFilename実行後にカレントディレクトリが変更されるって話なのか?
だったら実行後に戻せって話
GetOpenFilenameでカレントが変更されるのはヘルプにも明示された仕様だからどうしようもない

GetOpenFilenameの初期値がカレントディレクトリにならんって話なのか?
だったらまずコード曝せ
0462デフォルトの名無しさん (ワッチョイ 154f-0NDc)
垢版 |
2021/04/26(月) 23:20:39.12ID:xr7wJCbA0
>>376だけど実引数がVariant型の参照渡しなら仮引数はカッコ付きのVariant型にできるのね
理由がよく分からないけど
配列のVariant型を引数にしたときの指定方法をパターン化したいんだけど全くわからん
0463デフォルトの名無しさん (ワッチョイ ac49-8Khg)
垢版 |
2021/04/26(月) 23:57:08.69ID:+pOfqz7u0
>>462
配列は配列の参照で受け渡すことが基本で、それはVariant型も同じ。
ただしVariant型は配列を格納できる。
Variant型の配列という意味ではなく、ひとつのVariant型の変数の中に
配列を格納できる。そこから考えてみたらいいと思うよ。
0466デフォルトの名無しさん (アウアウウー Sa30-rqav)
垢版 |
2021/04/27(火) 10:18:38.80ID:5d+cCuuaa
>>459
2つ目と3つ目
ごめんなさい色々やって自決しました。変更先のフォルダ名にセミコロンが入ってたのがまずかったみたい。
どうしようもないので今回は諦めて違うことをします。お手数おかけしました。
0468デフォルトの名無しさん (ワッチョイ 412f-42zS)
垢版 |
2021/04/27(火) 10:51:44.25ID:KMwaQK/30
>>466
ちょっと試したけど、たしかにカレントディレクトリにセミコロンとか入ってると
そこが初期位置にならんな

カレントディレクトリを8.3形式で指定したらイケルっぽいぞ
いまさら直る気がせんが気になるならマイクロソフトに報告してみ
0469デフォルトの名無しさん (アウアウエー Sa66-qRZI)
垢版 |
2021/04/27(火) 19:06:09.30ID:Xk0sjNEua
ここではもうとっくにエラー429については議論され尽くしましたか?
初心者なのですが、file system objectを読もうとしたらアクティブXがそれはできませんと出て、どうしてよいやら
0475デフォルトの名無しさん (JP 0H7d-0NDc)
垢版 |
2021/04/27(火) 23:48:49.38ID:9wjO2iURH
通常の=での代入でもVariantの()で宣言した変数には配列が入らないんだね
Range型の複数セルが代入できるので勘違いしてた
Range型が返す配列はVariant型だからできるっぽい?
Variant型の()付き変数は配列じゃなければどんな意味があるのか?
0479デフォルトの名無しさん (ワッチョイ b701-Bsub)
垢版 |
2021/04/28(水) 03:25:04.10ID:yYRagbWx0
>>475
Variantの()で宣言した変数はVariant配列型の変数で、Valueの戻り値もちゃんと代入できるよ
ただし複数セルを参照しててValueが二次元配列を返すときに限る
一つのセルだけしか参照してない場合は配列を返さないので型不一致になる
0484デフォルトの名無しさん (ワッチョイ ac49-8Khg)
垢版 |
2021/04/28(水) 14:02:46.34ID:GqNxFOs40
Excelのオブジェクトを操作したときの動きからVBAの仕様を推測して
混乱してるように見えるな。質問スレじゃなくて、VBAについて教えて
くれる人や本やサイトを探した方がいいんじゃないか。
0488デフォルトの名無しさん (ラクッペペ MM34-4uvq)
垢版 |
2021/04/28(水) 19:45:56.67ID:Sz6ocakQM
429 = 死肉
■ このスレッドは過去ログ倉庫に格納されています

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