2ちゃんねる ■掲示板に戻る■ 全部 1- 最新50    

Access VBA 質問スレ Part2

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

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


前回のスレッド
Access VBA 質問スレ Part1
https://mevius.5ch.net/test/read.cgi/tech/1328536426/

692 :デフォルトの名無しさん:2023/09/14(木) 12:58:11.51 ID:UPFEbPP4.net
フォームをデザインビューにした時に出て来るプロパティシート
おおむかし、あの枠が狭くて知らぬ間に二行に記載していたことは稀によくあった
Excelで言う、セル内改行をやってしまっていた 見た目はいっこなので気付きにくい
或いは、サブフォームをよりシンプルなものでテストするとか
仕様なら同様の質問疑問がてんこ盛りに投稿されるはず
 と思って探ってみたら、こんなのが・・
http://yamav102.cocolog-nifty.com/blog/2015/05/from_current-96.html  これ系?

693 :デフォルトの名無しさん:2023/09/14(木) 13:40:41.27 ID:t/htNvkA.net
>>692
サブフォームは新規作成した状態のものに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
---------------------
こんなかんじの検証用のを用意

694 :デフォルトの名無しさん:2023/09/14(木) 13:41:20.11 ID:t/htNvkA.net
んで、実行結果(イミディエイトウィンドウ)が

clicked ------
frmSub Form_Current
frmSub Form_Current
--------------

695 :デフォルトの名無しさん:2023/09/14(木) 14:52:05.24 ID:UPFEbPP4.net
イメージだけで応答してたから、どうにもとっ散らかってた 現物当たって真似してみた
https://learn.microsoft.com/ja-jp/office/vba/api/access.form.current
  このイベントは、フォームが開いたときと、フォーカスがレコード間を移動したときの
  いずれの場合にも発生します。
複数回発生して当たり前だった 
Form_Load (読み込み時) 或いは Form_Abtivate (アクティブ時) に変えればおk
どうしてもForm_Current (レコード移動時)に設定したい場合は見て見ぬ振りをするしか

696 :デフォルトの名無しさん:2023/09/14(木) 15:04:03.08 ID:t/htNvkA.net
>>695
loadやactivateではrequery時にイベントが発生しないので、本来の目的を達成できません
また、最初にフォームが開かれたときにはcurrentは一度しか発生していません

697 :デフォルトの名無しさん:2023/09/14(木) 16:54:04.40 ID:UPFEbPP4.net
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の使い方もクセがあるので切磋琢磨が
必要だったり

698 :デフォルトの名無しさん:2023/09/14(木) 17:08:38.96 ID:t/htNvkA.net
>>697
frmSubはfrmMainに貼り付けられているのでfrmMainを開くと当然frmSubも開かれるので、
Open, Load, Current等のイベントはひととおり発生します(仕様通り)
これについては特に問題ではありません

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

紹介いただいたteratailのページを参考にあれこれ試してみたいと思います

699 :デフォルトの名無しさん:2023/09/14(木) 21:20:00.47 ID:dY8DD9uu.net
AccessにGROUP_CONCATみたいなのなかった?

700 :デフォルトの名無しさん:2023/09/14(木) 23:10:56.65 ID:kQn+Df7T.net
サブフォームのレコードソースにテーブル指定して >>693 やってもカレントは一回しか表示されんけどな
レコードソース無ければ2回カレントは表示される

サブフォームにレコードソース指定してる?

701 :デフォルトの名無しさん:2023/09/15(金) 08:38:48.79 ID:cxAk3WqI.net
>>700
たしかにレコードソースはしていしていません
なるほど理由はよく分からないけれど、原因は分りました
ありがとうございます

702 :デフォルトの名無しさん:2023/10/03(火) 11:54:07.91 ID:BE4+HOMv.net
ちょっと不思議な話
よくある数値の切捨て処理の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なんで、暗黙的な型変換が行われているせいなんだろうけれど、微妙に納得がいかない不思議な話でした

703 :デフォルトの名無しさん:2023/10/03(火) 11:59:45.89 ID:BE4+HOMv.net
ちなみに蛇足ですが、普通に
Function RoundDown(dblNum As Double, intPlace As Integer) As Double
とdoubleを引数にした場合は、特別なことをしなくても RoundDown(33.6, 2) の結果は33.6となります

704 :デフォルトの名無しさん:2023/10/04(水) 10:07:17.16 ID:e9fui2Qq.net
浮動小数点を経由するので誤差から免れることはできません(以下はイミディエイト ウィンドウでの実行と結果)
? 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()で一度補正?したりで影響を減らすとかも考えられます。

705 :デフォルトの名無しさん:2023/10/04(水) 10:57:33.10 ID:95ZKO4kH.net
検証ありがとうございます

浮動小数点を経由するので誤差がでるのは理屈としては理解できるのですが、
わざわざ十進型を使ってるのに…というのや、Fix()に渡される式の結果ではなく、
渡された段階で暗黙的な型変換が行われているっぽいのが腑に落ちなさの一因なのでしょう

706 :デフォルトの名無しさん:2023/10/04(水) 14:52:16.68 ID:e9fui2Qq.net
? 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万回くらい(適当)ループして検証してみてください。

707 :デフォルトの名無しさん:2023/10/04(水) 15:22:35.37 ID:95ZKO4kH.net
更なる解説ありがとうございます

? TypeName(10^2)
Double
正直これは盲点でした
原因がはっきりわかりすっきりしました
ありがとうございます

708 :デフォルトの名無しさん:2023/10/04(水) 21:35:38.35 ID:GiHPLbjK.net
VBAの内部計算につかう型は結構複雑な変換をする
33.6@ * 整数変数の結果は、Currency型だぜ
多くの関数や演算子で、より精度の高い型を使おうとするんだが、べき乗はDoubleしか返さん仕様っぽいな
自分でCurrencyかDecimalでべき乗する関数作れば解決

709 :デフォルトの名無しさん:2023/10/04(水) 23:36:55.88 ID:hn2MViTp.net
OpenArgsってなんて読んでますか?
何の単語の略なんでしょうか
ご存じのかた教えてください

710 :デフォルトの名無しさん:2023/10/05(木) 01:14:56.61 ID:6f6nA7M7.net
>>708
CurrencyかDecimalでべき乗する関数ってどのような?

711 :デフォルトの名無しさん:2023/10/05(木) 04:00:15.23 ID:xIPl72Do.net
>>710
こまかい条件省くとこんな感じじゃね
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で宣言してる

712 :デフォルトの名無しさん:2023/10/05(木) 04:05:04.32 ID:xIPl72Do.net
>>709
おーぷんあーぎゅめんつ
argsはargumentsの略 引数

713 :デフォルトの名無しさん:2023/10/05(木) 18:08:52.91 ID:dRlX4TIE.net
>>711
そんな低レベルな関数書いて「解決っ」とか言っちゃって時点でバカにも程がある

714 :デフォルトの名無しさん:2024/02/19(月) 13:32:04.50 ID:2EJLRmB3B
岸田異次元増税憲法カ゛ン無視地球破壞軍國主義売國奴文雄か゛崇拝する世界最惡のならす゛者國家か゛落とした広島原爆て゛14万人殺されたそうだか゛
WMOによると1970年以降確認されているだけで気侯変動による災害で殺された人数は200万人以上經済損失は600兆円以上な
カによるー方的な現状変更で都心まて゛数珠つなき゛でクソ航空機に私有地侵略させて住民ヰライラ犯罪惹起してる税金泥棒クソポリ公騒音ヘリ
だの住民の権利を強奪して私腹を肥やす強盗殺人テロ国家日本.広島の公園では肉を焼くでもなく無意味に火を燃やし続けて温室効果カ゛スまき
散らし続けてこんなハ゛カ丸出し自己滿足で盛大に人殺しに加担しなか゛ら何が平和た゛か笑わせんなって話だろ、挙句の果てにサミッ├だの
爺7テ口リス├と゛もが国民から強奪した莫大な金て゛住民の生命と財産を破壞しながらハ゛カ丸出しオナニ━集會,氣候変動させて日本どころか
世界中で土砂崩れに洪水,暴風,熱中症、森林火災にと災害連發させて,核なんかおもちゃに思えるほどの地球破壊による大量殺戮しなか゛ら
他国非難とか,クソシナ顔負けのプ囗パカ゛ンダ放送繰り返したところて゛騙されるのは知障だけだそ゛クソテ口政府
(ref.) ttps://www.call4.jp/info.php?type=items&id=I0000062
ttps://haneda-project.jimdofree.com/ , ttps://flight-route.com/
ttps://n-souonhigaisosyoudan.amebaownd.com/

715 :デフォルトの名無しさん:2024/03/24(日) 13:50:16.81 ID:6zfiQZRE.net
業務用のmdbがポンコツコードだらけなので書き換えてるんだけど、IIFが最大4個ネストしてあった。
4個ネストしてあるのは変数の値の判定が条件になっているけど、3個以下のは関数を呼び出している。
皆さんだったらどうします?

716 :デフォルトの名無しさん:2024/03/24(日) 19:36:20.19 ID:S7ogYjm0.net
将来も含めてどのレベルの人がメンテしていくかだろうな
ソースの書き方も人それぞれ
例えばコメントの書き方でも、巷では行間に書くのが多いが、私は画面内に一度に表示できるロジックの行数減って見通し悪くなるから、行末側に書きたい
画面も横長だし
とか厳密に書き方決めないと人それぞれになってしまうのよね
ネストの段数にしても固定してしまうと、ムダに外出ししてしまうとかもあったり
ソースを見やすくするか、コメントで逃げるとかはもうコーティング規則にするか、それしないなら担当者判断でしかない
iifもネストなんて場合によりどちらでもいい

717 :デフォルトの名無しさん:2024/03/24(日) 22:33:27.39 ID:6zfiQZRE.net
とりあえず、測定用の簡単なVBAを作って、IIFのネストがどのくらい遅いのか確かめてみます。
変数の値の判定くらいなら差はほとんどないという記事を読んだことがあります。しかし、関数呼び出しをするとかなり違うという記事も読んだことがあります。
なので、呼び出された関数が10個、さらにそれぞれの関数が10個の関数を呼び出すようなコードでも書いて調べてみます。
昔Ken Getzの本を何冊か読んだ記憶ではOptimizationの章では揃ってIIfを避けるように書いてありましたね。

718 :デフォルトの名無しさん:2024/03/25(月) 10:06:54.06 ID:wTe6l7XU.net
>>717
あぁ、それなら全ての条件を評価する(初期の判定で達しないとこも)から、遅くはなる
そういう弊害があるから一律使わなくするなんてことは、あったりするだろうね
そういうの見ると「はぁ⤵」って思うけど

719 :デフォルトの名無しさん:2024/03/25(月) 15:11:37.51 ID:wTe6l7XU.net
>>718
ちなみにif~thenも全判定なので、iif禁止で問題解決になるわけでもない

720 :デフォルトの名無しさん:2024/03/26(火) 00:35:40.91 ID:YALkMi+F.net
>>717
Access のIIFの問題は判定結果に関わらず
TrueパートとFalseパートの両方が評価(関数なら実行)されてしまう仕様

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

関数の実装内容によってはパフォーマンスに影響が出るでしょうね
IFではどちらか一方のみ結果パートが評価されます

721 :デフォルトの名無しさん:2024/03/26(火) 12:43:56.27 ID:H7z+7I0f.net
>>719
if thenが全判定てなにを言っているんだ
andとorがショートサーキット演算しないだけだぞ
基本vbaはショートサーキットしない
例外はif関数ぐらいか

722 :デフォルトの名無しさん:2024/03/26(火) 13:57:38.44 ID:kj3sgFU0.net
>>721
日本語理解できない、省略を補完する知識もないシナのアホが飛来したな

723 :デフォルトの名無しさん:2024/03/27(水) 13:19:17.09 ID:BmA2tbQj.net
Select CaseはTrueが出たところで打ち切るからTrueになりそうな条件を上の方に書くべきて読んだことがあるなあ

724 :デフォルトの名無しさん:2024/04/19(金) 10:08:55.39 ID:uD5nyH4z.net
>>723
普通の人間ならそうなるだろ?
レアパターンを先に評価するやつなんて変わり者

725 :デフォルトの名無しさん:2024/04/19(金) 11:20:47.33 ID:TeTgAng2.net
>>724
1、2、3……順とかにするのは普通
頻度順にまではしないことも多々ある

726 :デフォルトの名無しさん:2024/04/25(木) 00:00:11.21 ID:SJJcBnEk.net
>>725
マジックナンバーかよw

727 :デフォルトの名無しさん:2024/04/25(木) 00:18:38.90 ID:9pftPPPG.net
>>726
┐⁠(⁠´⁠ー⁠`⁠)⁠┌

728 :デフォルトの名無しさん:2024/05/07(火) 09:19:02.24 ID:dcFbjZui.net
MT4かよ

729 :デフォルトの名無しさん:2024/05/26(日) 18:34:28.21 ID:TVlTpabA.net
FileSystemObjectのDeleteFolderかFolder.Delete使うと
対象フォルダーにシンボリックリンクやジャンクションあると
リンクじゃなく参照先が削除されるから気を付けた方が良いよ
定期的に掃除するログやバックアップフォルダーに
大事なフォルダーへのリンクなんか悪戯で作成されると消えちゃう
仕込まれた日と削除される日に時間差があるので追跡難しい
Defenderも気付いてくれない
フォルダーの削除はRmDirにしとき

730 :デフォルトの名無しさん:2024/06/19(水) 13:39:07.69 ID:Z4GWURaA.net
恐ろしい
そんな罠が
最近fsoの方使ってるから気をつけなければ
情報thx

731 :デフォルトの名無しさん:2024/06/21(金) 17:49:43.88 ID:97rAWOJS.net
kill のが一般的だと思ってたが、そんなことは無かったのか
シンボリックリンクやジャンクション(つまりショートカット?)とかがある場合の挙動は知らないけど
比べた人が居て、ほぼおなじ動作なら kill のが楽だと
tps://www.limecode.jp/entry/difference/kill-deletefile

732 :デフォルトの名無しさん:2024/06/21(金) 18:18:10.26 ID:JmSRYM7J.net
削除の差異は意識してなかったからよくわからんけど、ファイルやフォルダの扱いがfsoの方が書きやすい、わかりやすいでこっち使い始めたかな…
再帰とかfsoの方が書きやすい(ソースがシンプル)はず…

733 :デフォルトの名無しさん:2024/06/21(金) 21:19:36.24 ID:jAZYV/Wx.net
BASICはOSだからな

734 :デフォルトの名無しさん:2024/06/22(土) 08:54:35.35 ID:wHSF3406.net
違うか フォルダの中に拡張子.lnk があるかどうか事前にチェックするべきか(他の対象外のファイルとかも
DeleteFolder や RmDir だと無条件で削除してしまうからキケンがあぶないってことか
キャベツを包丁で切ったら青虫まで一緒に切り刻んでしまいました
あらかじめ葉をむしって洗ってから切りましょう みたいなことだろうな

735 :デフォルトの名無しさん:2024/06/22(土) 11:29:50.78 ID:n6A/NZx5.net
チェックするの面倒だから豆腐切れない斬鉄剣で切るんじゃないの?

736 :デフォルトの名無しさん:2024/06/22(土) 11:47:45.85 ID:R3uDiOs/.net
rm -rf /

737 :デフォルトの名無しさん:2024/06/22(土) 13:28:14.09 ID:AjNB02TK.net
NG🚮

738 :デフォルトの名無しさん:2024/06/22(土) 13:38:00.95 ID:o/eWDsQ7.net
どっちかというとやばいのは
rm -rf *
の方だったかな

739 :デフォルトの名無しさん:2024/06/24(月) 00:37:34.39 ID:sso3G8sO.net
>>733
それはBASICインタプリタが起動しているだけ

740 :デフォルトの名無しさん:2024/06/24(月) 15:47:37.22 ID:W/0xkGee.net
Accessに限らんじゃん Word でも Excel でもてことだよな
Excel連中に知られたら、阿鼻叫喚の世界だな あいつら節操無いし

741 :デフォルトの名無しさん:2024/06/24(月) 16:26:48.42 ID:F40a+XEU.net
知らなくても知ってたといいはるからなw

逆に知らなかったことにすることあるわ
森は大切に育てないとな

218 KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
名前: E-mail (省略可) :

read.cgi ver.24052200