1 名前:デフォルトの名無しさん mailto:sage [2021/03/18(木) 22:08:43.71 ID:jtngtgXU0.net] !extend:checked:vvvvv:1000:512 ↑同じ内容を2行貼り付けるナリ ExcelのVBAに関する質問スレナリ コード書き込みや作成依頼もOKナリ ※前スレ Excel VBA 質問スレ Part69 https://mevius.5ch.net/test/read.cgi/tech/1607786543/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
411 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 10:42:21.10 ID:trooC9Gj0.net] For d = 日付1 To 日付2 R = R + 1 Cell(R , "D").Value = d Next d
412 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 10:49:18.11 ID:trooC9Gj0.net] 修正 columns("d").clearcontents 日付1 = Datesirial(適当に) 日付2 = Datesirial(適当に) For d = 日付1 To 日付2 R = R + 1 Cells(R , "D").Value = d Next d
413 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 10:58:25.82 ID:CqRWqB530.net] >>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 ↑こんな感じでしょうか?初心者すぎて変数宣言とかむずかしいです
414 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 11:09:05.98 ID:trooC9Gj0.net] まずあの上の命令はWorksheet changeじゃなくてユーザーフォームに書き込む ユーザーフォームを作らないといけないけど、適当に欄作って その空欄へ a1からc2の内容をすべて転記しないといせない ユーザーフォームの変更があったら逆にa1-c2へ反映 その上で入力用のユーザーフォームをどうにかして表示するところからスタートだね 絶対面倒くさい
415 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 11:14:02.50 ID:CqRWqB530.net] ユーザーフォームからA1、B1、C1に入力しB2に日付1を表示させ もう一つA2、B2、C2にもユーザーフォームから入力し日付2を表示させ 日付1から日付2までの期間のすべての日付をD1〜D7に表示したいのですが 初心者過ぎてむずかしいです ↑ユーザーフォーム経由じゃなくても 上記のようなエクセル表を作りたいのですが 簡単な方法ありますか?
416 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 11:14:40.82 ID:4pLy3lS70.net] >>410 全部Long型で宣言しないと あとはこれも宣言する Dim day As Long Dim R As Long そしてNext dayに直す
417 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 11:16:40.69 ID:trooC9Gj0.net] 変数名がdayだとvbaの標準命令のday(シリアル値)とかぶるからエラー起こさない?
418 名前:350 mailto:sage [2021/04/25(日) 11:25:35.70 ID:kagSPvTda.net] 予約語じゃなく関数名だから大丈夫じゃないかな ただ、関数を書いたときに頭文字が小文字になったり嫌だから避けるかな
419 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 11:39:20.76 ID:4pLy3lS70.net] >>414 あーそういう心配もあるのね 分かりやすく書いたつもりなんだけど
420 名前:350 mailto:sage [2021/04/25(日) 11:40:49.20 ID:kagSPvTda.net] 試してみると、同一スコープ内だと Dim day As Long day = VBA.day(Now()) Debug.Print day のように関数名を修飾しないとでした 当たり前か
421 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 12:09:23.12 ID:CqRWqB530.net] 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 こんな感じでしょうか?
422 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 12:12:35.21 ID:eytlE9OXa.net] 変数に日付1とかやるならdayも日付でよくね
423 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 12:36:35.37 ID:CqRWqB530.net] 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したいシートに記述してみたんですけど構文エラーになりました
424 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 12:41:57.46 ID:trooC9Gj0.net] 適当にってのは自分で好きな変数に書き換えろってことだぞ… あとapplication.enableevents=falseにしないと無限ループになるぞ 処理後はtrue あとdimをループの中に入れないで 詳しくはググって
425 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 12:43:38.04 ID:trooC9Gj0.net] あと If Intersect(Target, Range("A1:C2")) Is Nothing Or Target.Cells.Count > 6 Then Exit Sub こういうようなのを冒頭に入れないと、どこに何を入れても命令が実行されるから遅くなる
426 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 12:59:50.89 ID:kagSPvTda.net] 結果として上手くいっているのかもしれないけど、 R がループ内で宣言されていると、毎回初期化を期待しているみたいでイヤですね この場合、R の宣言はプロシジャの先頭にあるものとみなされるのだろうけど
427 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 13:05:39.55 ID:CqRWqB530.net] 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 ↑こんな感じでしょうか? 初心者すぎてすいません(汗
428 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 13:12:30.82 ID:trooC9Gj0.net] エナブルイベントの場所が違う exti subのあとにエナブル入れるべきだし 命令終了後にエナブルイベントをtrueにしないとチェンジイベントが実行されなくなる dateserialの構文はそもそも(変数年、変数月、変数日) ロングとかいう変数型をぶちこまれても困っちゃうのでは いっそダイレクトに日付1=(range("a1"),range("b1"),range("c1")) とかにしてもいいかもね とりあえず命令一個一個を自分で調べてから実行しないと身にならないよ
429 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 13:16:06.52 ID:trooC9Gj0.net] 間違えた 日付1=dateserial(range("a1"),range("b1"),range("c1")) そもそもcellはスペルミスだからcellsじゃないと実行されないと思う Cellsなどの命令は頭文字が大文字、残りは少文字になるはずだから、そうならないならスペルミスを疑ったほうが良い
430 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 13:37:02.20 ID:CqRWqB530.net] 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 こんな感じでしょうか? エナブルイベントについてググってみます
431 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 13:39:40.44 ID:trooC9Gj0.net] application.enableevents=trueをさいごにつけてくれ あとdim r as longの宣言は日付と一緒におこなって
432 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 13:44:43.40 ID:CqRWqB530.net] 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の宣言は日付と一緒におこなって ↑まったくわかりません(泣
433 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 14:00:05.29 ID:trooC9Gj0.net] 変数宣言の意味がわからないなら dim系の命令はいっそ全部消しても良いかもね よくみたら Dim 日付1 As Long Integer, 日付2 As Integer ロングインテガーとかいうわけわからん型にしてるし
434 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 14:15:56.57 ID:CqRWqB530.net] 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 こんな感じでしょうか?
435 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 14:43:47.53 ID:trooC9Gj0.net] なんでループまで消した!
436 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 14:48:07.76 ID:CqRWqB530.net] 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 こんな感じでしょうか?
437 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 15:14:07.43 ID:c8qfwm7na.net] どうせカッコが全角とかじゃね
438 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 15:22:01.39 ID:trooC9Gj0.net] あーもう 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
439 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 15:24:13.50 ID:trooC9Gj0.net] 間違えた 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
440 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 15:32:25.96 ID:CqRWqB530.net] >>436 すごい!! できました! コードを見て 私がが2ヶ月かかっても出来ないわけですね こんなむずかしいことに挑戦していたなんて・・・ これからも勉強していつかは人に教えれるようになりたいです。 感謝!!
441 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 15:36:23.25 ID:xxLFjq7K0.net] いつかじゃなくて今すぐ人に教えられるように理解しろ
442 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 15:37:54.87 ID:CqRWqB530.net] >>438 > いつかじゃなくて今すぐ人に教えられるように理解しろ ↑無理
443 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 17:53:19.26 ID:K6WUBqIf0.net] なんでいつもそんなに上から目線でマウント取ってくるの? 人格破綻者なの??
444 名前:デフォルトの名無しさん [2021/04/25(日) 18:16:22.33 ID:vAt0cvBk0.net] いつものあいつだろ
445 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 18:20:31.60 ID:nATm0Zraa.net] なになに役人のつくる書類よりはよほどまし 18ページ手前に書き込む内容が 3ページ後にアドレスをみなから手計算しなければならん おなじページに書けないのか こんなのが延々 50ページぐらい続く ひどいスパゲッテイだよ
446 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 18:33:35.35 ID:nATm0Zraa.net] 確定申告がこんなひといスパゲッテイだったとは
447 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 18:36:11.53 ID:rqvjO/ad0.net] 上から目線でマウントとる人は人格破綻者なのかw
448 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 21:25:32.74 ID:n+Zq8N/Kd.net] >>386 流石に多少やってる奴なら頭に書くのがそれじゃないと知ってる筈だが。
449 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 23:44:44.33 ID:B0d72kDU0.net] >>445 すまない 良く読んだら Option Scriptになってるな Option Explicitの間違いだ
450 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 01:31:30.42 ID:0lQeMWYV0.net] 牧野ここにも出没してんか? 暇なのか?あ?
451 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 06:59:23.61 ID:lovLRBcK0.net] だっさw
452 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 16:06:49.39 ID:0lQeMWYV0.net] 牧野の人気に嫉妬してるからよ
453 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 16:38:43.84 ID:g9sbyhzRa.net] どなたかGetOpenFilenameでカレントディレクトリが変更されるの何とかできませんか? 構造体はさっぱり分からんのです
454 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 17:20:54.81 ID:z51HLtPU0.net] 元のアクティブブックを変数にして 戻せばいいだけだろう どうせブック複数いじるなら変数のが便利だし
455 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 17:49:31.38 ID:g9sbyhzRa.net] >>450 ? なら戻しても間に合わんのです ダイアログの初期フォルダを指定したいのに、なぜかカレントディレクトリが勝手に変更されるみたいなんですね すみません舌ったらずでした
456 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 17:52:36.88 ID:Fs15ZcA/0.net] これ追加すりゃいいんじゃないの? ChDir ThisWorkbook.Path 自ブックのパスがいやなら 設定用シートでも作っといて そこに参照したいパス書いといて それをChDirに設定しとけば?
457 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 18:05:41.03 ID:g9sbyhzRa.net] いや、それがダメなんですよね chdirで設定したあとGetOpenFilenameを実行するとカレントディレクトリが変わって、で初期フォルダがあらぬ所に設定される 直前直後でdebug.print curdir入れて確認してるから、間違いなくGetOpenFilenameの段階で変更されてる……と思う? ユーザーフォーム上に置いて繰り返し実行してるけど、どうやら1回目に開いたダイアログを変更すると、変更先のディレクトリを覚えて、次から勝手にそこに変えてくれているみたい
458 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 18:10:37.42 ID:qBKi4u1A0.net] それネットワークドライブ?
459 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 18:15:43.70 ID:g9sbyhzRa.net] いや、Cです
460 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 18:27:36.92 ID:QRSOMQKpa.net] chdirは古いコマンドだから、なにかエラー出しているのかも
461 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 18:58:56.85 ID:+pOfqz7u0.net] カレントディレクトリを復元する際は、ChDriveとChDirをちゃんと両方やれよ
462 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 19:19:25.15 ID:/WVOYzSd0.net] 問題がよくわからん GetOpenFilename実行後にカレントディレクトリが変更されるって話なのか? だったら実行後に戻せって話 GetOpenFilenameでカレントが変更されるのはヘルプにも明示された仕様だからどうしようもない GetOpenFilenameの初期値がカレントディレクトリにならんって話なのか? だったらまずコード曝せ
463 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 21:18:48.90 ID:Qb9oKWtLd.net] ステップ実行でChDirとかGetOpenFilenameの引数を全部チェックしたか?
464 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 22:36:46.66 ID:lovLRBcK0.net] 今の子はもうカレントディレクトリ自体が謎仕様なのか
465 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 23:20:39.12 ID:xr7wJCbA0.net] >>376 だけど実引数がVariant型の参照渡しなら仮引数はカッコ付きのVariant型にできるのね 理由がよく分からないけど 配列のVariant型を引数にしたときの指定方法をパターン化したいんだけど全くわからん
466 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 23:57:08.69 ID:+pOfqz7u0.net] >>462 配列は配列の参照で受け渡すことが基本で、それはVariant型も同じ。 ただしVariant型は配列を格納できる。 Variant型の配列という意味ではなく、ひとつのVariant型の変数の中に 配列を格納できる。そこから考えてみたらいいと思うよ。
467 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 00:36:34.29 ID:9wjO2iUR0.net] >>463 >Variant型の配列という意味ではなく、ひとつのVariant型の変数の中に >配列を格納できる。 この発想は無かった、もう少し考えてみます ありがとう
468 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 01:04:32.91 ID:mgRy5CVU0.net] 中身のない()つけたら動的と勘違いするだろ
469 名前:デフォルトの名無しさん mailto:Sage [2021/04/27(火) 10:18:38.80 ID:5d+cCuuaa.net] >>459 2つ目と3つ目 ごめんなさい色々やって自決しました。変更先のフォルダ名にセミコロンが入ってたのがまずかったみたい。 どうしようもないので今回は諦めて違うことをします。お手数おかけしました。
470 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 10:32:17.76 ID:KMwaQK/30.net] >466 自決ってお前w
471 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 10:51:44.25 ID:KMwaQK/30.net] >>466 ちょっと試したけど、たしかにカレントディレクトリにセミコロンとか入ってると そこが初期位置にならんな カレントディレクトリを8.3形式で指定したらイケルっぽいぞ いまさら直る気がせんが気になるならマイクロソフトに報告してみ
472 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 19:06:09.30 ID:Xk0sjNEua.net] ここではもうとっくにエラー429については議論され尽くしましたか? 初心者なのですが、file system objectを読もうとしたらアクティブXがそれはできませんと出て、どうしてよいやら
473 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 19:49:18.21 ID:vIQbS3UC0.net] そんな用語使う初心者がいるか!
474 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 20:05:11.09 ID:Xk0sjNEua.net] え?
475 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 20:33:52.91 ID:Fi83YJTP0.net] な?
476 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 20:40:43.33 ID:ecHnxSib0.net] り?
477 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 20:45:59.35 ID:UpvbOzN+0.net] ほんぎゅろげええええええええ
478 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 23:48:49.38 ID:9wjO2iURH.net] 通常の=での代入でもVariantの()で宣言した変数には配列が入らないんだね Range型の複数セルが代入できるので勘違いしてた Range型が返す配列はVariant型だからできるっぽい? Variant型の()付き変数は配列じゃなければどんな意味があるのか?
479 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 00:12:42.15 ID:wZLkUEzX0.net] どんだけこだわるのよ
480 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 00:34:41.28 ID:oMne/ugv0.net] 自分は好き勝手やってるのに俺らだけ奴隷労働しろと ちょっとでも目立つのが気に入らんと
481 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 02:49:41.12 ID:R/cV679Q0.net] 他人の事情なんか配慮しないのがデキるプログラマー
482 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 03:25:04.10 ID:yYRagbWx0.net] >>475 Variantの()で宣言した変数はVariant配列型の変数で、Valueの戻り値もちゃんと代入できるよ ただし複数セルを参照しててValueが二次元配列を返すときに限る 一つのセルだけしか参照してない場合は配列を返さないので型不一致になる
483 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 05:59:25.47 ID:OKDjIMLh0.net] そういやvbaの配列は、 ・配列じゃない値 ・countが1の配列 これが微妙に違っていた気がする
484 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 07:14:02.38 ID:X/WADpVMH.net] >>480 何が言いたいのかわからん ほかの言語でも単純な変数と要素が1個の配列変数は厳密に区別されるのが普通だし
485 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 12:09:24.67 ID:Jq2bf8XLa.net] 配列にはいれっ
486 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 13:41:38.64 ID:K3oXR9qNa.net] 変数を反芻
487 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 14:02:46.34 ID:GqNxFOs40.net] Excelのオブジェクトを操作したときの動きからVBAの仕様を推測して 混乱してるように見えるな。質問スレじゃなくて、VBAについて教えて くれる人や本やサイトを探した方がいいんじゃないか。
488 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 19:07:20.75 ID:fsi6lQwja.net] ベテランの初心者がきました よろぴく
489 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 19:31:32.06 ID:xYFjFFNHa.net] エラー429は自力で解決したのでもういいです。
490 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 19:41:38.21 ID:xYFjFFNHa.net] 理由はただの書き間違いでした。
491 名前:デフォルトの名無しさん [2021/04/28(水) 19:45:56.67 ID:Sz6ocakQM.net] 429 = 死肉
492 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 23:01:14.39 ID:gO4+NyeW0.net] >>479 Variant型の配列っていうのがあるんだね 配列でないVariant型ならデータが入っていればVariant型ではない(代入した型に変換される) だからデータが入っているVariant型の配列って無いと思ってた これ以上は切りが無くなりそうなので止めます ありがとう
493 名前:デフォルトの名無しさん mailto:sage [2021/04/29(木) 02:21:41.91 ID:EFUE1W1F0.net] 最初から配列であることを宣言した場合と、 Variantに配列をぶっこんだ場合は、 区別しないといけない
494 名前:デフォルトの名無しさん mailto:sage [2021/04/29(木) 03:35:54.80 ID:xPFf86S80.net] Variant型は調べれば調べるほど「???」ってなるから気をつけて VB.Netでは廃止されたくらいの型だから 俺も最初調べててVariant型って内部型とか持ってるし 代入したものの参照でも抱えているだけのものと高を括ってたけど Variant型の配列を作ってある要素には値型、ある要素には参照型を設定して関数の引数に値渡しで渡すと きちんと値型の部分は値が、参照型の部分は参照が渡されるのは少し前にレスした通り そもそも何で配列の値渡しは出来ないのにVariant型に入れると値渡しが出来るような思想で作られているのかも謎。そういうものだと思う他ない。 VBAがObject指向に片足を突っ込んでいるところで止まっているせいか、Objectでもそうでないものも代入出来る型として存在していて使い勝手が良い反面、 コンパイル時に内部型が違う場合でもエラーにならないから実行時に初めてエラーとなって気がついたり、 違う型のものを上書いてしまってエラーとならずに期待した挙動と変わってしまう場合が出て来る恐ろしい型でもある。 Variant型を使うなとは言えないけど 使う際にはその特性と挙動を十分把握していないと、ちょっと何か変わったことをしただけで期待した結果が得られないことになり得るから十分気をつけてね。
495 名前:デフォルトの名無しさん mailto:sage [2021/04/29(木) 03:54:38.48 ID:xPFf86S80.net] 余談だけど他の言語にも 例えばJavaScriptやC#には変数宣言する際に、型にvarって宣言することがあるけど、これはVariableと言って全然別物で 最初に代入した値の型をJavaScriptでは暗黙的に、C#では型推論で持ち回るものだから、もし、今後そう言った別言語を扱うことがあれば そういうものだと覚えておけば勘違いしなくて済むよ。
496 名前:デフォルトの名無しさん mailto:sage [2021/04/29(木) 06:09:50.46 ID:S4zpEuOGH.net] Variant型っていうのはVBAやVBのために作られたわけじゃない もともとWindowクラスが持ってる機能に対して、演算子をオーバーロードした物
497 名前:デフォルトの名無しさん mailto:sage [2021/04/29(木) 06:17:04.92 ID:K+5EoiH2M.net] >>491 > VB.Netでは廃止されたくらいの型だから 単にObject型になっただけ 使い勝手が違うのはVB.NETの方が方に厳しいから暗黙の型変換をしなかったりするため
498 名前:デフォルトの名無しさん mailto:sage [2021/04/29(木) 06:50:30.24 ID:S4zpEuOGH.net] >>494 VariantとObjectは同じような物とか代替品として紹介してるサイトとかあるけど、これはあくまでも初心者向けの説明 実際はまったく違う物なので、個人的にはこうやって説明するのも反対したいところ
499 名前:デフォルトの名無しさん mailto:sage [2021/04/29(木) 07:11:32.09 ID:uNZAJPBsM.net] >>495 はあ? 違うと言うならどう違うのか書いてみなよ まさかと思うけどVBAのObjectの話じゃないよな?
500 名前:デフォルトの名無しさん mailto:sage [2021/04/29(木) 07:11:42.35 ID:xPFf86S80.net] >>495 そうなんだよね Variantの代わりがObjectだと言われると うーん、まぁ間違っていないとは思うけど 物凄い違和感を感じるよね。 同じものかと言われれば絶対別物と はっきり言うことが出来るけど。
501 名前:デフォルトの名無しさん mailto:sage [2021/04/29(木) 07:17:49.07 ID:xPFf86S80.net] >>496 そうだねぇ とりあえずこんなところかねぇ ちなみに、何でも入る魔法の型といえば、C#ではobject型がそれに当たる。しかし、object型とVariant型は同じではない。object型は参照型であり、値型の値を扱うにはボックス化という手順が必要になる。また、参照型である以上、メモリの確保と破棄というオーバーヘッドが必ず付いて回る。しかし、Variant型は整数のような値であっても、オブジェクトへの参照であっても、それをそのまま格納できる。ボックス化やメモリの確保、解放のオーバーヘッドもない。まさに万能の魔法の箱である。 https://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_12/extremecs_12_02.html
502 名前:デフォルトの名無しさん mailto:sage [2021/04/29(木) 07:22:43.60 ID:r4t8KOvl0.net] >>493 >演算子をオーバーロードした物 どの演算子? >>498 これってヒープ領域に全部突っ込んでるってこと?
503 名前:デフォルトの名無しさん mailto:sage [2021/04/29(木) 07:23:03.00 ID:r4t8KOvl0.net] なわけないか
504 名前:デフォルトの名無しさん mailto:sage [2021/04/29(木) 07:25:47.75 ID:iJcHPvsoa.net] VBAとVB.netはまったく別物で比較しようなんて思わない 標準がバリアントなんだからできるだけバリアントを使うべきだし 値渡しの件も、VBAでは値渡しのが原則なんだから 値渡しのオンリーにすべきとおもうけど どうしても参照渡したいならパブリックにするだけ
505 名前:デフォルトの名無しさん mailto:sage [2021/04/29(木) 07:36:18.54 ID:xmHZYPrVM.net] >>498 そこまで言うならStructureでVariant相当のものを作ればいいかと >>499 > これってヒープ領域に全部突っ込んでるってこと? そう言うこと
506 名前:デフォルトの名無しさん mailto:sage [2021/04/29(木) 07:48:54.45 ID:S4zpEuOGH.net] >>499 算術演算子などで文字列を自動的に数値に変換する部分 >>501 厳密な説明をするなら、Variantは暗黙ではあるけど標準ではない 納得いかない人もいるだろうけど、強いて言うなら標準に近いのはObject型の方 Variant型はWindowクラスからの継承だから、VBでもVBAでも、もっと別の言語でも内部ではまったく同じ物で同じ処理が動いてる 何を使う「べき」かはケースバイケース
507 名前:デフォルトの名無しさん mailto:sage [2021/04/29(木) 07:55:26.52 ID:r4t8KOvl0.net] >>502 冗談で言ったらマジか まぁオブジェクトは参照になるなら、ヒープ領域云々はそこまで考えなくてもいいか vbaの文字列は文字の配列じゃなく単に値だったから、variantで文字列使いまくると良くない? ※そもそも値じゃなかったらごめん
508 名前:デフォルトの名無しさん mailto:sage [2021/04/29(木) 08:01:54.76 ID:xPFf86S80.net] >>503 へぇ VBAやVB6みたいにVariant型みたいなもの 持ってる言語って他にもあるんだ まだ当たったことないなぁ
509 名前:デフォルトの名無しさん mailto:sage [2021/04/29(木) 08:12:11.05 ID:iJcHPvsoa.net] VBのときに他の言語がどうこうと長話はじめるのは老害みたいなもの 気をつけたほうがよい
510 名前:デフォルトの名無しさん mailto:sage [2021/04/29(木) 08:17:52.33 ID:xPFf86S80.net] 老害だもの みつを
511 名前:デフォルトの名無しさん mailto:sage [2021/04/29(木) 08:45:33.51 ID:530kL6INd.net] >>505 VBS もしかして知っててわざと試してる?