Excel VBA 質問スレ Part72

■ このスレッドは過去ログ倉庫に格納されています
2021/07/18(日) 08:42:15.37ID:KskL7bEXd
!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
2021/08/14(土) 08:34:31.28ID:FeW4uPBDM
あぁそうか整数の時だけなのか
でもOnErrorResumeNextはバグを見逃しやすくなるから個人的にはあんまり使いたくねぇなぁ
lsNumenic(B2)の後にB2=CLng(B2)で整数判定かけるのってどう?……見辛くなるか
2021/08/14(土) 09:09:38.05ID:LMRL1zmta
>>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」のせいでエラーになっているのを無視して動作するようになってるので外したほうがいいのでは
2021/08/14(土) 09:17:38.32ID:WRC7pvXs0
>>510
ただの事務だよ。15年ぐらい色々書いてるから、これぐらいならまぁ
あと、読みづらいコードは最初から書き直した方が早い事も多い
2021/08/14(土) 09:25:22.77ID:olTKpvXL0
>>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

ご教授ありがとうございます!
2021/08/14(土) 09:28:14.25ID:olTKpvXL0
>>513
> >>510
> ただの事務だよ。15年ぐらい色々書いてるから、これぐらいならまぁ
> あと、読みづらいコードは最初から書き直した方が早い事も多い

私はVBA歴2年なのに簡単なコードしか書けなくて
いつになったら皆さんのように書けるようになるのかと思いまして

自分も15年ぐらい頑張れば書けるようになるのかな
2021/08/14(土) 10:58:30.72ID:UIvxBUgE0
Excelの関数とか覚える必要ないでしょ
全部マクロでやれば済むはずだし。
全部マクロで処理している人が職場にいる。
2021/08/14(土) 11:02:58.83ID:WZYuRp6L0
適材適所
518デフォルトの名無しさん (ワッチョイ 9901-ic7f)
垢版 |
2021/08/14(土) 11:11:37.37ID:Wd8wuOU/0
>>496
使う理由は確かにわからないんですよね・・・
ただ、日本語以外の本でもその業界の数値計算のコード例がC++かVBAかMATLABなので恐らく業界のデファクトスタンダード
になっているんだと思います。
VBA以外にも使えそうなエクセルの機能があるなら使っていこうかと思います
519デフォルトの名無しさん (ワッチョイ 9901-ic7f)
垢版 |
2021/08/14(土) 11:13:11.03ID:Wd8wuOU/0
>>497
分野は金融系専門職ですね・・・
実際に働いたことある人から聞いたので恐らく実際に使うのだと思います
2021/08/14(土) 11:22:28.35ID:WRC7pvXs0
>>501
そういう事か、それならどこにでもあったわ、スマン
入出力部分だけExcel vbaやaccessってのはたまによく見る

>>518-519
c++・MATLABをメインで勉強した方が良い
その場合のvbaは補助的に使う物なので、ほとんどの機能を使わない。
521デフォルトの名無しさん (アウアウウー Saa5-oCel)
垢版 |
2021/08/14(土) 11:37:23.70ID:WNZYUSqEa
たまになのによくみる?
2021/08/14(土) 12:03:40.37ID:MjnqNUAdF
>>515
5ちゃんを観るのを止めると綺麗なコード描けるようになる
2021/08/14(土) 12:21:33.89ID:r4eiaXelM
>>521
「そんな業界あるかよっっ」
「こんな使い方するらしいです」
「あーそれなら知ってる」
の流れw
2021/08/14(土) 12:31:49.92ID:egxXCzK30
if,and,orと変数の使い方を覚える

Functionの使い方を覚える(Byval,ByRef)

Range(”A2”)みたいな書き方から、Worksheet.Cells(2,1)の様な書き方に変える

配列、Dictionary,Collectionの使い方を覚える

ユーザーフォームを作れるようになる

(クラスの使い方を覚える)

こんな流れで順々にやれることを増やしていくといいよ
2021/08/14(土) 12:35:39.31ID:WZYuRp6L0
>>523
ブロント語の事を言ってるのでは
まれによくみる
526デフォルトの名無しさん (ワッチョイ 498e-JtI+)
垢版 |
2021/08/14(土) 16:05:31.07ID:9rufdIX60
ID:olTKpvXL0

いつものあいつ
2021/08/14(土) 16:13:08.42ID:FeW4uPBDM
いつものあいつって言いたいだけの例の人
2021/08/14(土) 16:13:36.00ID:WZYuRp6L0
いつものあいつに粘着してるやつ
2021/08/14(土) 16:16:12.93ID:p2FjIi+P0
Rubyの人だっけ
530デフォルトの名無しさん (ワントンキン MM92-4yzW)
垢版 |
2021/08/14(土) 19:17:04.70ID:QQrfTJ+jM
またも引っ掛かる間抜けな人達
531デフォルトの名無しさん (ワッチョイ 9901-pBez)
垢版 |
2021/08/14(土) 23:40:30.92ID:0AEpqYcN0
VBAはビジネスソフト板でやれ。
ム板でVBAの話する奴は全員荒らし。
2021/08/15(日) 01:41:34.07ID:Ab4oMS/u0
ListBoxAに複数行の内容を表示し、その行数をラベルに表示させている。
RemoveItemで行を削除した後、ラベルの表示内容を更新したい。

といった場合に、
RemoveItemの後でラベルの数字を1マイナスする、という手動処理ではなくて、
ListBoxAの内容が変更されたことをトリガーとして行数を再計算する、という自動処理にしたいんですが、
どのイベントプロシージャを使えばいいですか?
2021/08/15(日) 09:02:47.73ID:Vp1mNkx00
またでたー
2021/08/15(日) 10:47:47.12ID:FNsj8xWN0
>>532
無いっぽい

>RemoveItemの後でラベルの数字を1マイナスする
例えばcommandbuttonでRemoveItemしてるなら、
以下のようにするしか

Private Sub CommandButton1_Click()
'removeitemの処理がここに
Debug.Print ListBox1.ListCount
End Sub
2021/08/15(日) 10:48:11.05ID:FNsj8xWN0
RemoveItemにevent追加するほうが綺麗だけどねぇ
vbaじゃ無理だねぇ
2021/08/15(日) 11:06:26.14ID:47f+T2dk0
仮にイベントがあったとしてもremoveitemのあとに再計算の処理を書いたほうがスッキリしていいと思うが
2021/08/15(日) 11:24:14.03ID:U+FsjVqC0
>>536
RemoveItemしてるのが1箇所ならいいかも知れんが複数あったら面倒だろ
538デフォルトの名無しさん (アウアウウー Saa5-oCel)
垢版 |
2021/08/15(日) 11:44:01.29ID:PuWX92Pra
一ヶ所にまとめればいいだけだし
2021/08/15(日) 11:48:45.57ID:U+FsjVqC0
イベントに書ければ1箇所にまとめる手間もないし1年後に改修した時に1箇所にまとめたのを忘れてRemoveItem単体で使ってバグることもないし…
まあVBAでは夢物語なんだけどね
2021/08/15(日) 12:12:51.35ID:Ab4oMS/u0
ありがとうございます。

その後、試してみたこととして、
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以上かで分岐させて、
その分岐の中で、対象となるカウンタをマイナスする、
という処理にしました。
2021/08/15(日) 14:06:03.01ID:Q1u7LxQ80
>>526
> ID:olTKpvXL0
>
> いつものあいつ

前も言われましたがいつものあいつとは?
荒らしがいるんですか?
自分はまだここ見始めたの1年ぐらいなので
知りませんが
2021/08/15(日) 14:16:20.36ID:044XE2rOa
そういうの知っても意味ないから放置でいいのでは
質問されたら答えるだけで無理に関係ない話題でレスを進める必要はないのでは
2021/08/15(日) 14:35:34.20ID:FNsj8xWN0
>>540
カウンタのマイナスは怖いな。数え直した方が良いと思う

>>541
>>526が荒らしだから放置していて良いよ
「いつものあいつ」ってのは元々存在しない
2021/08/15(日) 15:32:30.69ID:mzIErmSO0
>>543
> 「いつものあいつ」ってのは元々存在しない
世にも奇妙な物語みたいな不気味さがw
2021/08/15(日) 22:31:41.12ID:47f+T2dk0
>>539
そもそもまとめたことを忘れるようなやつはイベントの存在も忘れてる
つーかVBAじゃなくても標準でそんなイベント発生する言語はないと思うぞ
2021/08/15(日) 22:49:28.66ID:FNsj8xWN0
>>545
そりゃ標準ではない
classを継承してメソッドにイベントハンドラを追加できるようにできる言語はいくらでもあるよ
vb.netでも可能
2021/08/15(日) 23:03:09.52ID:U+FsjVqC0
>>545
> そもそもまとめたことを忘れるようなやつはイベントの存在も忘れてる
だから忘れてもいいって話

> つーかVBAじゃなくても標準でそんなイベント発生する言語はないと思うぞ
C#とかなら標準にはなくても派生して作れるってこと
2021/08/15(日) 23:33:36.15ID:HzefVCWR0
フォームのチェンジイベントをイチイチ回避させないといけないのマジで面倒くさい
フラグ作ってif からのexit subとかマジで面倒くさい
2021/08/16(月) 05:14:26.01ID:XafigDS10
EXCEL以外の言語なら簡単にできるとかいう人っていつもの人ですか?
2021/08/16(月) 20:23:33.18ID:pkWTpyDW0
少なくとも一番ムキになってるアレがそうなんでしょうね
2021/08/17(火) 02:14:38.57ID:XfCCEtxD0
昔はこのスレまともだったのに、変な荒らしが現れてからおかしくなっただけ
552デフォルトの名無しさん (アウアウウー Saa5-oCel)
垢版 |
2021/08/17(火) 14:49:45.30ID:n4WKWZLba
昔?あ、俺生まれてないや
2021/08/17(火) 15:23:12.86ID:2f/o9RsTM
>>552
いつ生まれたの?w
2021/08/17(火) 20:35:18.63ID:4IURpNomM
>>552
5chは年寄りの巣窟ですよ。
子供は他所で遊んだ方が良いですよ。
2021/08/19(木) 01:46:41.56ID:GJSA9V5J0
す、巣窟?
2021/08/19(木) 12:48:42.55ID:gPE31PeS0
そ う だ よ
2021/08/20(金) 00:11:44.24ID:YzPl1p2A0
Dim mysubfiles As Files
Dim mysubfile As File

For Each mysubfile In mysubfiles
 中略
Next

このループ中で作成したファイルも
このループ内の処理を通したいのですが
どうしたらよいでしょうか。
具体的な状況は以下のとおりです。
・ループ内では拡張子xlsxのファイルを加工したい。
・しかしxlsmで保存されている場合もある。
・ループの最初にxlsmを開いてxlsxとして保存する処理を入れたものの
 そのxlsxが加工されない
2021/08/20(金) 00:21:12.76ID:EM+6hHZh0
>>557
xlsmがあればフラグをTrueにして、最後までループしたらもう一度その処理をするとか?
それなら「元々xlsmだったもの のみ」の処理はできないが、中略の中身によってはOKでしょう

「元々xlsmだったもの のみ」処理するのであれば、xlsm処理時点でDictionaryにファイル名をAddして、ループ終わった後に再度ループさせ、Dictionaryにあるファイルのみ処理する

になるかな
読みづらくはなると思うけど仕方ない
2021/08/20(金) 03:30:46.68ID:fkNLvzJY0
>>557
ループ中で新たに作成したxlsxファイルも、
元々xlsxだっとファイルと同じ処理を行いたいって事でいいでしょうか。

編集するファイル用の変数(例えばTargetFile)を新たに用意して、
中略部分は mysubfile ではなく TargetFile を処理するというコードにしておきます。

冒頭にその TargetFile を何に割り当てるかを決定するコードを書きます。
・mysubfileがxlsxである場合は、mysubfileの参照をTargetFileへそのまま代入
・そうでない場合はxlsxとして保存しなおして、保存したxlsxを取得してTargetFileへ代入

条件によって反復子から取得した値がそのまま扱えない場合はこういう書き方をするのが一般的かと思います。
中略部分を関数にして引数に渡す値を変えるといった表現方法でもいいでしょう。
2021/08/20(金) 06:44:10.09ID:O2iQQ7aA0
>>557
情況よくわからん
> ・ループの最初にxlsmを開いてxlsxとして保存する処理を入れたものの
保存してるんならファイル名わかってるんだしそのまま処理すればいいと思うんだが…
2021/08/20(金) 07:35:23.32ID:+liSrGPN0
自分で配列なりコレクションなり用意してDoでループ回せよ
2021/08/20(金) 07:43:25.84ID:6SYvdNEC0
ループの中で処理するんじゃなく、サブルーチンにして呼び出す方がいいな
2021/08/20(金) 14:52:28.33ID:+liSrGPN0
そのサブルーチンを呼び出すのにどうやってループさせるの?
もしくは
そのサブルーチンのなかでどうやって列挙させるの?
って話だと思うんだが
2021/08/20(金) 14:57:01.36ID:01P72Y3qM
xlsmだったらxlsxにしてそのファイルを引数にして渡す
xlsxだったらそのまま渡す

それだけのこと
2021/08/20(金) 15:39:01.41ID:fkNLvzJY0
前々から思ってたんだけど、抽象的に質問書く人多いね
あと謎用語作ったり(この前も「打ちあがる」とか何とか)

テンプレ作った方がいいんじゃないか?
2021/08/20(金) 15:48:44.06ID:XV1yMITLa
別に適当に質問してくるなら適当に返せばいいでしょ
それなりの回答を求めるならそれなりに質問するのが常識では
2021/08/20(金) 18:27:44.18ID:pH4dbDdN0
>>565
そういうのはいつもの奴だと思ってスルーで良いかと
抽象的に書くのはコードだけにしてほしいね
2021/08/20(金) 19:51:09.61ID:qaJDzmMG0
質問スレなのに質問しにくい雰囲気を作っていくぅ〜
2021/08/20(金) 22:28:26.67ID:tsSDUWXI0
問題ない
2021/08/21(土) 00:15:10.89ID:fb/04mNm0
>>568
質問しにくい雰囲気の中であっても質問できる力を身につけて欲しい
というこのスレの思いやりがわからんのかね。
2021/08/21(土) 03:34:48.94ID:ezVaAvb40
>>557
んだよコレクションにFileオブジェクト積み立ててFor Eachの最中にコレクションにFile追加したら追加した分だけループしねーのかと思っちまったじゃねーか。
普通に回るわ。

コレクションに積み立てたFileがxlsmのときはxlsxでセーブしてコレクションの中身の参照をそっちに置き換えて開いて加工してセーブすりゃいいだけじゃねーか。

ループし切らないと思ったから、ファイル情報を抱えるエンティティクラス作って、そんなかに加工済みフラグとか設けて、ファイル追加したときにループ処理再帰してもう加工済みだったら処理飛ばすとかしなきゃいけないとか思ったから実は結構骨のある質問じゃないのか?とか思ってバカ見たわ。

いや、単に俺の知識不足だな。すまんかったな。もう寝るわ。
2021/08/21(土) 11:04:58.97ID:zxg8KyYK0
For Eachの順序はファイル名か何かだから、
既にforeachの処理が過ぎたファイル名だと実行されないぞ
2021/08/21(土) 17:09:47.50ID:aaIGTne20
>>557
ループ内で.xlsm→.xlsxに変換したファイル名を配列に追加しておき、
ループを抜けた後で、その配列に格納されたファイルに対して加工処理を行えばいいのでは?
2021/08/21(土) 20:04:21.12ID:NaiRsfJYH
最初のループは一覧を2セット作るだけにして次のループで処理したら?
575デフォルトの名無しさん (ワッチョイ ff02-VfHF)
垢版 |
2021/08/21(土) 20:35:14.71ID:7GAoG1Iq0
Rustのメモリ安全性はボローチェッカーによって担保されているが、
Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と
C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています

Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、
GC無しでView types参照の有効性を検証することによってメモリ安全性を保証しつつ
限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます

Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ

なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか?

Nimの実験的特徴
著者: アンドレアス・ルンプ
バージョン: 1.5.1
http://nim-lang.github.io/Nim/manual_experimental.html


Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し
ているにもかかわらず、Cのソースコードを吐き出せるのでC言語でリモートワークされ
ている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる

「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
2021/08/21(土) 23:03:58.45ID:ezVaAvb40
>>572
んなこたぁない。
実際やってみてコレクションに追加されたもんは頭から順にファイル名に関係なくFor Eachで拾えるのは確認済み。

ソース展開してもいいけどどっかにソース張り付けて展開出来るサイトない?

そこそこ大きくなったのと5chに貼り付けると連続した半角スペースが1個になるから見づらいもんね。
2021/08/21(土) 23:17:33.77ID:ezVaAvb40
>>575
ぶっちゃけ始めるのにいい言語スレの誤爆だろうが、Rustは新し過ぎて本とかも殆ど出てないから初心者には向かないよ。
て言うかVisual Studio Codeで開発環境構築しようとしたけど動かん。
手順教えてくれるとありがたいんだがのう。
ま、スレ違いになるからそっちのスレ行くか。
2021/08/22(日) 00:09:36.86ID:3/Qg+sLj0
>>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
2021/08/22(日) 00:11:00.32ID:3/Qg+sLj0
>>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
2021/08/22(日) 00:39:14.99ID:vfl1uW7oa
ググったらサンプルがあったから試してみた。コードはこれ
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は最初に格納されていたファイルのみが表示された
これを踏まえたらファイルを新たに保存しても保存したファイルはループ中は参照されないのでは
581デフォルトの名無しさん (ワッチョイ 7f4f-AI8d)
垢版 |
2021/08/22(日) 04:22:11.55ID:HSx9B6Zm0
>>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を作成して追加しているが、
挙動がおかしいようであれば言ってくれ。
2021/08/22(日) 08:13:33.74ID:bz4GO5A/0
FileSystemObjectのFilesの話だけどCollectionで問題ないから俺の勝ちー
ってか?w
2021/08/22(日) 08:38:21.01ID:HSx9B6Zm0
>>582
そもそもループしてる最中の母数を弄るようなことをするのってどうなのよ?っていうのはあるが、
気に食わなければ>>571で言ったような方法をとればいい。多分少し考えれば他にも色々方法はあるだろうが、
他の人にはともかく、その凄く悔しそうなレス見るとどうやら君は知らない内に勝手に負けてしまったのだろう。
2021/08/22(日) 09:40:51.11ID:bz4GO5A/0
>>576の話な
>>572はFilesの話だからコレクションでそんなことないとか言われても困るってこと
コレクションにしろ保証されてる動作じゃないからうまく行った事例があってもあまり意味はない
2021/08/22(日) 09:49:45.02ID:AgYnuzAe0
いつもの質問に相手した時点で負け
2021/08/22(日) 10:04:31.73ID:HSx9B6Zm0
>>584
別にコレクションじゃなくても配列だろうがディクショナリだろうが何でもいいよ。Filesの中身を最初に積み立て直してループしてやればいいこと。
詰め込み対象のループの動作保証が欲しいなら>571で言った通りエンティティクラス用意して何かに詰め込んで一度加工したかどうかのフラグ持って、追加したらエンティティクラスも追加しといて、ファイル追加したらループ再帰して加工したフラグが立っていれば処理飛ばせばいいこと。
まぁ何故Filesを持ち回ることにそんなに執着しているのか知らんけど、そうでなければこの方法で実現出来るのは確か。
そんなにFiles持ち回ることに拘るなら人の作ったもんに文句ばかり言ってないでそれで実現出来るコード晒せばいい。
2021/08/22(日) 10:46:11.18ID:vfl1uW7oa
こうすればいいよって回答してあげるのはかまわないけど
そもそもなぜそれがダメなのかを指摘してあげたるのも大事では
当初の質問であれば
>・ループの最初にxlsmを開いてxlsxとして保存する処理を入れたものの
> そのxlsxが加工されない
「ループの中で新たなファイルを作ってもFilesではそのファイルが取得できないようだ」という問題点を教えて
そのうえで中略のコードをSub化してループで取得したファイルもループの中で作成したファイルも
そのSubを呼び出すようにするとか解決策を提示したほうがいいんじゃないかねえ
2021/08/22(日) 11:08:18.32ID:bz4GO5A/0
>>586
何をカリカリしてんのか知らんけどFilesの話にコレクション持ち出して「んなこたぁない。」とか言うのが頓珍漢だって言うだけの話

あと>>571は積み立てるとかの謎用語使われてて読み飛ばしてるので悪しからず
2021/08/22(日) 11:11:26.73ID:HSx9B6Zm0
>>588
なんだソース晒さないのか。
ならこの会話はここで終わりだな。
2021/08/22(日) 11:39:16.64ID:bz4GO5A/0
はじめから頓珍漢だっていう指摘だから誰かさんにまともな理解力あれば既に終わってた話なんだけどねw
2021/08/22(日) 11:51:49.66ID:w9I0Mw1ep
>>589
バカはほっといてFilesのループだけで何とかする方法ない?
2021/08/22(日) 12:02:21.45ID:tt5sChhUM
別の配列を用意して、追加と処理を別々にすればいいだけ
2021/08/22(日) 12:08:29.70ID:vfl1uW7oa
>>591
中略で何をしてるか不明だからそこの話題の解決は難しいのでは
ループでどんなファイルをFilesに含めているかわからないがループのファイルには拡張子xlsmとxlsxが対象になっているなら
・xlsm→加工してxlsxに変換して保存(元のxlsmは何もしない)
・xlsx→加工してxlsxのまま保存
・それ以外→何もしない
これだけの話にも見えるよね
2021/08/22(日) 12:35:51.87ID:bz4GO5A/0
>>591
> バカはほっといてFilesのループだけで何とかする方法ない?
.xlsm ⇒ .xlsx にした時点でFilesの内容がどうなるかはわからんから一旦Filesの内容を配列なりコレクションなりに取り込んでおくしかないと思う
2021/08/22(日) 12:37:07.40ID:fq28dqqO0
リスト構造みたいなのは?
2021/08/22(日) 13:02:31.83ID:HhgXzLK4H
配列だろうがリストだろうがそこは自由
とにかくループ中で母集団をいじらなければいいだけの話だから
597デフォルトの名無しさん (ワッチョイ ff02-VfHF)
垢版 |
2021/08/22(日) 13:03:46.65ID:0Cz6ueFz0
Rustのメモリ安全性はボローチェッカーによって担保されているが、
Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と
C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています

Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、
GC無しのView typesで参照の有効性を検証することによってメモリ安全性を保証しつつ
限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます

Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ

なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか?

Nimの実験的特徴 バージョン1.5.1
http://nim-lang.github.io/Nim/manual_experimental.html

第二プログラミング言語として Rust はオススメしません Nim をやるのです
https://wolfbash.hateblo.jp/entry/2017/07/30/193412


Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し
ているにもかかわらず、高速なCのソースコードを吐き出せるのでC言語でリモートワーク
されている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる

「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
2021/08/22(日) 13:08:21.86ID:bz4GO5A/0
>>595
リストでもいいけどVBAで簡単に扱えるものある?
599デフォルトの名無しさん (ワッチョイ 7f4f-AI8d)
垢版 |
2021/08/22(日) 19:40:10.48ID:HSx9B6Zm0
>>591
遅くなってすまない。
そうだな、バカはほっといて
Filesのループだけで何とかする方法か。
Filesのループだけで何とかすることは出来ないことはないが、
綺麗に一重のループという方法は今すぐには思いつかないな。

だが、フォルダから直でやり取りしたいからというのであれば、
方法としては>>571で書いた方法とほぼ一緒だが、
Filesのループであればエンティティクラスは使えない。
ではどうするか、といったところで、ループで加工を終了したxlsxのパス名、
または加工する際に使ったxlsmのパス名を何等かの形で保持して、
後はファイルを作った際にループを再帰して加工が終わった
ファイルの処理は飛ばしてしまえばいい。
そうすれファイルを追加した後のファイルの順序やどこからループするか、
どこまでループするかをあまり気にする必要はない。
ただ、その分ループの回数は増える。が、もし現在の
Collectionの仕様が変わったとしても使うことが出来るだろう。

前回作ったソースを少し弄ってそんな感じにしたので、
展開しておこう。
https://pastebin.com/9QVrJDjF
2021/08/22(日) 19:51:55.58ID:QHUWYA/B0
いちおうVBAにCollectionってあるけどな

.Net FrameworkのArrayListとかQueueとかつかえばいいんじゃね
2021/08/22(日) 20:00:01.46ID:QHUWYA/B0
まずFilesってのが何なのかはっきりしとけ
まあFileSystemObjectのやつだろうけど
あれは、位置指定で取り出したり出来なかったりする、かなり特殊な列挙だった気がする

つか、追加処理でディレクトリ舐めて、そのあともう1回ディレクトリ舐めて処理すればいいだけじゃないのか?
再帰とか意味不明なんだが
たんに2回ループ回すことを再帰と言ってる?
2021/08/22(日) 20:18:32.39ID:QHUWYA/B0
>>596
For Eachでのループ中に、な

Filesの列挙が実質For Eachでしかできないのがまあ困ったところなんだが
2021/08/22(日) 20:44:15.61ID:3/Qg+sLj0
>>579
あかんのかねぇ
xlsmをxlsxにするだけなら再帰処理は不要なはず
2021/08/22(日) 21:49:43.11ID:aqCRpfAk0
配列をループ中に、要素を追加・削除するのは、
すべての言語で、バグるから禁止

要素の追加・削除で、要素がずれるから、どうなるか分からない
2021/08/22(日) 21:56:43.26ID:Dh2ra7Yx0
最終手段はGoToでループ抜けることになるけど、xlsmの時の処理とxlsxの時の処理を分岐させればいいだけよね
606デフォルトの名無しさん (アウアウウー Sa63-jkpn)
垢版 |
2021/08/22(日) 22:19:55.50ID:xquIY43qa
好きなように作れよ
2021/08/22(日) 22:29:56.81ID:fZZZNArf0
>>605
だよね
そもそもループに拡張子を変えたファイルを追加しようって考えがズレてるだけだよな
2021/08/22(日) 23:15:55.98ID:aqCRpfAk0
完全に、処理を分けて作る

まず、拡張子だけを変える。
これで処理対象のファイルを確定させる

その後、処理対象のファイルだけを処理すればよい。
この手順なら、処理中に処理対象のファイル数が増減することはない

とにかく、バグらないような手順を作ることが大事
2021/08/23(月) 08:26:55.69ID:LGNn5NAE0
>>605
Goto文使うのはエラーのときと
エラーとエラーじゃないときの
同じ後始末の部分以外は使うなって
死んだばあちゃんが言ってた
2021/08/23(月) 08:53:51.78ID:cXrkxB5+0
>>609
初心者にはそれしか解法がわからない場合もあるかなと思って
プロシージャ分割とかも理解できない場合は、とりあえず動くプログラム作れたらなと
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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