1 名前:デフォルトの名無しさん mailto:sage [2021/07/18(日) 08:42:15.37 ID:KskL7bEXd.net] !extend:checked:vvvvv:1000:512 ↑同じ内容を2行貼り付けるナリ ExcelのVBAに関する質問スレナリ コード書き込みや作成依頼もOKナリ ※前スレ Excel VBA 質問スレ Part70 https://mevius.5ch.net/test/read.cgi/tech/1616072923/ Excel VBA 質問スレ Part71 https://mevius.5ch.net/test/read.cgi/tech/1621914481/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
488 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 14:43:20.07 ID:MQNa+Oeo0.net] >>475 「B1が変更」かつ「B2が入力済み」の場合にも処理されるようにするのはどうでしょうか。 後、B1B2が数値である保証がないのも気になりました。 冒頭(Early Returnの部分)を If Target.Address <> "$B$2" and Target.Address <> "$B$1" Then Exit Sub If (VarType(Range("B1").Value) <> vbDouble) Then Exit Sub If (VarType(Range("B2").Value) <> vbDouble) Then Exit Sub に修正し、 Target.Value - Target.Offset(-1).Value 等の部分を具体的にRange("B1")の様にしてみて下さい。
489 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 16:54:07.44 ID:HPpKMPwN0.net] いまだにテーブル機能を表のレイアウトの見栄えよくする機能だと思っている人いるんだなマジで。 興味ないとそんなもんだよね
490 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 17:27:51.79 ID:Ko30HHoCa.net] Vlookupなんてテーブルありきの仕様(範囲可変対応、速度、列指定等…)だし、 VBA使う時はForで範囲の中の値をループ処理するのはテーブル使うのが1番完結かつ読み手に伝わりやすい(と思う) 興味ない人は触れることもないんだろうなぁと思うと寂しいね
491 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 18:51:34.24 ID:Dh6ZDsQC0.net] VBA達人の皆さんありがとうございます 早速試してみます 皆さんはどのように勉強されたのですか? VBA2年目ですがまだまだ初心者から脱却できません
492 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 18:51:53.98 ID:HPpKMPwN0.net] まだ良いよ 見栄えよくすると思い込んでいて、何でもかんでもテーブルに変換する同僚がいるから 出力でそれやられると見辛い
493 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 19:17:27.00 ID:zvWaH7NU0.net] >>488 色々書きまくるしかない あと、たまには違う言語を触ってみるのも良いと思う 簡単なゲーム作るとか
494 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 20:37:12.04 ID:fD7XP3Na0.net] 変数を日本語にすると頭に入りやすい
495 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 20:55:03.16 ID:Dh6ZDsQC0.net] >>490 > >>488 > 色々書きまくるしかない > あと、たまには違う言語を触ってみるのも良いと思う > 簡単なゲーム作るとか 色々簡単なことから挑戦していきます
496 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 20:57:12.23 ID:Dh6ZDsQC0.net] >>491 日本語に訳して覚えてみます
497 名前:デフォルトの名無しさん [2021/08/13(金) 21:57:30.74 ID:IVydqk9y0.net] >>479 やっぱりどう考えてもVBAで数値計算って無理がありそうですよね 数値計算自体も偏微分方程式の解を求めたり、モンテカルロで期待値を求めたりするので、結構重いです・・・ 学生なんで確信を持って言えないのですが、恐らく就職希望している業界がVBAとc++がメインなのでVBAで数値計算をできるようになっておく必要があると思います。 とりあえずまだ時間があるので、一度自分でVBAで書いてみてからデメリットを実感して見ようかと思います
498 名前:デフォルトの名無しさん [2021/08/13(金) 21:59:38.88 ID:IVydqk9y0.net] >>481 確かにそうですね・・・ 正直言語の違いなんて手段の違い程度しかないとは思うので結局責任を取れるくらい、周りと話をつけたり、しっかり計画を詰めるほうが重要ですよね
499 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 22:15:24.05 ID:al2VsHhL0.net] その分野には詳しくないんだが、不向きなのに何故VBAを数値計算に使うんだ? エクセルならVBA使わずとも関数とかソルバーで出来るんじゃない?
500 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 22:24:34.19 ID:zvWaH7NU0.net] >>494 それ就職先に直接問い合わせた方が良いぞ vbaとc++を使う業界って聞いたことない。なにかの間違いだろう
501 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 23:20:47.22 ID:WIfN9845M.net] 賑わってるね
502 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 00:11:33.82 ID:p2FjIi+P0.net] >>497 あっ…なるほど(察し
503 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 00:32:25.73 ID:8xoU1q0D0.net] 夏季休暇に突入したぜウェーイ!
504 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 03:50:50.70 ID:2+Zp3qYIa.net] c++とvbaを両方とも使うのありますよ ターボファンの3次元ブレード図面の自動生成をする為に autoCAD用APIをc++使ってdirectXのシェーダーでやり 流体計算はcudaの並列計算する一方で ユーザーインターフェースはExcelVBAで寸法入力させるんですよ
505 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 07:34:08.52 ID:olTKpvXL0.net] 何度も申し訳ありません 期間の日付をA5〜A100に自動で打ちあがるようにしたいのですが 例えばB1に整数3が入りB2に整数5が入った場合 A5〜A7に3、4、5 と自動で打ちあがるようにしたいです B2に整数以外が文字などが入る場合は 例えばB1に3B2に英字のKが入った場合 A5に3A6にK が打ち上がるようにしたいのですが 下記コードだと2回目以降はB1の値が変わっただけでは発火しないので B2も変更しなければなりません B1の値が変更されたら即発火させるにはどのようなコードで記述したらいいのでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Target.Address <> "$B$2" And Target.Address <> "$B$1" Then Exit Sub Range("A5:A100").Clear Dim cnt As Long Dim i As Long, j As Long j = 0 cnt = Target.Value - Target.Offset(-1).Value For i = 5 To cnt + 5 Cells(i, 1) = Target.Offset(-1).Value + j Cells(i, 1).NumberFormatLocal = "@" j = j + 1 Next i End Sub
506 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 07:41:00.78 ID:X5b04eQGM.net] 打ちあがるって何?
507 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 07:49:40.96 ID:WRC7pvXs0.net] >>502 「はじめの整数」と「終わりの整数」を指定し、 「その間の数字を個別に整数で出力」したい ・B1が最初、B2が最後。ここは手で入力 ・B1かB2どちらかを更新すると以下が走る ・出力範囲はA5:A100 ・出力範囲は無条件で毎回clear ・整数以外の場合は、B1とB2の内容がA5とA6にコピー >>503 「出力」の意味だろう
508 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 08:01:31.03 ID:olTKpvXL0.net] >>503 > 打ちあがるって何? すいません 出力です!
509 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 08:04:36.53 ID:olTKpvXL0.net] >>504 その通りでございます。 B2には整数以外が入る場合もありますので その場合はB1の整数だけが出力されればいいです
510 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 08:16:43.15 ID:FeW4uPBDM.net] IsNumericでB2を判定してTrueならFor文を走らせて、FalseならB2をA6へ
511 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 08:16:49.28 ID:WRC7pvXs0.net] >>502 Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo err 'B1B2じゃなければ終了 If Intersect(Target, Range("B1:b2")) Is Nothing Then Exit Sub 'とりあえずクリア Range("A5:A100").Clear 'メイン。整数じゃなければerrに飛んでコピーして終わり。trycacheみたいな事がしたかった 最初 = Cells(1, 2) 最後 = Cells(2, 2) ' If (Int(最初) = 最初 And Int(最後) = 最後) Then 行 = 5 For i = 最初 To 最後 Cells(行, 1) = i 行 = 行 + 1 Next Exit Sub End If '整数以外 err: Range("a5:a6").Value = Range("B1:b2").Value End Sub
512 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 08:17:31.92 ID:WRC7pvXs0.net] >>507 numericだと小数のときにめんどくさくなるよ エラーで飛ばしたほうが早い
513 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 08:32:21.96 ID:olTKpvXL0.net] >>508 ありがとうございます! まじすごい 半年ぐらい考えて調べてやってみて 全然できなかったのに 一瞬でできるなんて… プロの方ですか?
514 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 08:34:31.28 ID:FeW4uPBDM.net] あぁそうか整数の時だけなのか でもOnErrorResumeNextはバグを見逃しやすくなるから個人的にはあんまり使いたくねぇなぁ lsNumenic(B2)の後にB2=CLng(B2)で整数判定かけるのってどう?……見辛くなるか
515 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 09:09:38.05 ID:LMRL1zmta.net] >>502 がそもそも何で質問の様な動作になるかがわかってないとこれからも簡単なことでつまずくと思うよ 当初と違って最初のif分に「Target.Address <> "$B$1"」が含まれたことでB1でも下のロジックが動くようになったけど 「cnt = Target.Value - Target.Offset(-1).Value」これがB1がTargetだと右のOffsetが存在しないから以降のコードが正しく動作しない状態になってる B2→Target.ValueはB2、Target.Offset(-1)はB1 B1→Target.ValueはB1、Target.Offset(-1)は存在しないセルなのでエラー ここをB1でもB2でも正しくセルの値を参照できるようにすればいいのでは ちなみに「On Error Resume Next」のせいでエラーになっているのを無視して動作するようになってるので外したほうがいいのでは
516 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 09:17:38.32 ID:WRC7pvXs0.net] >>510 ただの事務だよ。15年ぐらい色々書いてるから、これぐらいならまぁ あと、読みづらいコードは最初から書き直した方が早い事も多い
517 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 09:25:22.77 ID:olTKpvXL0.net] >>512 > >>502 がそもそも何で質問の様な動作になるかがわかってないとこれからも簡単なことでつまずくと思うよ > 当初と違って最初のif分に「Target.Address <> "$B$1"」が含まれたことでB1でも下のロジックが動くようになったけど > 「cnt = Target.Value - Target.Offset(-1).Value」これがB1がTargetだと右のOffsetが存在しないから以降のコードが正しく動作しない状態になってる > B2→Target.ValueはB2、Target.Offset(-1)はB1 > B1→Target.ValueはB1、Target.Offset(-1)は存在しないセルなのでエラー > ここをB1でもB2でも正しくセルの値を参照できるようにすればいいのでは > ちなみに「On Error Resume Next」のせいでエラーになっているのを無視して動作するようになってるので外したほうがいいのでは ネットで拾ったコードにOn Error Resume Nextを 加えたりして動くように自分なりにやってみたのですが cnt = Target.Value - Target.Offset(-1).Value の意味が理解できなくて・・・ 少々自分にはレベルの高いコードでした 仕事でどうしてもエクセル使わないといけなかったので無理しましたw ご教授ありがとうございます!
518 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 09:28:14.25 ID:olTKpvXL0.net] >>513 > >>510 > ただの事務だよ。15年ぐらい色々書いてるから、これぐらいならまぁ > あと、読みづらいコードは最初から書き直した方が早い事も多い 私はVBA歴2年なのに簡単なコードしか書けなくて いつになったら皆さんのように書けるようになるのかと思いまして 自分も15年ぐらい頑張れば書けるようになるのかな
519 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 10:58:30.72 ID:UIvxBUgE0.net] Excelの関数とか覚える必要ないでしょ 全部マクロでやれば済むはずだし。 全部マクロで処理している人が職場にいる。
520 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 11:02:58.83 ID:WZYuRp6L0.net] 適材適所
521 名前:デフォルトの名無しさん [2021/08/14(土) 11:11:37.37 ID:Wd8wuOU/0.net] >>496 使う理由は確かにわからないんですよね・・・ ただ、日本語以外の本でもその業界の数値計算のコード例がC++かVBAかMATLABなので恐らく業界のデファクトスタンダード になっているんだと思います。 VBA以外にも使えそうなエクセルの機能があるなら使っていこうかと思います
522 名前:デフォルトの名無しさん [2021/08/14(土) 11:13:11.03 ID:Wd8wuOU/0.net] >>497 分野は金融系専門職ですね・・・ 実際に働いたことある人から聞いたので恐らく実際に使うのだと思います
523 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 11:22:28.35 ID:WRC7pvXs0.net] >>501 そういう事か、それならどこにでもあったわ、スマン 入出力部分だけExcel vbaやaccessってのはたまによく見る >>518-519 c++・MATLABをメインで勉強した方が良い その場合のvbaは補助的に使う物なので、ほとんどの機能を使わない。
524 名前:デフォルトの名無しさん [2021/08/14(土) 11:37:23.70 ID:WNZYUSqEa.net] たまになのによくみる?
525 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 12:03:40.37 ID:MjnqNUAdF.net] >>515 5ちゃんを観るのを止めると綺麗なコード描けるようになる
526 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 12:21:33.89 ID:r4eiaXelM.net] >>521 「そんな業界あるかよっっ」 「こんな使い方するらしいです」 「あーそれなら知ってる」 の流れw
527 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 12:31:49.92 ID:egxXCzK30.net] if,and,orと変数の使い方を覚える Functionの使い方を覚える(Byval,ByRef) Range(”A2”)みたいな書き方から、Worksheet.Cells(2,1)の様な書き方に変える 配列、Dictionary,Collectionの使い方を覚える ユーザーフォームを作れるようになる (クラスの使い方を覚える) こんな流れで順々にやれることを増やしていくといいよ
528 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 12:35:39.31 ID:WZYuRp6L0.net] >>523 ブロント語の事を言ってるのでは まれによくみる
529 名前:デフォルトの名無しさん [2021/08/14(土) 16:05:31.07 ID:9rufdIX60.net] ID:olTKpvXL0 いつものあいつ
530 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 16:13:08.42 ID:FeW4uPBDM.net] いつものあいつって言いたいだけの例の人
531 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 16:13:36.00 ID:WZYuRp6L0.net] いつものあいつに粘着してるやつ
532 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 16:16:12.93 ID:p2FjIi+P0.net] Rubyの人だっけ
533 名前:デフォルトの名無しさん [2021/08/14(土) 19:17:04.70 ID:QQrfTJ+jM.net] またも引っ掛かる間抜けな人達
534 名前:デフォルトの名無しさん [2021/08/14(土) 23:40:30.92 ID:0AEpqYcN0.net] VBAはビジネスソフト板でやれ。 ム板でVBAの話する奴は全員荒らし。
535 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 01:41:34.07 ID:Ab4oMS/u0.net] ListBoxAに複数行の内容を表示し、その行数をラベルに表示させている。 RemoveItemで行を削除した後、ラベルの表示内容を更新したい。 といった場合に、 RemoveItemの後でラベルの数字を1マイナスする、という手動処理ではなくて、 ListBoxAの内容が変更されたことをトリガーとして行数を再計算する、という自動処理にしたいんですが、 どのイベントプロシージャを使えばいいですか?
536 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 09:02:47.73 ID:Vp1mNkx00.net] またでたー
537 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 10:47:47.12 ID:FNsj8xWN0.net] >>532 無いっぽい >RemoveItemの後でラベルの数字を1マイナスする 例えばcommandbuttonでRemoveItemしてるなら、 以下のようにするしか Private Sub CommandButton1_Click() 'removeitemの処理がここに Debug.Print ListBox1.ListCount End Sub
538 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 10:48:11.05 ID:FNsj8xWN0.net] RemoveItemにevent追加するほうが綺麗だけどねぇ vbaじゃ無理だねぇ
539 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 11:06:26.14 ID:47f+T2dk0.net] 仮にイベントがあったとしてもremoveitemのあとに再計算の処理を書いたほうがスッキリしていいと思うが
540 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 11:24:14.03 ID:U+FsjVqC0.net] >>536 RemoveItemしてるのが1箇所ならいいかも知れんが複数あったら面倒だろ
541 名前:デフォルトの名無しさん [2021/08/15(日) 11:44:01.29 ID:PuWX92Pra.net] 一ヶ所にまとめればいいだけだし
542 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 11:48:45.57 ID:U+FsjVqC0.net] イベントに書ければ1箇所にまとめる手間もないし1年後に改修した時に1箇所にまとめたのを忘れてRemoveItem単体で使ってバグることもないし… まあVBAでは夢物語なんだけどね
543 名前:532 mailto:sage [2021/08/15(日) 12:12:51.35 ID:Ab4oMS/u0.net] ありがとうございます。 その後、試してみたこととして、 ListBoxのChangeイベントに再計算の処理を書いておき、 RemoveItemの後で.listIndex=0の処理を入れたところ、 一発目のRemoveItem後は、期待どおりChangeイベントが発生してくれましたが、 二発目以降は、.listIndexが0→0と変化なしのせいか、イベントは発生しませんでした。 行数を再計算したい、と書きましたが、 単純に全体の行数であれば、RemoveItemの後で.listCountをラベルに代入するだけの一行で済みますが、 実際は、リストの1カラム目(ID欄として使用)が100未満の場合と100以上の場合で分けてカウントしており、 FOR文で、ID100未満までの間でヒットするIDがあるたびに対象のカウントをインクリメントし、 2つ目のFOR文で、ID100以上について同様の処理を行う、 という風にしようとした時に、これが冗長に思えました。 もし、使えるイベントがあれば、 そのイベントプロシージャの中で、 それぞれのカウンタラベルのうち対象となる方のみマイナスした値に変更する、 という処理を入れるだけでOKになりそう、と考えました。 結論としては、 イベントに頼らず、 指定したIDの行を.RemoveItemする処理のところで、 そのIDが100未満か100以上かで分岐させて、 その分岐の中で、対象となるカウンタをマイナスする、 という処理にしました。
544 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 14:06:03.01 ID:Q1u7LxQ80.net] >>526 > ID:olTKpvXL0 > > いつものあいつ 前も言われましたがいつものあいつとは? 荒らしがいるんですか? 自分はまだここ見始めたの1年ぐらいなので 知りませんが
545 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 14:16:20.36 ID:044XE2rOa.net] そういうの知っても意味ないから放置でいいのでは 質問されたら答えるだけで無理に関係ない話題でレスを進める必要はないのでは
546 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 14:35:34.20 ID:FNsj8xWN0.net] >>540 カウンタのマイナスは怖いな。数え直した方が良いと思う >>541 >>526 が荒らしだから放置していて良いよ 「いつものあいつ」ってのは元々存在しない
547 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 15:32:30.69 ID:mzIErmSO0.net] >>543 > 「いつものあいつ」ってのは元々存在しない 世にも奇妙な物語みたいな不気味さがw
548 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 22:31:41.12 ID:47f+T2dk0.net] >>539 そもそもまとめたことを忘れるようなやつはイベントの存在も忘れてる つーかVBAじゃなくても標準でそんなイベント発生する言語はないと思うぞ
549 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 22:49:28.66 ID:FNsj8xWN0.net] >>545 そりゃ標準ではない classを継承してメソッドにイベントハンドラを追加できるようにできる言語はいくらでもあるよ vb.netでも可能
550 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 23:03:09.52 ID:U+FsjVqC0.net] >>545 > そもそもまとめたことを忘れるようなやつはイベントの存在も忘れてる だから忘れてもいいって話 > つーかVBAじゃなくても標準でそんなイベント発生する言語はないと思うぞ C#とかなら標準にはなくても派生して作れるってこと
551 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 23:33:36.15 ID:HzefVCWR0.net] フォームのチェンジイベントをイチイチ回避させないといけないのマジで面倒くさい フラグ作ってif からのexit subとかマジで面倒くさい
552 名前:デフォルトの名無しさん mailto:sage [2021/08/16(月) 05:14:26.01 ID:XafigDS10.net] EXCEL以外の言語なら簡単にできるとかいう人っていつもの人ですか?
553 名前:デフォルトの名無しさん mailto:sage [2021/08/16(月) 20:23:33.18 ID:pkWTpyDW0.net] 少なくとも一番ムキになってるアレがそうなんでしょうね
554 名前:デフォルトの名無しさん mailto:sage [2021/08/17(火) 02:14:38.57 ID:XfCCEtxD0.net] 昔はこのスレまともだったのに、変な荒らしが現れてからおかしくなっただけ
555 名前:デフォルトの名無しさん [2021/08/17(火) 14:49:45.30 ID:n4WKWZLba.net] 昔?あ、俺生まれてないや
556 名前:デフォルトの名無しさん mailto:sage [2021/08/17(火) 15:23:12.86 ID:2f/o9RsTM.net] >>552 いつ生まれたの?w
557 名前:デフォルトの名無しさん mailto:sage [2021/08/17(火) 20:35:18.63 ID:4IURpNomM.net] >>552 5chは年寄りの巣窟ですよ。 子供は他所で遊んだ方が良いですよ。
558 名前:デフォルトの名無しさん mailto:sage [2021/08/19(木) 01:46:41.56 ID:GJSA9V5J0.net] す、巣窟?
559 名前:デフォルトの名無しさん mailto:sage [2021/08/19(木) 12:48:42.55 ID:gPE31PeS0.net] そ う だ よ
560 名前:デフォルトの名無しさん mailto:sage [2021/08/20(金) 00:11:44.24 ID:YzPl1p2A0.net] Dim mysubfiles As Files Dim mysubfile As File For Each mysubfile In mysubfiles 中略 Next このループ中で作成したファイルも このループ内の処理を通したいのですが どうしたらよいでしょうか。 具体的な状況は以下のとおりです。 ・ループ内では拡張子xlsxのファイルを加工したい。 ・しかしxlsmで保存されている場合もある。 ・ループの最初にxlsmを開いてxlsxとして保存する処理を入れたものの そのxlsxが加工されない
561 名前:デフォルトの名無しさん mailto:sage [2021/08/20(金) 00:21:12.76 ID:EM+6hHZh0.net] >>557 xlsmがあればフラグをTrueにして、最後までループしたらもう一度その処理をするとか? それなら「元々xlsmだったもの のみ」の処理はできないが、中略の中身によってはOKでしょう 「元々xlsmだったもの のみ」処理するのであれば、xlsm処理時点でDictionaryにファイル名をAddして、ループ終わった後に再度ループさせ、Dictionaryにあるファイルのみ処理する になるかな 読みづらくはなると思うけど仕方ない
562 名前:デフォルトの名無しさん mailto:sage [2021/08/20(金) 03:30:46.68 ID:fkNLvzJY0.net] >>557 ループ中で新たに作成したxlsxファイルも、 元々xlsxだっとファイルと同じ処理を行いたいって事でいいでしょうか。 編集するファイル用の変数(例えばTargetFile)を新たに用意して、 中略部分は mysubfile ではなく TargetFile を処理するというコードにしておきます。 冒頭にその TargetFile を何に割り当てるかを決定するコードを書きます。 ・mysubfileがxlsxである場合は、mysubfileの参照をTargetFileへそのまま代入 ・そうでない場合はxlsxとして保存しなおして、保存したxlsxを取得してTargetFileへ代入 条件によって反復子から取得した値がそのまま扱えない場合はこういう書き方をするのが一般的かと思います。 中略部分を関数にして引数に渡す値を変えるといった表現方法でもいいでしょう。
563 名前:デフォルトの名無しさん mailto:sage [2021/08/20(金) 06:44:10.09 ID:O2iQQ7aA0.net] >>557 情況よくわからん > ・ループの最初にxlsmを開いてxlsxとして保存する処理を入れたものの 保存してるんならファイル名わかってるんだしそのまま処理すればいいと思うんだが…
564 名前:デフォルトの名無しさん mailto:sage [2021/08/20(金) 07:35:23.32 ID:+liSrGPN0.net] 自分で配列なりコレクションなり用意してDoでループ回せよ
565 名前:デフォルトの名無しさん mailto:sage [2021/08/20(金) 07:43:25.84 ID:6SYvdNEC0.net] ループの中で処理するんじゃなく、サブルーチンにして呼び出す方がいいな
566 名前:デフォルトの名無しさん mailto:sage [2021/08/20(金) 14:52:28.33 ID:+liSrGPN0.net] そのサブルーチンを呼び出すのにどうやってループさせるの? もしくは そのサブルーチンのなかでどうやって列挙させるの? って話だと思うんだが
567 名前:デフォルトの名無しさん mailto:sage [2021/08/20(金) 14:57:01.36 ID:01P72Y3qM.net] xlsmだったらxlsxにしてそのファイルを引数にして渡す xlsxだったらそのまま渡す それだけのこと
568 名前:デフォルトの名無しさん mailto:sage [2021/08/20(金) 15:39:01.41 ID:fkNLvzJY0.net] 前々から思ってたんだけど、抽象的に質問書く人多いね あと謎用語作ったり(この前も「打ちあがる」とか何とか) テンプレ作った方がいいんじゃないか?
569 名前:デフォルトの名無しさん mailto:sage [2021/08/20(金) 15:48:44.06 ID:XV1yMITLa.net] 別に適当に質問してくるなら適当に返せばいいでしょ それなりの回答を求めるならそれなりに質問するのが常識では
570 名前:デフォルトの名無しさん mailto:sage [2021/08/20(金) 18:27:44.18 ID:pH4dbDdN0.net] >>565 そういうのはいつもの奴だと思ってスルーで良いかと 抽象的に書くのはコードだけにしてほしいね
571 名前:デフォルトの名無しさん mailto:sage [2021/08/20(金) 19:51:09.61 ID:qaJDzmMG0.net] 質問スレなのに質問しにくい雰囲気を作っていくぅ〜
572 名前:デフォルトの名無しさん mailto:sage [2021/08/20(金) 22:28:26.67 ID:tsSDUWXI0.net] 問題ない
573 名前:デフォルトの名無しさん mailto:sage [2021/08/21(土) 00:15:10.89 ID:fb/04mNm0.net] >>568 質問しにくい雰囲気の中であっても質問できる力を身につけて欲しい というこのスレの思いやりがわからんのかね。
574 名前:デフォルトの名無しさん mailto:sage [2021/08/21(土) 03:34:48.94 ID:ezVaAvb40.net] >>557 んだよコレクションにFileオブジェクト積み立ててFor Eachの最中にコレクションにFile追加したら追加した分だけループしねーのかと思っちまったじゃねーか。 普通に回るわ。 コレクションに積み立てたFileがxlsmのときはxlsxでセーブしてコレクションの中身の参照をそっちに置き換えて開いて加工してセーブすりゃいいだけじゃねーか。 ループし切らないと思ったから、ファイル情報を抱えるエンティティクラス作って、そんなかに加工済みフラグとか設けて、ファイル追加したときにループ処理再帰してもう加工済みだったら処理飛ばすとかしなきゃいけないとか思ったから実は結構骨のある質問じゃないのか?とか思ってバカ見たわ。 いや、単に俺の知識不足だな。すまんかったな。もう寝るわ。
575 名前:デフォルトの名無しさん mailto:sage [2021/08/21(土) 11:04:58.97 ID:zxg8KyYK0.net] For Eachの順序はファイル名か何かだから、 既にforeachの処理が過ぎたファイル名だと実行されないぞ
576 名前:デフォルトの名無しさん mailto:sage [2021/08/21(土) 17:09:47.50 ID:aaIGTne20.net] >>557 ループ内で.xlsm→.xlsxに変換したファイル名を配列に追加しておき、 ループを抜けた後で、その配列に格納されたファイルに対して加工処理を行えばいいのでは?
577 名前:デフォルトの名無しさん mailto:sage [2021/08/21(土) 20:04:21.12 ID:NaiRsfJYH.net] 最初のループは一覧を2セット作るだけにして次のループで処理したら?
578 名前:デフォルトの名無しさん [2021/08/21(土) 20:35:14.71 ID:7GAoG1Iq0.net] Rustのメモリ安全性はボローチェッカーによって担保されているが、 Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、 GC無しでView types参照の有効性を検証することによってメモリ安全性を保証しつつ 限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか? Nimの実験的特徴 著者: アンドレアス・ルンプ バージョン: 1.5.1 nim-lang.github.io/Nim/manual_experimental.html Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し ているにもかかわらず、Cのソースコードを吐き出せるのでC言語でリモートワークされ ている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる 「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
579 名前:デフォルトの名無しさん mailto:sage [2021/08/21(土) 23:03:58.45 ID:ezVaAvb40.net] >>572 んなこたぁない。 実際やってみてコレクションに追加されたもんは頭から順にファイル名に関係なくFor Eachで拾えるのは確認済み。 ソース展開してもいいけどどっかにソース張り付けて展開出来るサイトない? そこそこ大きくなったのと5chに貼り付けると連続した半角スペースが1個になるから見づらいもんね。
580 名前:デフォルトの名無しさん mailto:sage [2021/08/21(土) 23:17:33.77 ID:ezVaAvb40.net] >>575 ぶっちゃけ始めるのにいい言語スレの誤爆だろうが、Rustは新し過ぎて本とかも殆ど出てないから初心者には向かないよ。 て言うかVisual Studio Codeで開発環境構築しようとしたけど動かん。 手順教えてくれるとありがたいんだがのう。 ま、スレ違いになるからそっちのスレ行くか。
581 名前:デフォルトの名無しさん mailto:sage [2021/08/22(日) 00:09:36.86 ID:3/Qg+sLj0.net] >>576 foreachは順序の保証は無いから途中で追加したり削除するとどうなるか分からない。 言語によってはエラー出るぐらいの変な挙動 試しにworksheetsでやってみたけど、途中で追加したものは処理されない Sub foo() flg = True For Each x In Worksheets '1周目の時だけworksheetを追加する If flg Then Worksheets.Add flg = False End If Debug.Print x.Name Next End Sub
582 名前:デフォルトの名無しさん mailto:sage [2021/08/22(日) 00:11:00.32 ID:3/Qg+sLj0.net] >>578 の続き 追加したものに対してもforeach内の処理かましたければ、 サブルーチンとして外に出して個別に実行した方が良い ※arrayに入れてから別のfoeachループにしたほうが良いかもしれない Sub foo() flg = True For Each x In Worksheets '各シートの処理 Call print_worksheets_name(x) If flg Then Set 新シート = Worksheets.Add '新シートの処理 Call print_worksheets_name(新シート) flg = False End If Next End Sub 'メインの処理はここ Function print_worksheets_name(x) Debug.Print x.Name End Function
583 名前:デフォルトの名無しさん mailto:sage [2021/08/22(日) 00:39:14.99 ID:vfl1uW7oa.net] ググったらサンプルがあったから試してみた。コードはこれ Sub Sample_Files() Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") Dim myFiles As Object Dim myFile As Object Dim strFiles As String Set myFiles = FSO.GetFolder("D:\test\").Files strFiles = "ファイル数:" & myFiles.Count & vbCrLf For Each myFile In myFiles strFiles = strFiles & myFile.Name & vbCrLf '★ Next MsgBox strFiles End Sub 対象のフォルダに「新しいテキスト ドキュメント2.txt」「新しいテキスト ドキュメント4.txt」の2ファイルを格納 ★にブレークポイントを設定して止まった時点で 対象のフォルダに「新しいテキスト ドキュメント1.txt」「新しいテキスト ドキュメント3.txt」の2ファイルを格納 この結果はMsgBoxは最初に格納されていたファイルのみが表示された これを踏まえたらファイルを新たに保存しても保存したファイルはループ中は参照されないのでは
584 名前:デフォルトの名無しさん [2021/08/22(日) 04:22:11.55 ID:HSx9B6Zm0.net] >>578-580 なるほど言いたいことは分かった。 確かにFor Eachの取得順が保証されないのは正しい。 だがその話には続きがある。 For Each の取得順序が保証されていないのは、 取得元のObjectに依存するから。 https://thom.hateblo.jp/entry/2018/08/11/194900 そしてくだすれでソース展開用サイト教えてもらったから ソース貼っといた。 https://pastebin.com/RBXU7SyT Test3.xlsmとTest4.xlsx作って先にコレクションに登録。 ループ途中でTest1.xlsmとTest2.xlsxを作成して追加しているが、 挙動がおかしいようであれば言ってくれ。
585 名前:デフォルトの名無しさん mailto:sage [2021/08/22(日) 08:13:33.74 ID:bz4GO5A/0.net] FileSystemObjectのFilesの話だけどCollectionで問題ないから俺の勝ちー ってか?w
586 名前:デフォルトの名無しさん mailto:sage [2021/08/22(日) 08:38:21.01 ID:HSx9B6Zm0.net] >>582 そもそもループしてる最中の母数を弄るようなことをするのってどうなのよ?っていうのはあるが、 気に食わなければ>>571 で言ったような方法をとればいい。多分少し考えれば他にも色々方法はあるだろうが、 他の人にはともかく、その凄く悔しそうなレス見るとどうやら君は知らない内に勝手に負けてしまったのだろう。
587 名前:デフォルトの名無しさん mailto:sage [2021/08/22(日) 09:40:51.11 ID:bz4GO5A/0.net] >>576 の話な >>572 はFilesの話だからコレクションでそんなことないとか言われても困るってこと コレクションにしろ保証されてる動作じゃないからうまく行った事例があってもあまり意味はない
588 名前:デフォルトの名無しさん mailto:sage [2021/08/22(日) 09:49:45.02 ID:AgYnuzAe0.net] いつもの質問に相手した時点で負け