Access VBA 質問スレ Part2

1デフォルトの名無しさん
垢版 |
2018/12/12(水) 22:14:39.18ID:GF6Qf3Td
Access の VBA に関する質問スレです

質問テンプレ(雛形)は用意しませんが、OSとAccessのバージョンぐらいは必ず書きましょう


前回のスレッド
Access VBA 質問スレ Part1
https://mevius.5ch.net/test/read.cgi/tech/1328536426/
2023/05/18(木) 21:32:12.21ID:UaeB70YO
上半分を隠したら×ボタン無くなってにっちもさっちも行かなくなるぞ
2023/05/18(木) 21:36:12.00ID:/q1eE0wB
>>639
2つのフォームに分けたら良いと思うの
2023/05/19(金) 21:09:14.22ID:j+pEmA6B
>>640
>>642
ありがとう。皆さんのアイデアをためします
2023/05/23(火) 14:00:02.22ID:MnQDcyxi
質問です。
Excelファイルを読み込んで、加工してからテーブルとして保持したいんですが、
Excelファイルのまま編集してinsertするのと、
一度テーブルとして読み込んでから編集してinsertするのはどちらが高速でしょうか?
2023/05/23(火) 14:42:54.35ID:3uLTyIP1
insert ? inport の手順なら下記リンク先を参考に
https://hamachan.info/win8/access/import.html 
Excelファイルをリンクでもいけるし 同作業を何度も繰り返すとかでも、操作を保存しとけば楽だし
データのボリューム次第とかマシンスペックとかも兼ね合いがあるから、どちらとも
ウィザードの途中画面をよく見て、事前にExcel側を整えて置けば inport も楽だし
編集内容がより細かく設定できるのはExcelなのかAccessなのかを知る事でも、どちらの方法を採るかの判断になる
2023/05/23(火) 15:03:14.67ID:MnQDcyxi
いろいろありがとございます、しかしimportではなくinsertです
内容を見て既存のテーブルに1行ずつinsert(もしくはupdate)していく形になります。
2023/05/23(火) 15:26:17.99ID:3uLTyIP1
んーと、Access側のテーブルはあくまでもデータストック用な立ち位置?
事前にExcelでの編集が伴うなら、Accessのテーブルとしてから編集するのはムダなような
https://tonari-it.com/excel-vba-access-add-records/ コッチのが参考に成るかも 実行速度の検証もしてる様子
2023/05/23(火) 16:47:55.53ID:MnQDcyxi
ありがとうございます!
いまさらっとですが見てみたところ、速度比較などもしていて参考になりそうです。
見てみます!

中間テーブルを作成してから編集した方がいいよ、という声を聞いたんですが
いちいち使わないテーブルに投入する必要はないのでは?と思い質問いたしました。
事前編集方式でやってみます!
2023/05/23(火) 18:12:18.40ID:3uLTyIP1
Excelの元データと、何をどう編集したいかも判らないから、中間テーブルの必要性は当人しか判断不能
上でも書いたけど、編集内容がExcelの方が楽で早いのかAccessの方なのかでも手順は変わるような
速さを第一に求めているように読めるけど、「一行ずつ」って書かれた部分で「おや?」と
スムースにデータを移行させるには、最初のリンク先の「データクレンジング」も読んでおいてもムダには成らない
アチコチに目を配らなければならない様子でお疲れ でもそれがじぶんの糧に成る
2023/05/24(水) 08:46:04.47ID:AU7HKxhu
>>644
ExcelインポートしてAccessで加工する方が速いよ
ExcelでVBAでデータ加工するなんて愚の骨頂
2023/05/24(水) 10:26:10.15ID:eouMPy16
みなさまいろいろありがとうございます
自分の説明不足&理解不足ですみません。

ACCESSに入っている一覧情報を定期的に更新しなければならず、
その更新情報がExcelで来るのでそれを読み込んで…とやる感じです。
ACCESS側で固有に更新している情報もあるのでまるっと上書きではなく、
一行ずつ確認して該当の列のみ追加や上書きをしなくてはいけません。

それを、いまはAccessVBA内でExcelファイルを開いて
一行ずつ読み込んで内容確認して内容によってSQL流して…とやっているのですが、
もしかしてExcelファイルを中間テーブルにimportしてから
操作した方が早いのかな??と悩んで書き込んだ次第です。

「ExcelインポートしてACCESSで加工」と言ってくださってるのは
後者の場合を指しているのですかね?
今はとりあえずサンプルを作って動かして比較しようかと思っています。
2023/05/24(水) 10:50:21.63ID:l+gVJ33A
そういうことなら中間テーブルに取り込んで、テーブル同士の差分をチェックかな
https://tasukete-access.com/2022/11/28/accessintro_table_comparison/
[フィールド単位での差分をチェックする] この方法のが近いのか
2023/05/24(水) 23:16:20.24ID:CzWxWRtY
返信遅れてすみません!ありがとうございます!
こんなやり方ができるんですね!
全部SQL書こうと想ってましたがクエリで楽に作れるかもしれず嬉しいです。
参考に書いてみます、本当にありがとうございます!
2023/05/26(金) 17:24:59.84ID:sT8UcBqC
500以上のモジュールにOption Explicitが書いてない。
当然、宣言されていない変数が何百もある。
ここにOption Explicitを書くと、宣言されていない変数を見つけるたびにコンパイルが止まるので面倒。
一括して発見する方法を知ってる人いますか?
VBEが発見できるので、その方法が分かればユーザにも分かるはずだと思うが、検索しても見つからない。

Cのコンパイラを自作する技術があれば、文法解析の手法が使えると思って調べたけど、全余暇時間をコンパイラ自作に割り当てても6ヶ月かかったと言ってる人がいて、踏み出せない。
2023/05/26(金) 19:16:13.82ID:+AT6wCCw
こんなん見付からはりました
https://stabucky.com/wp/archives/6297  実際に検証はしてないんで、自己責任 ←重要!!
現物mdb(そんなのはAccdbでは無くmdbだと勝手に決め付けてる)では無く、コピーしたファイルで
尚且つネットから切り離しスタンドアロンで、更に30秒後に発火するかも知れないので消火器用意してから
試してみてください 結果報告が期待されます

VBE上でCtrl + Spaceで入力支援機能(サジェストっつーの?)を出して、いっこずつTABで拾いだす案を
提案しようと思いつつぐぐってたら出てきた代物 宣言してなかったら自動メンバー表示(どの名称が正式か知らん)
にも出てこないのか!?と、ようやく気付いたレベルの人間のレスなので、眉唾しながら(若しくはスルー推奨)

VBAでJavaScriptを使うには?という場合は : https://extan.jp/?p=10611 とか
あと、『なお「unique」という自作の関数を使っています』とあるので、それも併せておかないと動作しないかも(きっと)
2023/05/29(月) 16:07:15.09ID:AvjLnKXj
>>655
ありがとう。
少しずつ試してみます。

いろいろ調べて、いまはFlexとbisonという奴でもやってみたくなっています。
2023/06/08(木) 22:05:58.45ID:tPqYzYSn
配布したaccdbを365runtimeで動かしてて、今朝突然レポートが開かなくなった
ほぼ午前中すったもんだして2013runtimeならレポートの印刷やプレビューが問題無い事がわかってruntime差し替えた
こんな目にあったひと他にいない?
2023/06/09(金) 03:25:01.10ID:i6Y59lYy
>>657
はい、います
365で突然、帳票の罫線が消えた事があります
その時はAccessのバージョンを1つ前にロールバックして解決しました

方法は以下のURL参照
■Office - Microsoft コミュニティ
https://answers.microsoft.com/ja-jp/msoffice/forum/all/office/67665e18-c4c7-4c1c-b5d1-3ff6e6cd8334

今だと一つ前はバージョン 2304 (ビルド 16327.20248)ですかね
それでダメならもう一つ前へ
2023/06/09(金) 04:50:51.47ID:uT9lsXlY
ロールバック、覚えときます
ありがとう
2023/06/09(金) 12:36:00.93ID:G8Vh+N8B
それって、MSからバグフィックスや修正が為されたのを察知するにはどうしたらいい?
ロールバックしっ放し? 勝手にアプデされてまだ直らなかったら二つ前にロールバック?
ずっと修正されなかったらロールバックバックバックとかに成らん?
2023/06/09(金) 16:09:51.45ID:XhtkwaOO
>>660
察知は毎月リリースページを確認していました
バグが修正されるまでは Office の自動更新を止めます
なのでロールバックは最初の1回だけです
バグが修正されたら自動更新を有効に戻して最新版にする感じでした

更新は重大バグ修正の時のみ、原則自動更新は使わないという運用もあります
これに関してはお客さん次第ですかね
2023/06/09(金) 16:20:24.73ID:G8Vh+N8B
そうだよね 委託を請けてる業者さん目線だよね
エンドのユーザーはそんなのに目を通さないしね 見てもどれが自分の不具合に当て嵌まるか解かり辛いしね
じゃあ内製のユーザーはロールバックバックバックし続けるしか無いよね
アプデを停め続けるひとも居るかも知らんけど、そうすると1年分とか溜まってそれはそれで地獄を見るしね

やっぱこういう場所で症状とかを意見交換するのは貴重なんだ、と再認識
2023/06/09(金) 17:23:51.20ID:XhtkwaOO
>>662
はい、開発委託業者です
確かにエンドユーザーさんにリリースページは無縁ですよね
一応システム担当者さんにはお知らせしましたけど、こちらで随時チェックという感じでした
また修正されてもリリースページに載らない細かい不具合修正も多いです
レポートの罫線不具合はまさにそれでした

■最新チャネル リリースのリリース ノート - Office release notes | Microsoft Learn
https://learn.microsoft.com/ja-jp/officeupdates/current-channel
2023/06/10(土) 18:20:00.00ID:u0MJNtiG
あと、マクロだと screen.active.control とか出来ないよね
665664
垢版 |
2023/06/10(土) 18:20:16.44ID:u0MJNtiG
誤爆
2023/06/11(日) 17:21:05.93ID:/gnEKRu3
sleep をどんだけにするかどうやって決めるの?
2023/06/13(火) 15:38:15.16ID:bu7CkXDV
VBAで自作のクラスモジュール作成したんですが、
それを引数で渡す関数の書き方がわかりません

Sub test(ByVal hoge As Hoge)

みたいな感じで書いたのですがうまくいきません。
(As Hogeが自動でAs hogeと変換されるし、エラーになります)
どなたか教えていただけませんでしょうか?
2023/06/13(火) 19:34:42.68ID:d6Pomi9y
>>667
引数hogeに引っ張られるVBAの仕様です
VBAでは変数にクラス名を使うのは避けた方が良いですよ
プロジェクト内に変数hogeが存在している時も同様です
2023/06/14(水) 11:24:04.63ID:3Eu4F25u
>>667
VBAでクラスモジュールなんて不要
2023/06/15(木) 16:26:17.40ID:VlP0x+zk
>>669
流石にそれはない。クラスモジュールがある方が便利だよ。
2023/06/15(木) 19:09:52.15ID:y9q9PTdn
bindってのでクラスモジュールの有り難みを知りました
2023/06/15(木) 20:42:35.42ID:RAXKxz4R
俺もクラス使いたい派
保守性が全然違う
2023/06/15(木) 22:46:38.48ID:VlP0x+zk
クラス使わないと同じようなコードが量産されて面倒くさすぎる
2023/06/15(木) 22:47:32.53ID:VlP0x+zk
ただでさえポンコツな言語なんだから、クラスぐらい使おうよ。
2023/06/16(金) 20:25:21.43ID:cjNqE8A3
>>673
そのせいだったのか、クラス使えば良かった
2023/06/21(水) 20:54:02.92ID:b8UND1s3
ADOでCSVからテーブルを作ろうとしたらレコードが大きすぎますって怒られるんですよ!
1レコード2000バイトも無いのにですよ!
400列くらいあるのがダメなんですか?
2013なんですが。
2023/06/21(水) 21:15:42.66ID:gk5UG/Z5
フィールド数の上限は255だからかな
2023/06/23(金) 13:04:47.47ID:pHYUvccd
フィールド数上限は実は罠
2023/06/23(金) 15:26:54.30ID:X84KLwiQ
過去最大のフィールド数は500
テーブル分割して収納した
2023/06/23(金) 15:42:34.83ID:jhieer6M
分割したらフィールド数じゃないな
2023/06/23(金) 16:07:44.83ID:/GlO4XTI
メモ型にコンマ付で格納
2023/06/24(土) 09:17:24.69ID:5hQB8dV1
>>681
それに意味有るの?
2023/06/26(月) 19:43:31.70ID:nvUGoLmX
Access2019でリボン非表示にするのは、どうするの?
2023/06/26(月) 20:17:04.89ID:nvUGoLmX
>>683
細工されないようにXMLで記述したい
2023/06/26(月) 21:25:45.94ID:Ezf4n+79
XML???
VBAでなら
DoCmd.ShowToolbar "Ribbon", acToolbarNo
ってのがあるが
2023/06/27(火) 08:56:44.60ID:5UYjwK7S
それだと使用者に解除されちゃうので、XMLで空のカスタムリボン作って、オプション→現在のデータベース→リボンとツールバーのオプションに設定したいんよ
Access2019だとスクラッチからリボン作ってもファイルボタンが残っちゃうのが解ったので、それで我慢する
2023/09/14(木) 09:18:05.95ID:t/htNvkA
サブフォームをもつフォームにおいて、
親フォーム側から
Me.サブフォーム.Requery
を実行すると、サブフォームのCurrentイベントが2回発生するんだけど、なんでなんだろ?
2023/09/14(木) 10:41:11.21ID:UPFEbPP4
大抵はそう組まれているからそう動作する
親フォームからひとつずつチェックしてみれば「あぁ、ここか」が出てきたりする
2023/09/14(木) 10:50:23.10ID:t/htNvkA
>>688
検証のために、メインフォーム上ににサブフォームとサブフォームをRequeryさせるだけのボタンの最小限の構成にしても
687で書いた現象が発生している(サブフォーム側はCurrentイベントにdebug.printを書いただけ)

私は何か根本的な勘違いをしているのだろうか?それともAccessの仕様なのだろうか?
2023/09/14(木) 12:58:11.51ID:UPFEbPP4
フォームをデザインビューにした時に出て来るプロパティシート
おおむかし、あの枠が狭くて知らぬ間に二行に記載していたことは稀によくあった
Excelで言う、セル内改行をやってしまっていた 見た目はいっこなので気付きにくい
或いは、サブフォームをよりシンプルなものでテストするとか
仕様なら同様の質問疑問がてんこ盛りに投稿されるはず
 と思って探ってみたら、こんなのが・・
http://yamav102.cocolog-nifty.com/blog/2015/05/from_current-96.html  これ系?
2023/09/14(木) 13:40:41.27ID:t/htNvkA
>>690
サブフォームは新規作成した状態のものにCurrentイベントにdebug.print書いただけのものでも2回発生してるのよ

提示していただいたページはこちらで調べたときに見ていますが、そのページで書かれてるのは自分自身に対するRequeryのようなのでちょっと事情が違うようです

frmMain
------------------
Option Compare Database
Option Explicit

Private Sub btnRequery_Click()
Debug.Print "clicked ------"
Me.frmSub.Requery
Debug.Print "--------------"
End Sub
--------------------

frmSub
--------------------
Option Compare Database
Option Explicit

Private Sub Form_Current()
Debug.Print "frmSub Form_Current"
End Sub
---------------------
こんなかんじの検証用のを用意
2023/09/14(木) 13:41:20.11ID:t/htNvkA
んで、実行結果(イミディエイトウィンドウ)が

clicked ------
frmSub Form_Current
frmSub Form_Current
--------------
2023/09/14(木) 14:52:05.24ID:UPFEbPP4
イメージだけで応答してたから、どうにもとっ散らかってた 現物当たって真似してみた
https://learn.microsoft.com/ja-jp/office/vba/api/access.form.current
  このイベントは、フォームが開いたときと、フォーカスがレコード間を移動したときの
  いずれの場合にも発生します。
複数回発生して当たり前だった 
Form_Load (読み込み時) 或いは Form_Abtivate (アクティブ時) に変えればおk
どうしてもForm_Current (レコード移動時)に設定したい場合は見て見ぬ振りをするしか
2023/09/14(木) 15:04:03.08ID:t/htNvkA
>>693
loadやactivateではrequery時にイベントが発生しないので、本来の目的を達成できません
また、最初にフォームが開かれたときにはcurrentは一度しか発生していません
2023/09/14(木) 16:54:04.40ID:UPFEbPP4
btnRequery をクリックしても Requery できない?という意味?
Me.frmSub.Requery を Me!frmSub.Form.Requery にしてみては?
Me. か Me! かでも変わって来るし、.Form を付ける付けないでも挙動が変わったような

あと、frmMain を開いただけでも frmSub Form_Current が発生するのも違う気がするし
frmMain でパラメータ変えて frmSub を Requery させたいとかなら
https://teratail.com/questions/123328 このhatenaさんの回答を参考にしてみたり
Docmd.Requery でやっつけてみたり Requeryの使い方もクセがあるので切磋琢磨が
必要だったり
2023/09/14(木) 17:08:38.96ID:t/htNvkA
>>695
frmSubはfrmMainに貼り付けられているのでfrmMainを開くと当然frmSubも開かれるので、
Open, Load, Current等のイベントはひととおり発生します(仕様通り)
これについては特に問題ではありません

問題にしているのはbtnRequeryをクリックしたときに、Me.frmSub.Requeryを一度しか呼んでいないのに
frmSubのCurrentイベントが二度発生していることです

紹介いただいたteratailのページを参考にあれこれ試してみたいと思います
2023/09/14(木) 21:20:00.47ID:dY8DD9uu
AccessにGROUP_CONCATみたいなのなかった?
2023/09/14(木) 23:10:56.65ID:kQn+Df7T
サブフォームのレコードソースにテーブル指定して >>691 やってもカレントは一回しか表示されんけどな
レコードソース無ければ2回カレントは表示される

サブフォームにレコードソース指定してる?
2023/09/15(金) 08:38:48.79ID:cxAk3WqI
>>698
たしかにレコードソースはしていしていません
なるほど理由はよく分からないけれど、原因は分りました
ありがとうございます
2023/10/03(火) 11:54:07.91ID:BE4+HOMv
ちょっと不思議な話
よくある数値の切捨て処理のfunctionとして
Function RoundDownDec(decNum as Currency, intPlace as Integer) as Currency
 RoundDownDec = Fix(decNum * 10 ^ intPlace) / 10 ^ intPlace
End Function
処理したいデータの都合で与える数値も戻り値も十進型としています
(正負の処理などは今回の本題から外れるので例からは省いています)
RoundDownDec(33.6, 2) としたときに、33.6が返ってくるのを期待しますが33.59が返ってきます
不思議!
functionの中身を
Dim tmp As Currency
tmp = Fix(decNum * 10 ^ intPlace)
Debug.Print tmp
RoundDownDec = tmp / 10 ^ intPlace
と段階を踏ませるとイミディエイトウィンドウに3359が出るので更に
tmp = decNum * 10 ^ intPlace
tmp = Fix(tmp)
と分解すると、期待通りの結果(33.6)が得られます
Fix()の引数はdoubleなんで、暗黙的な型変換が行われているせいなんだろうけれど、微妙に納得がいかない不思議な話でした
2023/10/03(火) 11:59:45.89ID:BE4+HOMv
ちなみに蛇足ですが、普通に
Function RoundDown(dblNum As Double, intPlace As Integer) As Double
とdoubleを引数にした場合は、特別なことをしなくても RoundDown(33.6, 2) の結果は33.6となります
702デフォルトの名無しさん
垢版 |
2023/10/04(水) 10:07:17.16ID:e9fui2Qq
浮動小数点を経由するので誤差から免れることはできません(以下はイミディエイト ウィンドウでの実行と結果)
? Fix(33.6 * 10 ^ 2), Fix(33.6@ * 10 ^ 2), Fix(33.6! * 10 ^ 2)
3360 3359 3359
単精度でも同様

? Fix(33.6@ * 10 ^ 2) / 100, Fix(CCur(33.6@ * 10 ^ 2)) / 100, Fix(33.6@ * 100) / 100
33.59 33.6 33.6
べき乗を使うことが誤差を生む原因の一部でもあったりするので、CCur()で一度補正?したりで影響を減らすとかも考えられます。
2023/10/04(水) 10:57:33.10ID:95ZKO4kH
検証ありがとうございます

浮動小数点を経由するので誤差がでるのは理屈としては理解できるのですが、
わざわざ十進型を使ってるのに…というのや、Fix()に渡される式の結果ではなく、
渡された段階で暗黙的な型変換が行われているっぽいのが腑に落ちなさの一因なのでしょう
704デフォルトの名無しさん
垢版 |
2023/10/04(水) 14:52:16.68ID:e9fui2Qq
? Fix(33.6@ * 10 ^ 2) , Fix(33.6@ * 100)
3359 3360
の結果からもわかるように、今回の場合は 10 ^ 2 の値が浮動小数点であり ≠100 である
ということです
なので「33.6@ * 浮動小数点」は33.6@を浮動小数点として計算する(はず)ので、その結果が
許容できない値になってしまったと
対策として CCur(33.6@ * 10 ^ 2)で本来の値に近くなるように書きましたが、
べき乗の部分を一度整数変数に代入してから「33.6@ * 整数変数」の形にしてもいいと思います(未検証)
この場合、通貨型は内部整数 * 整数なのでここまでの計算結果に誤差はでません。(乗数マイナスは別)

RoundDownDec()を大量に使用する場合はパフォーマンスも考慮しないといけませんが、乗数を整数変数経由に
する方が CCur()関数使うより早いのではと思います(昔、関数使うと遅いなと思った経験)。
100万回くらい(適当)ループして検証してみてください。
2023/10/04(水) 15:22:35.37ID:95ZKO4kH
更なる解説ありがとうございます

? TypeName(10^2)
Double
正直これは盲点でした
原因がはっきりわかりすっきりしました
ありがとうございます
2023/10/04(水) 21:35:38.35ID:GiHPLbjK
VBAの内部計算につかう型は結構複雑な変換をする
33.6@ * 整数変数の結果は、Currency型だぜ
多くの関数や演算子で、より精度の高い型を使おうとするんだが、べき乗はDoubleしか返さん仕様っぽいな
自分でCurrencyかDecimalでべき乗する関数作れば解決
2023/10/04(水) 23:36:55.88ID:hn2MViTp
OpenArgsってなんて読んでますか?
何の単語の略なんでしょうか
ご存じのかた教えてください
2023/10/05(木) 01:14:56.61ID:6f6nA7M7
>>706
CurrencyかDecimalでべき乗する関数ってどのような?
2023/10/05(木) 04:00:15.23ID:xIPl72Do
>>708
こまかい条件省くとこんな感じじゃね
Function pow(x As Currency, y As Integer) As Variant
Dim i As Integer
Dim ret As Variant
ret = CDec(x)
For i = 1 To y - 1
ret = ret * CDec(x)
Next
pow = ret
End Function

Decimalは直接定義できないからVariantで宣言してる
2023/10/05(木) 04:05:04.32ID:xIPl72Do
>>707
おーぷんあーぎゅめんつ
argsはargumentsの略 引数
711デフォルトの名無しさん
垢版 |
2023/10/05(木) 18:08:52.91ID:dRlX4TIE
>>709
そんな低レベルな関数書いて「解決っ」とか言っちゃって時点でバカにも程がある
712デフォルトの名無しさん
垢版 |
2024/03/24(日) 13:50:16.81ID:6zfiQZRE
業務用のmdbがポンコツコードだらけなので書き換えてるんだけど、IIFが最大4個ネストしてあった。
4個ネストしてあるのは変数の値の判定が条件になっているけど、3個以下のは関数を呼び出している。
皆さんだったらどうします?
713デフォルトの名無しさん
垢版 |
2024/03/24(日) 19:36:20.19ID:S7ogYjm0
将来も含めてどのレベルの人がメンテしていくかだろうな
ソースの書き方も人それぞれ
例えばコメントの書き方でも、巷では行間に書くのが多いが、私は画面内に一度に表示できるロジックの行数減って見通し悪くなるから、行末側に書きたい
画面も横長だし
とか厳密に書き方決めないと人それぞれになってしまうのよね
ネストの段数にしても固定してしまうと、ムダに外出ししてしまうとかもあったり
ソースを見やすくするか、コメントで逃げるとかはもうコーティング規則にするか、それしないなら担当者判断でしかない
iifもネストなんて場合によりどちらでもいい
714デフォルトの名無しさん
垢版 |
2024/03/24(日) 22:33:27.39ID:6zfiQZRE
とりあえず、測定用の簡単なVBAを作って、IIFのネストがどのくらい遅いのか確かめてみます。
変数の値の判定くらいなら差はほとんどないという記事を読んだことがあります。しかし、関数呼び出しをするとかなり違うという記事も読んだことがあります。
なので、呼び出された関数が10個、さらにそれぞれの関数が10個の関数を呼び出すようなコードでも書いて調べてみます。
昔Ken Getzの本を何冊か読んだ記憶ではOptimizationの章では揃ってIIfを避けるように書いてありましたね。
715デフォルトの名無しさん
垢版 |
2024/03/25(月) 10:06:54.06ID:wTe6l7XU
>>714
あぁ、それなら全ての条件を評価する(初期の判定で達しないとこも)から、遅くはなる
そういう弊害があるから一律使わなくするなんてことは、あったりするだろうね
そういうの見ると「はぁ⤵」って思うけど
716デフォルトの名無しさん
垢版 |
2024/03/25(月) 15:11:37.51ID:wTe6l7XU
>>715
ちなみにif~thenも全判定なので、iif禁止で問題解決になるわけでもない
2024/03/26(火) 00:35:40.91ID:YALkMi+F
>>714
Access のIIFの問題は判定結果に関わらず
TrueパートとFalseパートの両方が評価(関数なら実行)されてしまう仕様

a = IIF(True, funcA, funcB)
funcAだけでなくfuncBもコールされる
aにはfuncAの戻り値が入る

関数の実装内容によってはパフォーマンスに影響が出るでしょうね
IFではどちらか一方のみ結果パートが評価されます
2024/03/26(火) 12:43:56.27ID:H7z+7I0f
>>716
if thenが全判定てなにを言っているんだ
andとorがショートサーキット演算しないだけだぞ
基本vbaはショートサーキットしない
例外はif関数ぐらいか
719デフォルトの名無しさん
垢版 |
2024/03/26(火) 13:57:38.44ID:kj3sgFU0
>>718
日本語理解できない、省略を補完する知識もないシナのアホが飛来したな
2024/03/27(水) 13:19:17.09ID:BmA2tbQj
Select CaseはTrueが出たところで打ち切るからTrueになりそうな条件を上の方に書くべきて読んだことがあるなあ
721デフォルトの名無しさん
垢版 |
2024/04/19(金) 10:08:55.39ID:uD5nyH4z
>>720
普通の人間ならそうなるだろ?
レアパターンを先に評価するやつなんて変わり者
722デフォルトの名無しさん
垢版 |
2024/04/19(金) 11:20:47.33ID:TeTgAng2
>>721
1、2、3……順とかにするのは普通
頻度順にまではしないことも多々ある
723デフォルトの名無しさん
垢版 |
2024/04/25(木) 00:00:11.21ID:SJJcBnEk
>>722
マジックナンバーかよw
724デフォルトの名無しさん
垢版 |
2024/04/25(木) 00:18:38.90ID:9pftPPPG
>>723
┐⁠(⁠´⁠ー⁠`⁠)⁠┌
725デフォルトの名無しさん
垢版 |
2024/05/07(火) 09:19:02.24ID:dcFbjZui
MT4かよ
2024/05/26(日) 18:34:28.21ID:TVlTpabA
FileSystemObjectのDeleteFolderかFolder.Delete使うと
対象フォルダーにシンボリックリンクやジャンクションあると
リンクじゃなく参照先が削除されるから気を付けた方が良いよ
定期的に掃除するログやバックアップフォルダーに
大事なフォルダーへのリンクなんか悪戯で作成されると消えちゃう
仕込まれた日と削除される日に時間差があるので追跡難しい
Defenderも気付いてくれない
フォルダーの削除はRmDirにしとき
727デフォルトの名無しさん
垢版 |
2024/06/19(水) 13:39:07.69ID:Z4GWURaA
恐ろしい
そんな罠が
最近fsoの方使ってるから気をつけなければ
情報thx
2024/06/21(金) 17:49:43.88ID:97rAWOJS
kill のが一般的だと思ってたが、そんなことは無かったのか
シンボリックリンクやジャンクション(つまりショートカット?)とかがある場合の挙動は知らないけど
比べた人が居て、ほぼおなじ動作なら kill のが楽だと
tps://www.limecode.jp/entry/difference/kill-deletefile
729デフォルトの名無しさん
垢版 |
2024/06/21(金) 18:18:10.26ID:JmSRYM7J
削除の差異は意識してなかったからよくわからんけど、ファイルやフォルダの扱いがfsoの方が書きやすい、わかりやすいでこっち使い始めたかな…
再帰とかfsoの方が書きやすい(ソースがシンプル)はず…
2024/06/21(金) 21:19:36.24ID:jAZYV/Wx
BASICはOSだからな
2024/06/22(土) 08:54:35.35ID:wHSF3406
違うか フォルダの中に拡張子.lnk があるかどうか事前にチェックするべきか(他の対象外のファイルとかも
DeleteFolder や RmDir だと無条件で削除してしまうからキケンがあぶないってことか
キャベツを包丁で切ったら青虫まで一緒に切り刻んでしまいました
あらかじめ葉をむしって洗ってから切りましょう みたいなことだろうな
732デフォルトの名無しさん
垢版 |
2024/06/22(土) 11:29:50.78ID:n6A/NZx5
チェックするの面倒だから豆腐切れない斬鉄剣で切るんじゃないの?
2024/06/22(土) 11:47:45.85ID:R3uDiOs/
rm -rf /
734デフォルトの名無しさん
垢版 |
2024/06/22(土) 13:28:14.09ID:AjNB02TK
NG🚮
735デフォルトの名無しさん
垢版 |
2024/06/22(土) 13:38:00.95ID:o/eWDsQ7
どっちかというとやばいのは
rm -rf *
の方だったかな
736デフォルトの名無しさん
垢版 |
2024/06/24(月) 00:37:34.39ID:sso3G8sO
>>730
それはBASICインタプリタが起動しているだけ
2024/06/24(月) 15:47:37.22ID:W/0xkGee
Accessに限らんじゃん Word でも Excel でもてことだよな
Excel連中に知られたら、阿鼻叫喚の世界だな あいつら節操無いし
738デフォルトの名無しさん
垢版 |
2024/06/24(月) 16:26:48.42ID:F40a+XEU
知らなくても知ってたといいはるからなw

逆に知らなかったことにすることあるわ
森は大切に育てないとな
2024/10/01(火) 09:21:59.28ID:TDdMwhQJ
Conpact & Repairを内部からVBAで命令しようと思ってAIに訊きながら何時間も格闘したあとにググったらできないことが判明した。
Claude3.5とGemini Proがここまで馬鹿とは。
何度も提案してくるけどシンタックスエラー出しまくるし。基本構文すら間違えるようでは人間プログラマーはまだまだ安泰だね。
2024/12/03(火) 11:46:34.24ID:dxkeCahd
ファイルメニューのオプションで、閉じるときに最適化する を選んでおくだけでいいような
これをチェックしないまま使い続けて「壊れた」とか「容量が」とか大騒ぎする方々が多い気がする
気がするだけだけど ×Conpact ○Compact
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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