Access VBA 質問スレ Part2
Access の VBA に関する質問スレです 質問テンプレ(雛形)は用意しませんが、OSとAccessのバージョンぐらいは必ず書きましょう 前回のスレッド Access VBA 質問スレ Part1 https://mevius.5ch.net/test/read.cgi/tech/1328536426/ プロパティーシートから直接Functinをcallするときに=Function()と書きますね。 これをvbaで設定できますか? モジュールプロパティーのCreateEvetnPorcからは当然ながらできません。 どのオブジェクトのメソッドならできますかね?それとも不可能でイベントプロシジャーでcall Functionと書くしか方法がないのでしょうか? 順位が1位から20位までのデータがあったとして、 SQLを使用して、下位3件のデータを上位から取得(18位、19位、20位の順)するにはどうすればよいですか? select * from (select top 3 * from テーブル名 order by 順位 desc) order by 順位 asc >>6 ありがとうございます。これです。これがやりたかったんです。本当にありがとうございます! 業務用mdbを眺めていたら,モジュールレベルでPublic宣言とGlobal宣言が混在している. このPGはアホなのかな? テーブル定義いじるやつはマゾだがデータ更新なら普通だろ そういえばGlobalって余り使わないけど publicとどういう差が有るのかは知らないなぁ 会社のPCがようやく7から10に切り替わり、 ついでにofficeが2010から2016になった。 そしたら・・・・・・ Accessのシステムが壊滅状態(;_;) 一番シンプルなところで、DateTimePickerがない・・・。 Access2016で日付フィールドとリンクしてない状態で、カレンダー使うのどしたらいいの・・・ 2010と互換性を維持したまま >>14 情シス「VBのランタイム入れません。よくわからないから。」 (;_;) >>12 カレンダー用のOCXだかDLLだかを持ってきて入れれば動くはずけど ライセンス的にどうだか知らない >>14 そもそもそのコンポーネントが今のACCESSに無くなってるから 2016をクリーンインストールしてれば参照設定できない 2010とかランタイム版あったはずだから、2016入れた後からインストールできるなら それ入れれば行ける気がする 試して報告してくれ そもそもAccessって、サポートあるの? あるとしたら、SA結んだら何回までオッケーただしおま環は知らんみたいな? Accessの謎の異常終了は、永久に治らないの?? microsoftはしかたなくaccessを続けているだけで microsoftは多分本気でやる気はないよ 本気ならとっくに2G制限も越えているだろうしネットワーク処理機能搭載くらいしている microsoftが本気ならファイルメーカーがやってる感じくらいの機能搭載や改良はしてる筈 office製品の一部だから止められないだけで 本格的な改修とかは無いと思っていた方が良い 絶対無いとは思わないけど 今ある範囲でやれる内容をこなす程度で期待とかはしないほうが良いと思う 元々別会社が作っていた物を会社ごと買収してaccessって名前にして出した? みたいな経緯だったと思う 確かwikipediaとかに書いてあったと思う だからなんつーか microsoftも余り思い入れが無いというか本気で無いというか そういう感じの所が有るのは仕方が無いのよ 寧ろここまで続いている方が驚き 近年他のアプリケーションの値段が上がっている中でaccessは値上げもたいしてしないし(はっきり確認したわけではないが) vb6.0が終わったのに比べて 良くaccessはこんなに続くなぁとは思う vb6.0とaccessvbaなんて殆ど同じなのになんでvb6.0止めたんだろうと思うくらい 64bit版は出すのに本格改修なんかはするつもりないみたいだし いったい何処まで続くのかある意味解らなくなってきた 他のアプリケーションが大きく変わったり無くなっている中で これだけ変わらず(細かい点を除けば)長く続くのはかなり珍しい気がする 言語仕様がほとんど変わらないおかげで20年前のシステムが今も使えている 開発コストと保守コスト考えたらAccessは素晴らしいよ ローカルでランダムアクセスできるAccessは気楽でいい excel vbaとaccess vba どっちの方が実用的ですか? T_商品というテーブルを用意し、そこには次の内容が入っており、 商品 材料1 材料2 材料3 卵かけご飯 卵 米 お好み焼き 小麦 卵 豚肉 ショートケーキ 卵 小麦 苺 アップルパイ りんご 小麦 牛乳 フォームに、材料A、材料Bのテキストボックスを置き、 検索ボタンを押すと、材料AかつBを含む商品が検索されるというVBAの記述に苦慮しています。 単独の材料であれば、VBAにSQLを組み込み、 SELECT * FROM 商品テーブル WHERE 材料1 = ' & 材料A & ' OR 材料2 = ' & 材料A & ' OR 材料3 = ' & 材料A & ' ; こんな感じでできるのですが、材料が2つ以上になるとどうすればよいか見当がつかなくなりました。 アドバイスいただけませんでしょうか? >>29 1がAかB かつ 2がAかB かつ 3がAかB じゃないかな…眠くて間違ってる気もする… あと、候補がおおすぎないなら、テキストボックスはコンボかな…(フォーム起動遅くなるなど副作用もあったりするのでこの案は無視して可) おやすみなさい… >>29 悪いことは言わんから、まずテーブル設計見直せ 馬鹿の次の質問 材料4を追加した時にはどうすれぱよいでしょうか? >>15 Visual Studio ExpressでDLL作れ >>29 そのテ―ブルはちょっと… 商品のテーブルと材料のテーブルで結合じゃね? accessは大昔にやってて今は持ってすらいないけど 該当行をdynasetで取り出した後 該当fieldから値を取り出して if分で有るか調べれば出来たりしないか? いくらでも増やしていいぞ SELECT * FROM 商品テーブル WHERE (材料1 = ' & 材料A & ' OR 材料2 = ' & 材料A & ' OR 材料3 = ' & 材料A & ') AND ("" = ' & 材料B & ' OR 材料1 = ' & 材料B & ' OR 材料2 = ' & 材料B & ' OR 材料3 = ' & 材料B & ') AND ("" = ' & 材料C & ' OR 材料1 = ' & 材料C & ' OR 材料2 = ' & 材料C & ' OR 材料3 = ' & 材料C & '); だから、材料フィールドを横に並べるのは作りが悪いだろ。 フィールド1個にして縦に並べるべきじゃね? 設計の問題だろ。 できるできないの問題じゃない。 なんで使い勝手の悪いもんをわざわざ作らなきゃならんのよ。 取り敢えず動かすなら、 材料1〜4をカンマで連結した文字列の中に、AとB両方ある と書けば人間にはわかりやすい まぁリレーショナルデータベースだから設計を変えるべきだけど access使うような所なんて零細なんだから そんなリファクタリングだのテストファーストだのモダンだのオブジェクト指向だのも関係無いような人材しか居ないんだから vbaベタベタというのでやるしかない みたいな感じなんだろう その人がそれしか出来ないならvbaベタベタしか方法が無かったりする この人がそうなのかは知らないけど 普通の設計にしたとして countが3以上の〜、とかやるのが正しいの? なんか不安なんだが なんでcountなんて話になってるの? 商品テ―ブルと材料テーブルで結合するなら、商品テーブルには材料IDのフィールドが1つしかないんだから、材料IDのフィールドに材料AのIDと材料BのIDを持つ商品を検索するだけだよ。 一つの材料IDフィールドに2つの材料IDをカンマ区切りで入れるのが正解なの? リレーショナル全否定? リレーショナルデータベースを前提にするならどんな設計が一番使い勝手がよいんだろうかね >>46 商品テーブル、材料テーブル、商品の材料テーブルを作って、こんな感じで SELECT [商品] FROM 商品の材料 WHERE 材料 IN (Form!材料A, Form!材料B, Form!材料C) GROUP BY [商品] HAVING Count([商品]) >= Form!条件数; 材料A,B,CそれぞれのサブクエリをJIONするよりは速い気がする >>49 うん、基本的に同じ考えだ。 以下の書き込みをしようとしてたが、放置してた。 >>47 何を言ってるんだ? 俺はカンマ区切りなんて言ってないぞ。 リレーショナルが分かってるなら>>29 みたいにゃならんだろうよ。 卵かけご飯の材料1の卵と材料2の米は、材料1を米、材料2を卵と取り替えちゃいかんのか? そんなこと無いだろ。 こういう同じ種別の物を別フィールドにすると管理出来なくなるだろ。 商品 材料 卵かけご飯のID 卵のID 卵かけご飯のID 米のID お好み焼きのID 小麦のID お好み焼きのID 卵のID お好み焼きのID 豚肉のID ショートケーキのID 卵のID ショ−トケーキのID 小麦のID ショートケーキのID 苺のID アップルパイのID りんごのID アップルパイのID 小麦のID アップルパイのID 牛乳のID こういう風にして商品マスタ、材料マスタ、商品作成の3テーブルにする。 しかし、商品、材料どっちのテーブルの場合もそうだが他に管理したい情報がないならそれぞれマスタテーブルやめてIDの所を商品名や材料名にしてテーブル減らしても良い。 その場合は最小1テ―ブルになる。 なお、>>46 は商品マスタをやめて2テーブルにした場合だ。 仕様が解らないからアレだけど そのhaving countだと同じ材料が複数行登録されていた場合に フォームに設定した別々な材料で検索した時に検索しても且つ条件にならないんじゃないかな? 同じ材料を登録できないように作ってあれば問題無いと思うけど その辺どうなんだろうか? まぁ作りと要求次第だと思うけど 的外れだったらごめんよ ちょっと気になったんで 複数列の場合に連結してから文字列検索で探すというのは sqlが長く複雑になり難いかもしれないね 何にしても実現の仕方は色々有るね その人の技量や置かれている状況次第だろうね 最初に不安だと書いているように私もCountは邪道だと思ってるんですよね 「なんでcountなんて話になってるんだ」と怒られる程度には それで、いろいろな方法がある中で「王道」をご指導いただけないんでしょうか? >>51 基本的に、テーブルには誤りのあるデータは登録しない 逆に言うと、読み出したデータに誤りがあるかもしれないなら、全ての読み出し処理の後に全項目の妥当性チェックが必要になる 製品テーブルと素材テーブルと連結用テーブルの三つつくる あとIDいらんから消して idいらないのではってこと時々あるよね。 性別項目なんて"男"、"女"って直接入れてエエやんて思う。 >>54 id使わないなら 1テーブルでええんとちゃう? >>55 性別はboolでいい ただしオカマちゃんなどに対応するため Bool 肉体の性別 Bool 精神の性別 Bool 改造後の性別 Bool 住民基本台帳の性別 Bool 一般公開する性別 Bool セキュリティで保護された性別 などのフィールドを用意するのがベスト オカマでも、男専、バイ、女専と分けないとトイレで掘られるリスクが Excel VBA質問スレが最後までいって終わったので、次スレ検索したらここが出てきた Excel VBA質問スレの新スレはないのか? Excel VBA質問スレでもAccessの話が話題に出るので、ここと統合してもいいんじゃね? VBAメインの話だろ >>29 がダメな理由、データベースがわからない人にどう説明したら良いんだろ。 ウチの会社も、みんなこうやって作りたがるんだよな。 商品 1月売上 2月売上 3月売上 4月売上 ・・・ 難しいだろうね リレーショナルデータベースにおける正規化って コンピューター的な都合でテーブルを分けてる でも実際には依頼伝票と明細というものは 人間の感覚的には一体として扱う方が感覚的に自然だからそういう風になってしまう 何の為にリレーショナルで正規化をするのか? というのをデータの不整合が起きないようにを集中化させる為である事を教えるしかないけど コンピューターがどういう風に処理をすると 効率的だったり安全だったりするか を理解しておかないと難しい 表計算の延長や通常の感覚のままだと無理だと思う 大げさに言うと コンピューターサイエンスの知識が必要 って事になる思う accessはリレーショナルな所を活用して効率化しているから結構難しい面が有る どうしても無理なら 桐 でも使うという手も有るw >>54 横槍ど素人でごめん。 連結用テーブルってのは>>50 みたいなのでおkってことですか? 最近ACCESS初めて同じようなことしようと思ってます。 >>65 そそ。 あそこに並んでる表を入れておくのが連結テーブル あれがなぜ必要かはわかると思うので略 商品、材料テーブルの内容から、自ずと連結テーブルも必要になり、そういうテーブル構成になることは別に特殊なことではありません こんなスレがあるぞ VBAに関する質問はこちらへどうぞ Excel、Access、Outlook分ける必要ないだろ VBAなんでも質問スレ Part2 [転載禁止](c)2ch.net https://mevius.5ch.net/test/read.cgi/tech/1432173164/ >>66 ありがとうございます。 実際は、製品のそれぞれの材料をどれくらい使ったかを管理する必要があるのですが、その場合、 製品テーブル 材料テーブル 製品と材料の連結テーブル 連結テーブルと使用量の入力用テーブルが必要になるイメージですかね? VBAスレでしたね。テーブルの作り方はここではないのはわかってるのですが、何かこのあたりのテーブルやフォームの作成のヒントになる書籍とかあれば教えていただけませんか? excelとaccessはアプリケーションとして随分違うから分けた方が良い excelの方が進みが速いし access相談系ってここ以外に案外質問スレが見当たらないし(自分が知らないだけで実際には有るかも知れないけど) 分量で分けるなら excel access,word,outlook,その他? みたいに二つに分けた方が良い excelは利用している人の数が段違いだろうし 上の質問みたいに 材料1,材料2,... みたいにするのはaccessでは合い難いけど excelでは割とそういう風に使うから 違いは大きい それにexcelvbaの方は見てないけど accessとexcel勢で何か悶着有ったみたいだし 基本は分けた方が良い >>63 Excelに慣れて表を想像するから。 DBはリレーションを想像すべきで表を想像すべきじゃない。 >>64 リレーションに慣れてれば自然に正規化しようとするようになる。 >>68 まず、製品、材料、連結テーブルの中で使用量を格納できる(格納するのがふさわしいか)のはどのテーブルかを考える。 ふさわしいテーブルがなければ新テーブルを追加するが、使用量は連結テーブルに格納すればいいのではと理論建てて考えられるようになりましょう。 書籍は近所に大きめの書店があれば、自分の好みで選びましょう。図が多いとかカラフルなのが見やすいとか。 初級本は2、3回見ればあまり出番なくなると思いますが、どんなことができるのかとか効率よく知るのに有効です。 他は、逆引きとか、テクニック本とかがいろいろな処理を書く上で有効で、長く役立ってくれるでしょう。 >>63 データベースに限ったことではないが、最小限の入力(手間)で最大限の結果(伝票だけでなく売上集計や分析など)を得ることが目標。 平たく言えば、楽(効率アップ)しようと思わない人、そのために努力しようと思わない人には伝わらない。 オレは説得するのは諦めた。残業代増やしたい奴ばっかりだから 構造ならSQLとかDBのアンチパターン解説本 >>65 他にも連結用テーブルはプライマリをフィールド二つの複合にして それぞれに元テーブルとの外部キーつくること 馬鹿でも仕事をしなきゃならない そういう人は材料1,材料2,...でやれるなら それでやってもらうしかない 頭いい奴だけで後は生活保護で構わない とかで良いなら話は別だけど? その辺を理解出来ないアホが多くて困る 正規化を理解しないでaccess使っている人間と種類的には同じ 自分がやれる事が一番と思って他を考えていない 32bitのAccess2016を使っています。 いままではinteger型で済むものはlong型にしてはいけない。メモリーの無駄遣いと思ってきました。 しかし、ベンチマークをとるとlong型の方が速いという主張を頻繁に見るようになりました。 数字は全部long型にした方がいいのでしょうかね? >>77 昔々はそうだった しかし、今はあり余るメモリをたらふく使って、高速にとか、プログラム書きやすくとかになってる。 (もちろん限度ってものはある) 昔は8bitや 16bit CPUだから、長い桁は時間かかった。今は 64bitなので、それ以下に収まれば充分高速。 (数億回ループするのは稀なので、あるなら都度ベンチ取ってロジックなど決めるといい) SIMDにより多く詰め込めるとかもあるけど、VBAでは多分使われてないから気にしなくていい わざわざ longに直す必要はない。これからは気にせず long使っていい >>78 でも、longに直したくなりますよねw 標準モジュールは一括置換→保存で問題ありませんでしたが、 フォームでやってみたら、すぐにメモリー不足やら、フォーム破損が生じてしまいましたw 実験用のコピーだよ。 楽しく実験するのがプログラミング上達の近道だと思うんだよね。 >>81 実験は大切。失敗もベンチ取るのも身になる。 実験ソースや結果も Accessのテーブルに分類して残しとくんだぞ (オレは、ソースはモジュールに置いて、コメントに結果を書いてたりもする。もちろん他言語などはテーブルやプロジェクトにしてなど) カンペ作ったときみたいに忘れないもんだが、将来の追試や数値が役に立つ(まれに) >>81 後付けの言い訳乙 実験するよう連中はこんなところで質問なんかせんわ >>83 Access界隈っこういう人が多い気がするなあ。 実験用コピーじゃなかったら真っ青になってるだろうなw 新人の頃は良く失敗した 数値フィールドをテキスト型で定義したり データ、システム分離しなくてmdb破損させたり 手元の最新版壊して顧客PCまで最新版取りに戻ったり : >>85 オレも最初の頃壊れ(し)まくって、Accessなんて使いもんにならんやんと思った dbだから、排他とかできるんだし、別々のフォーム触るなら、皆で開発できるやろと 1つの共有mdbで開発やってたw 規模によるけどシステム分離はわざわざしないな 分離するのは、sqlserverとかにするときだけだ システム分離ってなんですか? 私もファイルが壊れてばかりで困ってます。 >>87 データベースでデ−タをどうこうする部分と、デ−タそのものを分離するということでしょ。 テーブルとクエリやフォーム、レポートを別ファイルにするという意味だと思う。 >>87 >>88 テーブルとそれ以外に分けることです。 それ以外の方にはリンクテーブルを置いておけば、同じように処理できます。 複数人で同時にテーブル読み書きするときは定番のやり方です。 (一人でしか使わないなら、わざわざ分ける必要はありません) テーブルの方はファイルサーバに、その他は各ローカルに置いて使います。 もう少し細かく言うと、ワークテーブルはそれ以外の方に含みます。 >>89 横からすんみません。 一人でしか使わない場合もフォームのコントロールを弄くるのが好きな人は分離した方が良いと思います。 コマンドボタンの位置を変更しただけでフォームが消えてしまったことが何度もありますから、 一人で使用する場合もカスタマイズ好きならデーターは分離した方がいいと思います。 >>89 ネットワークが遅い場合は、定数テーブルもローカルにとか、その辺は臨機応変に。 >>90 最近は個人的な作成しかしなくなったので教えて下さい。 そのファイルはmdb、accdbどちらですか? (拡張子が変わって壊れにくくなったかとか、何が変わってどう影響するか細かくは調べてないです) そのdbファイルはローカル/ファイルサーバどちらに置いてましたか? ここ数年はツール的な小さなものを、accdbをローカルで作成してますが、壊れた経験はないです。 1つのフォーム内で、各処理をフレームで分けてあり、フレーム内にはテキストボックスやボタンなどがあります。 フレーム単位で、あっちやこっちに頻繁に移動はしてます。 (それでも、過去の壊れてた経験から、数日に一回最適化とバックアップはとってます) >>92 mdbです。dbファイルもmdbでローカルです。 フロントエンド?(と言っていいのかしら?)が巨大で、100MBくらいあります。 業務用ソフトで中身は使用されていないゴミ変数やゴミプロシジャーが大量にあります。空のプロシジャーもある上に、それをcallしている謎のプロシジャーもあります。 str型の変数なのに、タイプするのが面倒くさかったのか、var型で宣言されている変数がこれまた大量にあります。 >>93 ありがとうございます。 今でもmdbで作り込みが大きいのは壊れやすいんですね。 以前は、新mdbに全部インポートして、リフレッシュ(ゴミ除去)とかやってました。 (最適化より小さくなるから、何か効果はあるんじゃないかと思って。) accdbに全部インポートして、参照設定修正という方法もあるけど、業務用だと完全に同じ動きするかと問われると保証できないので、難しいだろうし。 時間やお金出るなら(これからも使い続けるなら)、機能(部署)ごとに分割とか、accdbに徐々に移行(プロシージャ修正整理)とかやっていきたいところですね。 Accessはフロントエンドに使う DBはMySQLでも良い 一度に大量で複雑な更新をすると落ちやすかった印象は有るかなぁ Accessは何たって帳票の作成が超簡単! これがあるから離れなれない。 LibreOfficeやOpenOfficeにも帳票作成ツールはあるけど、 Accessほど使い易くはないのが、移行できずにいる大きな要因の一つなのは間違いない。 Office365でアプリアイコンが刷新されたがAccessは変わらない悲しみ access2016使ってて2013のランタイム入れたらaccessが使えなくなってびびったわ あわててシステムの復元して直ったけど サブフォームのソースオブジェクトに、SQLを直接記入することはできないのでしょうか? SQL文というものがそもそもオブジェクトでないから記入できないのでしょうか? Formのオープン時にそのサブフォームのおソースを放り込めばできる あとはメインフォーム上でサブフォームをいぢるイベント時に書くとか 例えばボタン押した時など サブフォームはソース無し にしてるけど、自分は そこへ放り込むやり方だと出来てる id 部門 販売品目 1 A りんご 2 A バナナ 3 A りんご 4 B バナナ 5 B ぶどう 6 B ぶどう というテーブルから、 部署と販売品目が同じレコード数 (Aかつりんご、Aかつバナナ、Bかつバナナ、Bかつぶどう の数)をカウントしたいのですがうまくいきません。 販売品目単独では SELECT 販売品目,Count(id) FROM テーブル名 GROUP BY 販売品目 のようにすれば思うようにいくのですが、複数条件になると思うようにいきません。 お知恵を貸していただけないでしょうか。 SELECT 部門, 販売品目, Count(ID) AS IDカウント FROM テーブル1 GROUP BY 部門, 販売品目 HAVING (((部門)="A") AND ((販売品目)="りんご") OR ((部門)="A") AND ((販売品目)="バナナ") OR ((部門)="B") AND ((販売品目)="バナナ") OR ((部門)="B") AND ((販売品目)="ぶどう")) ; もしくは SELECT 部門, 販売品目, Count(ID) AS IDのカウント FROM ( SELECT * FROM テーブル1 WHERE (((部門)="A") AND ((販売品目)="りんご") OR ((部門)="A") AND ((販売品目)="バナナ") OR ((部門)="B") AND ((販売品目)="バナナ") OR ((部門)="B") AND ((販売品目)="ぶどう")) ) GROUP BY 部門, 販売品目 //シンプルにこれでもできたけどwhereの位置とか括弧とか間違えてない? select 部門, 販売品目, count(ID) as カウント from テーブル1 where (((部門)="A") AND ((販売品目)="りんご") OR ((部門)="A") AND ((販売品目)="バナナ") OR ((部門)="B") AND ((販売品目)="バナナ") OR ((部門)="B") AND ((販売品目)="ぶどう")) group by 部門, 販売品目 >>106 ありごとうごぞいます。 説明が不十分でした。 たしかにそのとうり記述すればできるのですが、部門や販売品目が増えていった場合に、全組合せを書き出さないでやる方法はないものかと考えております。 まだ説明不足かと 組み合わせを指定しないと絞り込みはできないし クエリビルダーでちゃちゃっと作った最小形が>>106 絞り込み条件のテーブルを他に作ってリレーションとる方法もあるけど >>105 要件定義すらまともに書けない馬鹿だからSQLの基本もわかっていないのかね? どこにも部署なんてないのだが Ruby なら、 require 'csv' str = <<"EOT" id 部門 販売品目 1 A りんご 2 A バナナ 3 A りんご 4 B バナナ 5 B ぶどう 6 B ぶどう EOT # 空白区切りで、ヘッダー有り options = { :headers => true, :col_sep => " " } # Hash.new で、初期値は、{ } hash = CSV.parse( str, options ).each_with_object( Hash.new { |h,k| h[ k ] = { } } ) do | row, hash | dep = row[ '部門' ] # department item = row[ '販売品目' ] if hash.dig( dep, item ) # Ruby 2.3 から hash[ dep ][ item ] += 1 else hash[ dep ][ item ] = 1 end end p hash #=> {"A"=>{"りんご"=>2, "バナナ"=>1}, "B"=>{"バナナ"=>1, "ぶどう"=>2}} AccessならGurupByしたクエリを名前を付けて保存しておくのが正解 サブクエ遅いから 普通に部門販売品目でソートしてから dynasetからvbaでカウントしたら駄目なの? sql文を捏ね繰り回すよりその方が簡単な気がするけど? どうしてもsql文でやりたいなら 他のsql系統のスレで聞いたほうが良いと思う accessはsqlとvbaを組み合わせて使えるので 込み入り難いからやり易い面が有る 自分は割りとそういうやり方をしてしまう けど他のリレーショナルデータベースはsqlを駆使しないといけない場面が多いだろうから その手の方面の人の方がsql文に詳しい人が多いと思う sql文の質問をしても構わないと自分は思うけど一応vbaスレなんで 他のリレーショナルデータベースはもっとましな言語で使うんだよ ""とclearcontentsの違いが明らかになったな 俺なら SELECT [部門] & [果実] AS 式1, Count("HOGE") AS DUMMY FROM テーブル1 GROUP BY [部門] & [果実]; 普通の関数を使ったSQLがコンパイルエラーで通らなくなるのは、ずっとあるバグなの? 文字列中に含まれるスペースをなくした列同士を比較したいだけなのに DBに上げる前のデータ加工はExcelとPowerBIについてくるPowerQueryで完結させる DB自体は何でも良い Accessはフロントエンド こういう感じの運用が一番融通が利いて楽 >>123 通ってたのが通らなくなったなら参照設定確認が最初の一歩 optionala argumentについて教えてください。 https://tsware.jp/tips/tips_119.htm では 引数を Optional かつ バリアント型で宣言する と書いてありますが、 総本山の https://docs.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/understanding-named-arguments-and-optional-arguments では あっさりと string型 で宣言しています。どっちが正しいのでしょうか? それと、プロパティーシートから 関数を呼び出すときに引数を省略できますか?エラーばっかり出てしまうので,不可能という気がしてきますが、実際はどうでしょうか? ひとつ解決しました。 ここ https://bettersolutions.com/vba/macros/optional-arguments.htm に Remember that IsMissing will only work with the Variant datatype. と書いてあるので、 IsMissingを使いたい場合にvariant型である必要があるだと思います。 プロパティーシートからcallするときに省略可能かどうかはまだわかりませんね。 >>127 プロパティシートからでも省略できると思うよ 標準で使える関数でも省略できるから スレチですまん。 俺はVBAをやってるが上司から言われました。(うちの部署、10名のうち、VBAを作れる人は二人だけ、、、) AIが集計をしてくれるからEXCELは必要ない時代が来るねと言ってた。 反論出来る? 高度なAIにVBAとか集計なんかやらせちゃ駄目だ。他に何もできない俺たちがやらなきゃな >>131 の者です。 EXCELとACCESSを間違えた、、、。 すみません。 >>131 〉AIが集計をしてくれるからACCESSは必要ない時代が来るねと言ってた。 来ませんけど、未来のことなので証明はできません なので、その理由を何かをしないことに最大限反論に活用するのが最も有効です 私がプログラムを始めた数十年前から、「コンピュータが発達したらプログラマーはいらなくなる」と言われていましたが、今でも慢性的に不足してますし、更には小学校(?)からプログラムを教えると ちなみに自社でai使うことになっても、おそらく数百万円かかって、大して使い物にならないでしょう ITに詳しくない人は、知識もないのに夢見過ぎです 複数データを組み合わせてサクッと結果求めたり、そこそこのアプリ(特にレポート活用)作るなら、今でもACCESSは最良の選択の一つだと思ってます。2.0くらいから今までそこかしこで使いまくってます Access2010 印刷プレビューのリボンで「PDFまたはXPS」を押した際に出てくる 「PDFまたはXPS形式で発行」のダイアログを出すVBAコード教えてください。 とりあえず自分でマクロの記録でそれらの操作をなぞって それでできたブツを思う存分手直しして そこで発生した問題を質問した方がいいかもな Access遣いはおばーちゃんやおじーちゃん多いから 「イチからかよ」って思われると、誰も面倒がって答えたがらない Windows10、Office365のAccess16なんだけど、レポートプレビュー画面にボタンでもおいて、そこにイベントプロシジャーを設定したいんだけど、どうするのかな? Access2003では簡単にできたんだけど、リボンがでてきたAccess2007以降出来なくなった気がするんだけど、どうなんだろう? >>140 ちょっと2003でそれをやるコード上げてみ >>142 確か、カスタムメニューだったか、カスタムボタンを設定して、それにイベントプロシジャーを設定していた気がする。 アクセスキーを設定してプレビューを印刷して、プレビュー画面を閉じて、特定のフォームを起動して、特定のボタンやらテキストボックスにフォーカスを与えるとかやっていた気がする。 あれは実に便利だった。 Windows7が動いているPCが物置にあった気がするから確かめてみる。 会社で役割柄ツールを作ることになりまして、アクセスに入門しました xlsxをインポート、それと同時にテーブルを作成するVBAは組めたのですが、同時にレコードが勝手にソートされてしまい、元データとレコードの順番が異なってしまうという問題に直面しています。 この場合、テーブル作成と同時にオートナンバーを設定するようにしたいのですが、docmd〜acimportdelimでは定義付けができません。 何か方法はありますでしょうか インポートするxlsxは毎回ファイル名が異なる想定なので、保存したインポートを使うのは極力避けたいです >>145 そうですよね… 最終手段としてはそれを考えています >>146 最終手段というか、RDBの行の順序に意味を持たしちゃ行けないと言う基本理念 おはようございました 新型コロナでACCESSどころでは無いですね jetbeensのDataGripってアクセスでも使えるの? 全然ネットにもあがっていないけれど、Access2019の最新版で、DAOでレコードセットを作成して操作しようとすると Accesが落ちるっていう現象を経験している人っていませんか? 32ビット版も64ビット版も同じ。 そうでなくて、今まで動いていたのに最新のビルドになったら突然落ちるようになった。 前のビルと番号に戻したら動くのよ。 ADOでレコードセットを作成したときはどのビルド番号でも問題なし。 Application.SetOptionの引数一覧が知りたいのですが、誰か知りませんか ヘルプデスクがスキルアップするため、プログラミング経験積むのにAccessVBAって合ってますか? まずヘルプデスクという職場でプログラミング経験積めるの? 合ってるかどうかはわからんけど、それはありだな。 DBとPG、両方の知識が増える。 お前らどうやって勉強したの? おいらADO勉強したいけどどの本読んでいいかわからないから勉強できてない。 覚えるなら実務が一番早いと思いますが 独学なら簡単なものを作ってみると良いですよ 持ち物リストとか >>161 Google。 本で勉強したのは20年前かな。 最近のAccessは条件付き書式の条件数が3つまでという制限がなくなったと聞いて、vbaで4つ条件を書いたら、怒られた。 条件数の上限の件はどうなっているの? >>166 こんなことがかいてありましたね。 >>参考Access2010以降は、条件付き書式を3つ以上追加することができます。Access2007では、3つまでです。 もしかしたら、メニューからなら可能でVBAでは不可能なのかもしれませんね。そうだとしたら変な仕様ですね。 不可能とみるか、未対応と思うか 人それぞれ クレバーなら文句を付けてるヒマ有ったら今できるベストな対応をして次に進んでる おお、AccessとかVBAを勉強し始めた頃を思い出しますね。 ネットで誰かが質問すると必ず上から目線で罵詈雑言だったなあ。 知恵袋とかも酷かったなあ。 >そうだとしたら変な仕様ですね。 これが無かったら小言書かなかったけどな MS相手にどっちが上から目線なんだか かてて加えて減らず口叩かれるとは いやはや チラとWeb巡ったら難問袋小路問題で以前からあった疑問なのは判った 条件付き書式をVBAで制御するときに注意すること でググれば一番上に出てくるであろうサイトでは 2013をベースに「・・・すること」とか断言してるが、どうなんだ? hatena さんのサイトでは別問題として画面がチラつくと仰ってる そのサイトの途中にあるリンク先 ↓ (アドレス貼ると書き込みできないから省略 YU-TANG さんは既にアーカイブでしか見られないしVerも古いが 3つしかできないのを工夫で5つまで可能にしてる(らしい 詳細は未チェック) そのサイトの最下段にあるリンク先 ↓ (ry で、そこから誘導されたこちらもアーカイブなLebans 氏のサンプル(らしい 詳細は未チェック) 帳票フォームをサブクラス化して 云々 悪魔の技とYU-TANGさんは大絶賛してる 驚くことにアーカイブだがファイル落とせる 自分では必要に迫られたこと無かったから無頓着だったが、なるほどね みなさん悪戦苦闘してるんですね accessは質問者に小言を言う人が多い印象。 いわゆるIT土方が多いからかねえ。 余談だけど世間に流通している商品のVBAを覗くとひどいコードの多さに驚く。そういうコードを書く人が質問者相手にがストレス発散してる気がするなあ。 ACCESSは後継者が少ないから先輩面したくても出来ないって人が多いのでは。 私も後輩が欲しい。育成では無く先輩面目的で(だからダメなんだろうね)。 Access2016を使っています VBAを使いcsvファイルを取り込もうとしているのですが取り込み先のファイルの名前全てにピリオドが入っており、例1333.T.csv ピリオドが邪魔でファイル名を指定してもうまく取り込めません 何か良いアイデアはないでしょうか? csvファイルに名前付けのルールとかがあって、規則性があるなら Left Mid Right 辺りを交えて工夫 全く一貫性が無いとかなら . を ppp とかにリネームする工夫 https://soudan1.biglobe.ne.jp/qa2877385.html ←これってこと? http://tsware.seesaa.net/article/214574472.html ←ここにもヒントが >>173 私はファイル選択、コピー、インポート、コピーしたファイルの削除、と言う手順でデータを取り込んでます。 >>174 ありがとうございます ファイル名は規則性があるのでLeft Mid Rightを使ってドットをスルーして取り込みをするやり方を探してみます >>175 こちらはファイルコピーをしてドットのない名前に変換してからインポートといった感じでしょうか初心者すぎてまだ色々理解できていないですが道筋がみえましたありがとうございます ACCESS365?でadoの話。 昨日、テーブルメンテナンス用にプログラム書いて、テストでupdateメソッド行をコメントアウトして実行したのにレコードが更新されて焦った。幸い意図した通りの更新が出来たので問題は無かったのだが、こんな事有る? 通常ではあり得ない動作ですから accdbが破損しているか 思い違いしているか じゃないですかねぇ だよね、自分の事じゃなければ私もそう思う。明後日に追試してみます。 >177 ADOだと、Updateメソッド実行しなくてもレコードが保存される条件があったはず https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/update-method-ado >Update メソッドを呼び出すより前に追加中または編集中のレコードから移動すると、ADO によって自動的に Update が呼び出されて変更内容が保存されます。 >>180 これか、ありがとう。 だとしたらupdateメソッド要らなくね?よく分からんが。 レコード移動しないけど変更を保存したいときに必要だろう ACCESSのSQLでビット比較ってどうすればいいですか (value & 0x10) == 0x10 みたいに特定のビットが立ってるか比較したいのですが できるかわかりませんが、 (value and &H10) = &H10 だとダメですか? そっか、SQLのAND演算子になっちゃうのか… &も文字列の結合演算子とみなされちゃうのかな? &H10のビット限定なら、 (value \ 16) MOD 2 でいけそうですが、他にもパターンがあるでしょうから… 何より分かりにくいですねw 整数除算(\)で該当のビット位置を一番右にずらして、MODでそのビットを取り出します 16 じゃなくて &H10 と書く方が取り出すビットと一緒で分かりやすいですね(うまくゆくかはわかりませんが) (value \ &H10) MOD 2 連投すみません 188案は value が long型だとして、値が負数のとき正しい結果にならないことがあります ごめんなさい >>188-191 親切にありがとうございます。 \とか使えるのは知りませんでした。 試してみます Windows10、Access365です。 Excelファイル上のデータに対して、ADOでアクセスして、データを取り込んでいるのですが、時間がかかります。 時間を短縮する方法はないでしょうか。 データは1ヶ月分9万件程度ですが、Accessのテーブルに取り込むのに、7分程度かかります。 テーブルのレコードの追加は、データ1件1件に対して、ADOのAddNewメソッド、Updateメソッドで追加しています。 試しに手動でAccessのインポート機能を使用して1ヶ月分のデータを取り込んでみたのですが、時間はかからなかったのですが、F20、F21など、空白の列まで要求されました。 そのためこの手段はあまり良くないと思っています。 レコードセットを一気にInsertする方法とかないでしょうか。 よろしくお願いします。 一件一件Updateするんじゃなくて、UpdateBatchでバッチ更新してみるとか >>187 ふつうに>>185 でできるはずだけど valueの型が数値じゃないんじゃ? >>193 レコードセットで要求の動作はできないと思われます 以下はレコードセットを使わない方法になります 前提として ・現在取込時にレコードセットを編集していない ・SQL が書ける INSERT 文で ・「IN 句」に Excel ファイルを指定 ・追加先テーブルに Access テーブルを指定 これでインポートと同等のパフォーマンスになると思います 詳細は MS のリファレンスを参照 https://docs.microsoft.com/ja-jp/office/vba/access/concepts/miscellaneous/in-clause-microsoft-access-sql 今(.xlsx)だと EXCEL 12.0 になります >>196 ありがとうございます 試しに1行をInsertしてみたところ、3分程度で処理できました。 ただ、.AddNewの方も、同じデータで3分-7分のくらいで処理できたので、思ったよりも処理速度は改善しませんでした。 あと、Nullだけのレコードが入ってしまうことも難点でした。 取り込みたいデータを取り込めたのと、列が30列くらいあり書き換えに時間がかかるので、一旦は今のままでいこうと思います。 ただ、今後も同じようなデータの取り込みがありそうです。 他に効率的なデータ入れ込み方法がありましたら、お教えいただけると幸いです。 >>198 ループ中の AddNew を SQL の INSERT に置き換えたのでしょうか? インポート対象(9万件程度)を1度の INSERT で行います Null レコードは Where で除外可能かと思います 現実的なのは SQL 直発行かインポート機能の2択かと思います インポート機能も定義を固めれば使い物になります 効率というのは人によって変わります 普段からコードに触れている人なら VBA からの SQL 発行が効率的 コードは書かないが Access を使い慣れている人ならインポート機能やクエリ定義が効率的 両者の方法とも取り込み実行時間はほぼ同じです >199 いえ、INSERT SELECTからの列指定をして一気に入れ込みました。実験的に1列のみを。 インポート機能とSQLでの処理は速度が違う気がするのですが本当でしょうか? テーブルへの書き込み方が根本的に異なるような気がします。 DoCmd.TransferSpreadsheet はぜひ使えるようになっておきたいですね。 エラーがよくわからないので今まで使っていませんでした。 >>200 全体で1トランザクションになるようにトランザクション張るか UpdateBatchで更新するか試してみてくれ >>199 もう一度SQLでやってみたところ、インポートと同じ時間で処理できました。 ありがとうございます >>201 UpdateBatchでは処理時間に違いがありませんでした レコードセットへの書き込みに時間がかかっているのかもしれません。 ありがとうございます ウチの社内の情報システムの制限でwindowsカメラアプリが制限されてるんだけど、VBAで無理矢理動かせないだろうか、、、 いろいろ検索してみても古い情報しかなくて、、 64bit版でも出来るようなプログラムの見本とか有れば助かる。 >>206 少し言い方が悪かったかな。 端末でWEB会議してるから、カメラを使うのは問題無いんだけど、静止画を撮るソフトが入っていないもんで、静止画を撮ってDBと紐づけたいってなると、できなくて。 小規模グループでAccess使ってるから、システムに相談しても本気でかけあってくれなくて、、 それだったらVBAでどうにかならないかと思って。 >>209 もめでとう! 資格は財産! 凄いなスタンダードは >>210 ありがとう。マイナー資格のせいか、 テキストは悪評にも関わらず他に選択肢ないし、 そのテキストもアプリもやたら高いけど、 一発合格のために全部ちゃんと買ったわー。 VB自体マイナーよりなのがね。。。 参考書の著者は名のある人(武藤玄さん?)だから安心でしょ 「課題テーブル」 の項目「ファイル:添付ファイル型(拡張子は.xlsx)」をSQLで取得して(1)、 そのファイル名を変更して保存(2)しようと思っています。 (2)の処理は問題ないのですが、肝心な(1)の処理が分かりません SQLだと以下のような感じかと思うですが、これだと、「ファイル」の名称も取得すらできないようです。 なにかしらヒントをいただけないでしょうか。 検索にヒットするようなキーワードでもかまいません。 よろしくお願いいたします。 "SELECT ファイル FROM 課題テーブル where ID = 1" (件数は1件) ファイルを取り出したいのか、ファイル名を変えたいだけなのか、何がしたいのかがわからない。 ファイルをSELECTするとファイルが出てくるというのは奇妙な発想だな >>214 ファイルを取り出したいんだけど、 SQLでなくクエリーでやるべきなの? 先日Access始めたから見様見真似。 添付ファイルを取得すれば、renameして保存するところはわかるんだけど。 エクセルファイルはAccessには入ってないだろ フォルダから取り出すのか? Accessのテーブルの添付ファイル型の項目に入っている そのアドレスをエクセルで開いてリネーム保存すればいいじゃん Dim MyExcel As New Excel.Application とか使って >>221 それ使ってるんですけど添付ファイル型ってchar型とかと同じように扱えれるんですかね、 よろしければもう少しヒントを。 ファイルをディスクのどこかに保存するのは、SaveToFile メソッドですかね? なんか使えそうに思うけどいかがですか? そんな新しいAccessなんて持ってないから知らん https://oshiete.goo.ne.jp/qa/8167605.html 添付ファイル型はレコードセットになっていて その中のフィールドのひとつ(3つ目。つまりF(2))がファイルネームになっていて、 それを取得する。らしい。 ありがとうございます。 少しヒントが得られたかも。 明日試してみます。 添付ファイル型データのデータとファイル名取得が出来たので 参考に記載します。ありがとうございました。 http://www.proton.jp/main/windows/access-vba.html (参考URL)添付ファイル型フィールドのファイルを開くには コーディング抜粋 ---------------------------------------------------------------- Dim SQL, fileName As String Dim DB As DAO.Database Dim RS,RS2 As DAO.Recordset Set DB = CurrentDb 'なお、下記「フアイル」は「.xlsx」形式のデータ SQL = "SELECT ファイル FROM テストテーブル where ID = 1 ; " Set RS = DB.OpenRecordset(SQL) '「ファイル」データ取得 Set RS2 = RS.Fields(0).Value '「ファイル」データファイル名称取得 fileName = RS2.Fields("FileName").Value ------------------------------------------------------------------------------------ それ、SQLとRSは無駄にVariantになってないか? OLEオブジェクト型はどうやってSQL(select 文)で抽出するの? select文は普通に列名とテーブル指定するだけじゃないのか? そっからどうやってデータ取得するかはどうやってDBアクセスしてるかによるんじゃね とりあえずDAOかADOかとバージョンぐらい書け >>228 ファイルを取得したいと言っていたのに、ファイル内のデータでよかったのか? VBSでmdbに接続してaddnewしてupdateするだけの簡単なスクリプトの挙動がおかしい。 sub や Functionにして callすると成功するくせに、subじゃなくて素のスクリプトだと何もしない。 ちなみに読込みはどっちでも成功する。 なぜ、addnewのときだけ、プロシジャーである必要があるのだろうか? vbseditがおかしいらしい。 適当なディレクトリに保存して実行したら素のスクリプトでも成功した。 わけわらん。 SELECT文でOLE型のファイル(拡張子.docx)を読み込んで保存しようとしています。 処理を行ったところ、「ファイル『temp.xls』は内容に問題があるため、開けませんでした。」という メッセージが出ますが、「開いて修復」すれば元のファイルと同じに見えるので SELECT文で項目だして、書き出すまである程度できているようなんですが、 どこがおかしいのでしょうか、ご意見をいただけたら幸いです。 参考サイト https://www.moug.net/tech/acvba/0080032.html 画像を読み込む(GetChunkメソッド) ソース一部抜粋 'OLE型用変数 Dim bytFile() As Byte Dim nFileNo As Integer Dim nSize As Long Dim olename As String Set DB = CurrentDb '項目「OLE型データテスト」抽出のSELECT文の実行 Set rs = DB.OpenRecordset(sqlText) nSize = rs.Fields("OLE型データテスト").FieldSize bytFile() = rs.Fields("OLE型データテスト").GetChunk(0, nSize) nFileNo = FreeFile Open "C:\Users\testuser\Documents\test.docx" For Binary As #nFileNo Put #nFileNo, , bytImage() Close #nFileNo VBS って、まだシステムで使えるのか? 保守されてる? bytImage() の中身は docx に直接上書き保存できるものなのか? >>236 Windows 10そのものがまだ使っています。 AccessからOracleに接続して、テーブル定義を取得しようとした場合、Currentdbにリンクテーブル作成してtabledefで取得するしかないですかね? >>239 そんな訳ないだろ お前の頭には無理ってだけだ >>240 どうやってやっているんですか? そんなに人に偉そうにいうくらいならお詳しいんですよね? >>241 だからお前みたいな馬鹿には無理ってだけだ わからないんだろ? 教えられないのに質問スレでマウント取って かっこいいね! 馬鹿が聞き出そうとして必死だな 元の質問が、 「しかないですかね?」 だから、 「他にある。馬鹿にはわからないだけ」 これで完結 クライアントPC複数台にコピーしてあるaccdbの更新を自動化したいのですが、上手い方法が有ったらアドバイス下さい。 今は、終了時に更新版があればコピー専用のaccdbを開く、という方法です。 時々コピーに失敗したり、更新後の起動が出来なかったり、なんかスマートに出来ません。 それぞれのPCに共有サーバーでクライアント各々に1つのものを使ってもらえば? >>247 コメントありがとうございます。 共有フォルダに置いたテーブルだけのバックエンドや、データベースサーバーにテーブルがあり、フロントエンドにリンクして使ってます。 各クライアントのフロントエンドを更新したいのです。 フロントエンドを共有フォルダに置いて皆んなで使うと壊れやすい、50台のクライアント全て閉じてもらわないと更新できないなどの問題があり、現在のかたちで運用しています。 基本的には別ブログラム(Accessでなくてもいい)で上書きしてもらうしかないけど タスクに登録して再起動してもらうとか さがせばそれ用のツールとかありそうだけどな >>250 WSHで一日一回各クライアントで実行する例があったんですが、やってる事は同じなのです。なんかスマートな方法無いのかなあ。 もう少し探してみます。お騒がせしました。 他フォームや親フォームのコマンドを実行する時, Call Forms!フォーム名.ボタン_Click だと動かないのに, With Forms!フォーム名 .ボタン_Click End With にすると動くのは私だけ? スレ汚しすみません、やり直し。 他フォームや親フォームのコマンドを実行する時, Call Forms!フォーム名.ボタン_Click だと動かないのに, With Forms!フォーム名 Call .ボタン_Click End With にすると動くのは私だけ? レポートのテキストボックスが関数を呼び出すことがあるんだけど、それを検索する方法はないですかね? VBEをいくら検索しても、ある特定のFunctionをCallしているのがなんなのかさっぱりわからなくて途方に暮れた後にレポートのテキストボックスと気づいたときの疲労感は凄かった。 スマートに一発検索する方法ありますか? どうも、ないようなので、for eachループを回して全部テキストにしました。 レポートの全部のコントロールを書き出したら24MBになりました。 コントロールから直接Callするのはお行儀が良くないですね。 DoCmd.PrintOut 同じコードなのに、一方ではちゃんと複数枚印刷して、もう一方では常に1枚しか印刷できない。 ググると似たトラブルが見つかる。バグなんだろうか?ご存じの方いますか? Access365 Windows10です。 Excel上からVBAでDAOにてAccessのクエリのレコードセットを取得しています。 Access上のクエリで表示されるレコード数と、Excel VBA DAOから取得したクエリのレコードセットのレコードの数が異なり、原因がわかりません。 それぞれのレコード一覧を出力してみると、あるフィールド(IIf(・・・,”対象外”, “督促対象”)としている部分) の値が、Access上のクエリでは「対象外」、Excelから取得したレコードセットでは「督促対象」となっているため、抽出条件が誤認識されてレコード数が異なることに気がつきました。 クエリの他の抽出条件にワイルドカード等を使っていないと思います。 クエリをDAOで取得した場合に、違いが生まれる原因を推測できる方はいらっしゃいませんでしょうか? 回避策があればお教えいただけると助かります。 >>259 Accessのテーブルを、Excelからのリンクテーブルにしているものがあるのですが、クエリを開いている状態で、ExcelからDAOでレコードセットを取得すると、テーブルにしているExcelファイルが自動で開かれます。 その状態で取得したレコードセットの内容がおかしいことに気がつきました。 なぜレコードセットの値が異なるのかは、不明なのですが、テーブルにしているブックが開かれているとエラーを出力するようにして、回避しました。 基本的なことで申し訳ないんだけど https://www.helpforest.com/access/amv_vba/ac080004.htm に書いてある開いてるファイルのバックアップとるコードで strNameCopy = Left(strNameMoto, Len(strNameMoto) - 6) & "_" & Format(Now, "yymmdd") & ".accdb" ってのがあるんですが Left(strNameMoto, Len(strNameMoto) - 6) の意味がわかりません。なぜ -6 なんでしょうか? それと、 Format(Now, "yymmdd") だと 210404 になりますが”yy_mmdd_hhmm” としました ここを 21_0404_17h15m とするにはどうしたらいいですか? hやmの入れ方がわかりません メッセージボックスは自動で閉じないしWSHもmessageboxtimeoutAもうまくできませんでした 通知の代わりに小さいフォームを0.5秒ほど表示させて閉じたいのですが、どのように記述したらいいですか? >>262 -6は元ファイル名の".accdb"を取り除いてると予想。 "yy_mmdd_hh""h""nn""m"""で良いかな。 うまく行かない場合はグーグル先生に聞いてみて。 >>263 ちっさいフォームをダイヤログ形式で作成して、タイマーを500m秒に、タイマーイベントで DoCmd.Close acForm, me.Name だとどうかな。 >>264 取り除かないと拡張子が2つになってしまうからですね そうしないと拡張子が2つついてしまうんですね レポートの詳細の一番下に線引くのってどうやるの? フィールドや仕切り線だと線の真ん中が指定位置にくるようで、線の太さ分はみ出てしまう 詳細の最終行終わりにだけ線を引く方法が有るのか、知らんかった。 私はグループフッタの上に線を配置します。 >>269 VBAでEOFでVisible=trueにする >>271 図形の移動ってこう書くらしいんだけど Sub TopAndLeftSamp1() Dim Sh As Shape For Each Sh In ActiveSheet.Shapes Sh.Top = Range("B2").Top Sh.Left = Range("B2").Left Next Sh End Sub それはどう書くんですか? 太い線でもはみ出ないように一番下にくるんですか? >>270 終わりにだけ、じゃなくて仕切り線を詳細の高さの最後に、はみ出ないようにおきたいということです >>272 それExcelじゃん Accessのレポートの話じゃ無いの? >>273 ホントだ ネット検索してコピペしたから間違えた ACCESSでも似たようなので線書いたことあるんだけど マウスで一番下にやってもラインの真ん中が一番下にくるみたいで、下半分がかけてしまう >>269 LINEで描けば自由自在 斜め線も描けるから試してみ (あまり出番はないけど) ACCESSに将来はあるんだろうか ライバルになるファイルメーカーもコロコロ社名変わってあやしいしもはや大規模事業者に焦点をあててるっぽい mysqlとWeb系でつくるのがスタンダードになりつつあるの? 軽く勉強しようとしたけどVBA程度の知識じゃわけわからんかったというか何を勉強すればいいのかもよくわからん sqlにhtml とcssも覚えなきゃならなくて レポートとかどうやってつくるのかわからんし印刷関係はブラウザに依存するらしい 上記でGUIやレポートまでつくれるのかすらわからない >>277 将来は分かりませんが代わりのツールは少ないですね Officeは最低10年間はサポートされるのでスグには無くならないでしょう たまにweb系の話が出るのはデスクトップアプリかブラウザアプリかの話ですよね 個人的にAccessの代わりにweb系というのは少し飛躍している様にも思えますが どの基盤を使うかは用途や運用保守のし易さによって決めるものですのでその人次第です Access全盛期と違って、開発環境やDBが無償で提供されているし htmlをテキスト出力するだけできれいなレポートも作れる UIを自分でいじりながらデータ入力していくような人種にはいいんだが希少種だろう >>277 Accessはデータベースと言うより帳票ツールだよ FileMakerはデータベースとしての機能が充実してるがFileMaker使うぐらいならMySQL、PostgreSQLで代替えが効く どっちかと言うとFileMakerがライセンス料金の高さも有って残らないと思う FileMakerより(MySQL or PostgreSQL)+Accessで安くデータベース&クライアントシステムを作れると思う データベース部分よりもACCESSのフォームやレポートをつくる機能が貧弱なんだよね >>282 MySQL or PostgreSQLに以降するのってどの規模になってから? エクセルの延長線で使うレベルだとACCESSのままでいいですよね? ファイルメーカーはフォームやレポートの機能がリッチなの? ファイルメーカーが良いかもよ。 >>284 リッチどころじゃないよ ACCESSがwin95 FMは10 >>283 >>Excelの延長線上 Access mdbはある一定容量で破綻するからね Excelで収まってるレベルでもMySQL Community EditionやPostgreSQLに移行した方が無料で使える訳だし Excel,Access自体ライセンス必要だしライセンスフリーで使えるなら、それに越した事無い FileMakerのメリットはWebサービス公開がし易いって所だよな そういう使い方するにしてもLAMPとか使う方が安く簡単にWebサービス開始出来る >>285 ファイルメーカーの45日無料評価版をインストールして少しいじってみました. いまさら移行を考える程のメリットは感じられませんでしたが,確かにUIはシンプルで使いやすそうでした. >>289 >>いまさら移行を考える程のメリットは感じられませんでしたが,確かにUIはシンプルで使いやすそうでした. それでライセンス料金は高い あまりメリットが無い >>287 PostgreSQL使うとして一度設定してればACCESS使う感覚でレポートやクエリをつくれるんですか? >>291 フロントエンドはAccess利用する PostgreSQL固有のUIツールは無い >>292 ACCESSをフロントエンドで使う場合、という意味でした >>294 PostgreSQLのテーブルにAccessからLinkはるだけ そこでクエリー駆使しながらFormやレポート作れる FileMakerより安く作れる >>293 桐の価格を調べてきました 40台で使用するために1,115,400でした 機能がどうとか以前のお話しでした >>292 Accessの外部DBなら親和性の高いSQL Serverが多数だとは思います Expressなら無料でライセンスも商用OKです 機能面もAccessで扱うDBサイズならお釣りが来ます あえてPostgreSQLを推す理由を教えて欲しいです 無料以外のメリットはありますか? >>297 https://rainbow-engine.com/sqlserver-express-limitation/ ケースバイケースだがSQL Server Expressでも良いかも知れませんが Linuxサーバーとかで稼働させる技術蓄積が少ない PostgreSQL、MySQLはLinuxサーバーでの技術蓄積が多い まさかWindowsサーバーでSQL Server Express動かすと思って無いか? 無償で構築したいからね >>298 Access案件でLinuxサーバー導入はかなりのレアケースだと思います Linuxに明るい個人ならそれでも良いですが 一般的な企業では運用リスクと保守費用の面から現実的ではないのです Access案件でその様な提案をしたらほぼ蹴られてしまいます 技術蓄積についてもAccess+PostgreSQLよりAccess+SQL Serverの方が遥かに多いです そもそもこのスレに相談に来ている方はLinuxサーバーを前提に話していないと思いますよ >>Access案件でLinuxサーバー導入はかなりのレアケースだと思います Linuxに明るい個人ならそれでも良いですが >>一般的な企業では運用リスクと保守費用の面から現実的ではないのです Access案件でその様な提案をしたらほぼ蹴られてしまいます .NET COREとか提案したら蹴られるのか? .NET CORE案件も相当数出てるよ LinuxサーバーでDB,APサーバー運用するのは今や常套手段でしょ >>技術蓄積についてもAccess+PostgreSQLよりAccess+SQL Serverの方が遥かに多いです Windows製品ゆえ多いってだけだと思うよ >>そもそもこのスレに相談に来ている方はLinuxサーバーを前提に話していないと思いますよ Accessフロントエンドにした場合、サーバー側がWindowsサーバーしか前提としか無い、てのは狭量以外の何物でも無いと思うよ Access案件でのサーバーなんて、(是非は別として)テキトーなPCの共有フォルダでのaccdb(mdb)の共有で賄ってるだけなんて珍しくも無かろう 中小企業にWindowsサーバー提案するってコストかかって仕方ない CALの価格を知らないのかな? 中小企業ほどLinux導入し易いのに >>301 適当なサーバーだから無償のLinuxで十分 >>300 .NET COREを挙げられてますが、Access案件での話です Linuxサーバー自体は否定しません 実際Access外案件では昔より増えました 単純にAccessの外部DBにPostgreSQLを推す無料以外のメリットが知りたかっただけです Linuxサーバーという予想外でしたが 長い間Access開発にも携わっており現実はほぼWindowsなんです 確かにAccessの機能自体は様々なデータソースが扱えますから その意味では狭量と言われてしまっても仕方ありませんね >>304 CAL払える企業なら問題は何も無いよ 現実はCALで苦しんでる中小企業が多い そこを見越して提案出来るかだと思う サーバーも含めて無料で構築したいだけなのにな Windowsサーバー使ってCAL払い続けるなんて皆金持ってるんだなw コピー中のExcelのデータをACCESSにいれるときは、テーブル自体を表示させないとペーストできませんか? >>307 インポートが簡単です。 コピペは知らん、すまん。 >>310 ExcelデータのインポートをAccessから実行すれば良い クリップボードのデータを貼り付けるなら手作業をなぞってテーブル開いて新規レコードに位置付けしてペーストすれば良さそう。クリップボード操作するapiサンプルコードが何処かにあったような、すまんまた明日。 試してないよ? Excelで貼り付けたいテーブルと同じレイアウトのデータをコピーしてある状態で DoCmd.GoToRecord,,acNewRec DoCmd.RunCommand acCmdPaste すると張り付いたりしないかな。 OLEオブジェクトって手動じゃないと挿入できないの? VBAでの挿入を試みているんだけど、似て非なるオブジェクトが作られてしまう。プロパティの数が少し少ない変なオブジェクトが作られて困ってる。 とりあえずレポートにオブジェクトをつくるのはCreateReportControl メソッドを使えばできるんだけど、リンク親フィールド、リンク子フィールド、値集合ソース、値集合タイプがないオブジェクトが作られる。 そのうえ、OLEタイプが読み取り専用だからOLEの設定が出来ない。 どうしたらいいのかな? >>319 VBAプロジェクトでそのOLEオブジェクトを参照追加する必要有る その前提を整えたらVBAで出来るんじゃ無いのかな https://teratail.com/questions/279573 Formに画像追加する例 >>320 手動なら非連結オブジェクトフレームを挿入するとオブジェクトの種類のダイアログが出てくるので、そこで種類を選びますね。 この作業をVBAでやっておけばいいということですね。 ちょっと読んでみますね。 ACCESSで在庫管理や備品管理作っても出先でみることができません(Androidスマホなので) みなさんどうしていますか? Webシステムを組むほど大きいわけでもないので予算もありません 適宜レポートを作っておきExcelやPDFにしてクラウドにいれとくとかですか? >>325 リモートデスクトップとかTeamViewerでWindowsにログインかな? >>325 データベース更新後にEXCEL作ってクラウドに保管するのを自動化すれば充分な気がしますね。 そもそも、Windows 用のアプリはパソコン用だから、インターネットで使えない。 それに、文字コードも違うから読めない インターネット用の表計算アプリを使えば? ストアでMDBを検索したら見れそうなやついっぱいあるやん >>325 Webアクセスする目的ならAccessよりFileMakerになるよ そこまでするならデータベースをMySQLかPostgreSQLに移行してVB.NETでアプリ作る方が良いけどね クエリーが上手く作動して、ニコニコしながら、sqlビューへ切り替えてコピーして、VBEでペースト。 余計なカッコを取り除いてdebug.printに打ち出すと結果が違うことがある。 なにが原因なのかなあ?いまはADOでやってるけど、DAOならうまくいくもんかなあ? クエリーのSQLとADOのクエリーが仕様が違うのかなあ? 同じMS謹製だからANSIとかなんとか気にしなくていいのかと思っていたけど、違うのかな? >>332 ファイルメーカーからハードル上がりすぎだろ >>334 FileMakerはライセンス料高いからね Visual Studio習得してアプリ作れるならその方が良い Webサーバーは必要だけどね >>335 VB.netでwebサーバとか完全にもう別物ですやん >>336 高いライセンス払う余裕有ればFileMakerで良いよ 現実は高いライセンス料払いたく無い企業が多いからね FileMakerが普及しないのもこれが原因 だからって一から自分でつくるってのは飛躍してない? 家建てるときにどこのメーカーがいいですか? に対して自分で建てろといってるようなもん >>339 自分で作れ、とは言って無いよ ソフトウェアハウスの手を借りれば良い >>341 馬鹿には無理なのだから他人に金を出して頼むしかないだろ 馬鹿のくせに金を出さずに人にやってもらおうとか、ゆとりか? >>341 ランニングコストってのが有ってだな、、 FileMakerだとライセンス1回切りじゃ無いから >>343 ソフトウェアハウスでも保守料かかるだろ 基本的には自分で改変できないし Web化って時点でファイルメーカー選ぶしか無い様な、、 外部からアクセスするしないが重要 外から見たいだけなら、リモートデスクトップでいいんじゃなかろうか ACCESSで在庫更新したあとOneDriveフォルダにEXCELエクスポートします。 あとはスマホでもタブレットでも参照可能です。 >>345 「Web化って時点でファイルメーカー選ぶしか無い」 なぜこういう嘘を書くのか。それとも本当にそう思っているならそんな頭の弱い人は書かなきゃいいのに。 >>352 とっくの昔にお亡くなりになったような記憶が… >>353 実例がほとんど無いね https://support.microsoft.com/ja-jp/office/sharepoint- ロードマップの-access-services-497fd86b-e982-43c4-8318-81e6d3e711e8?ui=ja-jp&rs=ja-jp&ad=jp Access Webアプリも無くなってる ファイルメーカーの有利な点だな ちょっと前までGoogleでデータベース・サービス持ってたのにいつの間にかなくなっちゃたな。 最近VBAよりGASが面白くなってきたので手を出そうと思ってたのに。 やはり無料じゃGoogleも厳しいか。 レポートやフォーム作るときに、拡大できないの致命的だよね win標準の拡大ではぼやぼやで目がたえりれない エクセルあたりでは普通に拡大できるのになあ これだけでファイルメーカーに乗り換えようと思ったりしてよ 馬鹿がファイルメーカー、ファイルメーカーとしつこく繰り返しているから絶対に使わない FM→ACCESSときたけど レイアウトつくるのはびっくするくらい大変 そして頑張っても前時代的なのになってしまう 金額の問題だけで以降したんだけどね ACCESSは365についてるから無料みたいなもの FMは約6万 サブスクは5ユーザ からのみで年¥96,000 というびっくりプライス >>361 フィールドの位置とか外部ソフトでできるの? ACCESSでA4に収まるように8ptくらいのフィールド配置してたら目が痛くなって具合が悪くなったな >>363 ノートだとそうなんかな… 自作のときはずっと9ptがデフォだけど何ともないな… 拡大鏡でも使った方が楽な気がする 右側のプロパティって時間小さすぎるよな レイアウト配置よりこっちをでかくできるようにしてほしい あれもうちょっとどうかならないんだろうか 一日使うにはストレスがすごすぎる ユーの眼球レベルにあった でかくて低解像度のモニター使え 共有ファイルとして使う場合 処理がバッティングすると、待ち?っぽい動きするんだけど、この待ち時間を短くとか長くとか設定できない? 5年ほど前に作った製品ラベルのレポートを修整しようとしたら、老眼は進んでるわ液晶の解像度は上がってるわ、マウスカーソルの移動量を増やしてるわで大変だった。デザインビューの拡大出来るようになると良いですね。 ファイルメーカーの体験版使ったらACCESSに戻れなくなってしまった ACCESSになんかメリットある? 馬鹿がファイルメーカー、ファイルメーカーとしつこく繰り返しているから絶対に使わない >>375 コストかな。 田舎の工場で低価格な電子部品作ってる。30台くらいのパソコンで使うからファイルメーカーなんてコストは現実的ではないんです。 ファイルメーカーとAccessは得意分野が全然違うのでは? >>380 ACCESSでうまくいかずもやもやするたびに体験版つかってみて ライセンス料なんかが不安でACCESSにもどるってのを繰り返してる ACCESSが現代的なGUIになってくれて ある程度はコード書かなくてもできるよえになればいいんだが え!?ひとりでも最低 じゅじゅじゅじゅじゅうまんえーん!? https://i.imgur.com/OGGBfwi.png ちなみにキントーンもこの商法みたいだな ACCESSはUIがクソなのと共有がほぼできない、ちょっとしたことでもコード書かなきゃならない、その代わりに激安ってことなんだろうな 逆にそこらを改善するのはこんくらい金とらなきゃできないことなのかもしれん FileMake使いのやつって Access使いを見付けると必ず攻撃してくるよね なんで不況に熱心なのかな 馬鹿 ↓ FileMakerはコード書かなくていい(キリっ) いくらなんでも高すぎる あれって全社員にipadもたせてリアルタイムでデータ共有するような大企業向けだろ とはいえほかにACCESSしか選択肢がなくてACCESSは手間がかかり過ぎるが ACCESSは実質開発が停止してるからな Web公開手段を再度実装したらFileMakerなんて駆逐出来るのに >>373 それ元がボケてるんやな ディスプレイ買い換えるしかないな うちは拡大してもクッキリやで >>389 んなことないだろEIZOのFLEX Scanだし ぼやけるって言葉の認識だと思うが ベクターとラスターの拡大みたいなこと https://i.imgur.com/oT7FRjb.jpg 拡大鏡だと単純拡大だからガタガタのぼやぼや スマホの拡大縮小だとおかしくならないよね? ソフトに標準で拡大縮小が実装されているならそれと同じできれいに拡大できる ACCESSはないから拡大鏡つかうことにかるから汚いしつかいにくい >>390 〉拡大鏡だと単純拡大だからガタガタのぼやぼや 単純拡大だからガタガタになるので正しい しかしぼやぼやにはならない 頭(目?)悪そうだなこいつ 文字が https://i.imgur.com/oQ1lyeU.jpg こうなるのをボヤボヤといってるんだと思う MSゴシック使ってるやつはわからないかもしれないが アンチエイリアス入ったフォントで拡大鏡使うとボヤボヤになるよ https://i.imgur.com/B1re0t1.png getobjectでVBSからmdbへ接続してACCESSのモジュールを書き換えているんだけど、プロシジャーをチマチマ書き換えるのが面倒になってきたので、 既存モジュールの全行を削除してからModule.AddFromFile メソッドで新モジュールを一括して書き換えた。 mdbを保存する段になって「ファイルの共有ロック数が制限を超えています」と怒られた。 たしか、コミットトランスするんだよなあ、と資料を読んでみたが、それが出来るオブジェクトが存在しない。 一体どうしたらいいのかな? >>394 Microsoft 365 for businessを使用してます。 ACCESSはしょっちゅう壊れるからVBSで出来ることはVBSでやりたいですね。 >>395 そんな面倒なことw 2.0使いはじめた頃は間違った使い方してたのもあって壊しまくったが、ここんとこ壊れたことなどないぞ >>396 フォームのコマンドボタンの位置をほんの少しずらしただけで壊れこともあるし、最適化で壊れたこともある。 最近もどっかの記事でそのような記述を見たような気がする。 VBSはコードを見るのも書くのもサクサクだからお気に入りだよ。重たいACCESSを開かなくていいのは気が楽だよ。 でも、関数がVBAと少し仕様が違うとか面倒なことがあるのが玉に瑕だなあ。 >>393 mdbからaccdbにすると壊れ難くなる気がします。 >>398 面白そうですね。参照設定を変更するくらいで出来そうですね。だめなら宣言文にDAO.を加えれば出来そうな気がします。 今はほぼ全ての改造をVBS経由で行えそうだから、それで行き詰まったらやってみます。 >>393 共有ロック数って言ってるんだから VBSからmdbへ接続が何度も繰り返してるか間違ってるんじゃね プロシージャーを書き換えるプロシージャーを書くのって面白い? >>400 共有ロックの問題はMaxLocksPerFileを増やしたらあっさり解決しました。 >>401 手作業でプロシジャーを変更していたときより遙かに楽になりましたし。仕事が楽になる過程は面白いです。 なによりもAccessと違ってサクサク動くのがVBSの最大の魅力です。 一括でモジュールを書き換えるのすら面倒になったのでLoadFromTxtに切り替えた。 これならフォームやレポートも丸ごと移植可能だわ。 オフィス365でデーターを保存したときにウインドウの上のバーの箇所のタイトルに 「ファイル名+保存しました・・」って表示になるけど、 これ出さないように出来ないのかな? ウインドウのタイトルが変わるとRPAが誤作動をおこすので いらない機能をつけるなよといつも思います。 >>404 誤爆でした。ここAccessなんですね。。 そのVBAを操作する人間の操作を代行させるのがRPAなんやで レポートを変数「i」回だけ複数印刷しようとして、 PrintCountやFormatCountを使ったのですが、 「i」とPrintCount・FormatCountが一致しません。 PrintCountやFormatCountって、 ページ変更・ヘッダー・フッターなどでも、カウントが増えますか? アルゴリズムそのものが間違いでしょうか? [タイプ]が勝手に[タイプ]になってしまう。 [ ]で囲んでるのに。なんぞこれ。 あれ、今日は勝手に半角に戻らない。 再起動するだけで良かったのかも。 独り言スマンね。 解決済みという事ですが 名称の勝手変換は[名前の自動修正]を有効にしていると起きます 初心者向けの親切機能ですが、オブジェクト名などを細かく定義している場合には逆に足枷になります 名称変更時に自動トレースしきれずバグを生み出したりします ご参考までに いや、再発しました。 名前の自動修正、調べてみます。 Windows11+ACCESS365の環境で発生してます。 タイプ(半角)と入力しても行を移るとタイプ(全角)になっちゃう。[ ]でくくっても駄目。 Windows10+ACCESS365では[ ]でくくると勝手に全角にはならないので、Win11Betaのせいっぽいです。 アプリの修復試してみて、駄目ならWin11Betaのフィードバックに上げます。 どっかに全角のタイプってオブジェクトがある(あった)んだろな そういえばWIN10でNLSのバージョン変わって全角半角の判断がおかしくなる問題があったな ちょっと試したWin10の詳細バージョン書いてくれ Win11のNLSってどうなってるんだろ すみません、見逃してた。 Windows10の21H1ですね。 NSLがなんの事かわかんないですが、確かに前にも経験したトラブルの様な気がします。 明後日スタンダード試験だけどやばい模擬問題正答5割だわ 外部からaccessの特定のレポートを開く方法ある? 外部って? 普通にCOMで操作すれば良いんじゃねえのか パススルークエリのパラメータをaccess外から設定する機能教えてください。 >>425 データベースに ドライバなしでvbaで接続する方法ってないの? レコードが存在しない場合に INSERTを動作させようとしてます FROMが無いと、演算子がありません、となるため ダミーの FROM を入れましたが(Oracle でいうところの dual) レコードが追加されません INSERT INTO t_table(id, name) SELECT 1, "name" FROM dummy WHERE NOT EXISTS( SELECT * FROM t_table WHERE(id = 1) ); Access の INSERT での FROM や WHEREに、何か制限などありますでしょうか? 直接の返答じゃないけど、SQL一発書きじゃなきゃだめなの? 事前にレコード数チェックして分岐じゃだめなの? UPDATE と組み合わせて、SQL一発を考えてます 無理であれば、おっしゃるように分岐かなと ちょっと気になったので手元で実験してみたけど、dummyテーブルが存在して空ではないときには (多分)431の想定どおりの挙動をしていると思う バッドノウハウ臭いので、おとなしく事前チェックして分岐かなぁ まぁAccessのSQLって変だよね access はupdateいっぱつで初挿入もできたはず しゅきーのヌルを上書きする感じで >>435 さすがにそんなことはないと思うが、ちょっとサンプルコード書いてみてくれ >>436 選択クエリは更新できる UPDATE TableA RIGHT JOIN TableB ON TableA.ID = TableB.ID SET TableA.ID = [TableB]![ID], TableA.Data1 = [TableB]![Data1], TableA.Data2 = [TableB]![Data2]; >>431 values (1, "name") じゃ駄目なの >>438 単純にinsertするだけならそれでいいんだけど、existsを使って条件付けようとしてるのでvaluesは使えない(エラーになる) それ自分でDUALという名称でテーブルを作って1レコード入れておけば出来るよ。 OracleのDUALも実体はそんな感じだったと思う。 >>437 更新はできるけど、存在しない行を更新しようとしたとして その行を新規追加することなんてないだろ... と思ったけど、追加されるのか ACCESS無茶苦茶しやがるな リンクテーブルに対してでも追加しやがる SQL ServerだってFromでJoinしてUPDATEできるけど、 さすがに行が追加されることなんてないぞ エラーの原因が分からない? >>441 Access的には「更新可能クエリ」はテーブルと同等の扱いなのだろう >>444 Viewが実テーブルとほぼ同じ扱いってのは別に問題じゃない UPDATE文でテーブルの行数が変わるのが無茶苦茶なんだよ SELECT * FROM TableA RIGHT JOIN TableB ON TableA.ID = TableB.ID これの更新だから行数は変わっていない >>431 SQL一発では出来ないよ 残念だが DOループで回す事になる もうちょっと俺を信用してもええんやないかと思ったが 出来たんならええか データベースに対し、レポートを外部データの取込で追加するのですが、 この操作をGUIでなくコマンドで行う事は出来ますでしょうか。 >>452 返信ありがとう やっぱ基本はDBごと差し替えになるんですね・・・ 最新を管理しないといけないということですか >>450 レコード入れずに試してみてました あとで確認してみます >>451 access起動コマンドラインオプションに /x マクロ名 で自動実行可能 向きが逆だけどオブジェクトのコピーでレポートをコピー出来る >>451 DoCmd.TransferDatabase acImport >>440 ,450 ありがとうございます、確認しました dummy テーブルにレコードを入れて動作しました INSERT INTO t_table(id, name) SELECT 1, "name" FROM dummy WHERE NOT EXISTS( SELECT * FROM t_table WHERE(id = 1) ); VBAって、サポート切れてんの? 企業とかこれから、多数のツールどうすんだろうね。 サポート気にするような部署でvbaを採用するだろうか? VBAって単独の製品じゃないんだが そもそもVBAがサポート切れってどこの情報だ? OneDriveにコードをバックアップして直接開いたところ http://imgur.com/qO7I0AB.jpg こういった線が付きました Office2016 Proなのですが設定等でVBエディターでも表示できますでしょうか またお恥ずかしながらこの線の一般的な名称も教えて頂けませんでしょうか >>461 何で開いたのかは知らんけど、AccessとかのVBAエディタには、そういった今どきの便利な機能は無いかと 一般名称かどうかはしらんけど、VSCodeとかの設定では Indent Guide でひっかかるんじゃないかな >>462 ありがとうございます 名称のほうぐぐってみまして、確かにVS関連の情報が多く出てきました 大変便利ゆえに残念です! Microsoft 365 Access Runtime ダウンロードリンクが動作してないのですが ダウンロードできた方おられます?? アクセス2010でVBA内でエクセルのブックを操作するためにブック選択ダイアログを開こうとしています.ブックが存在するフォルダーはc:\x\y内にあります. それでChDirでGetOpenFilename実行時に開くフォルダーをc:\x\yにしたいのですが,規定のドキュメントフォルダーが開きます. Debug.Print CurDirは"C:\x\y"を返しますので,システムが認識するカレントフォルダーが"C:\x\y"に変わっているのは確認済みです.GetOpenFilenameが開くフォルダーをGetOpenFilenameに変更できないことが問題です. sub test ChDir "C:\x\y" Debug.Print CurDir Set exApp = CreateObject("Excel.Application") ChDir "C:\x\y" Debug.Print CurDir res = exApp.GetOpenFilename("Csv Files (*.csv), *.csv") end sub ところがエクセルのVBA内でtest2を実行するとフォルダーc:\x\yが開きます. sub test2 ChDir "C:\x\y" res=aplication.GetOpenFilename("Csv Files (*.csv), *.csv") end sub アクセスのVBAのから操作するとうまくいきません.解決策はないでしょうか? 間違えました。 GetOpenFilenameが開くフォルダーをGetOpenFilenameに→ GetOpenFilenameが開くフォルダーをc:\x\yに https://hironimo.com/prog/excel/vba-excel-open/#: ~:text=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E9%96%8B%E3%81%8F%E3%81%AB%E3%81%AF,%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%A7%E9%96%8B%E3%81%8D%E3%81%BE%E3%81%97%E3%82%87%E3%81%86%E3%80%82 WorkBooks.Open >>468 GetOpenFilenameでダイアログが立ち上がったときのフォルダーをc:\x\yにしたいという意味です。 >>470 ありがとうございました. FileDialogだとカレントフォルダーで開いてくれました. >>472 ありがとうございます。この説明はとても親切ですね。よくわかりました >>466 Excel.ApplicationのDefaultFilePathを設定していったん終了したら、 次からそこで開くっぽいぞ Set exApp = CreateObject("Excel.Application") exApp.DefaultFilePath = "C:\x\y" exApp.Quit Set exApp = CreateObject("Excel.Application") res = exApp.GetOpenFilename("Csv Files (*.csv), *.csv") こんな感じか 実行したらエクセルのオプション変わっちまったww デフォルト何だっけな 初歩的な質問でお恥ずかしいのですが教えて下さい 面倒な計算や処理をして値を返す関数Aがあった場合 その戻り値を判定したい場合 If A = 1 or A = 2 then と記述するとaccessは 2回処理することになるのでしょうか それでしたら仮に変数(V)を用意して、一旦 V = A のように格納してから If V = 1 or V = 2 then と記述したほうが処理的には一回で済むという解釈になりますでしょうか すみませんがご教示頂けたらと思います すみません、試してわかりました。 後者は一回で済みました。 質問することでその後すぐ簡単な確認方法を思いつくことがよくあります お恥ずかしい。スレ汚し失礼しました; ちょっと違う話だけど、VBAにもOrElseやAndAlsoが欲しいなと思うときはある SQLの勉強をさいきんはじめました 動的SQLによる数独の超高速解法 というのを読みました 動的にSQLを生成するため ・一つはJDBCを使う方法 ・もう一つはストアド・プロシージャを用いた方法 云々って書いてあります これらって、アクセスのSQLでもできそうなものでしょうか? (過去に話題として出てたらごめんなさい) できそうならやってみようかと 茨の道ならあきらめます 2つとも分からんけど、VBAが使える環境なら動的SQLは可能なはず SQLとは、使用人から経営者になることだ 今まで自分で作業してたのをしなくてよくなる 使用人に、「こういうのを出してくれ」と 言うだけでよい 数独についてであれば、今まで 総当りするプログラムとか 条件判定とかを自分で考えていたが SQLならそうしたものは自分で考えなくてよい 勝手に総当りして勝手に判定してくれる ・・・ということが書いてありました これって、既存のプログラムの要件を SQLで表現できれば中身は考えなくてよい ってことですよね けっこうおもしろいかも 経営しなくてもお金が稼げるSQLがどこかに書いてあると良いのに。 >>479 JDBC Driver で Access MDB に接続できる つまりワカラン これかな? https://codezine.jp/article/detail/1627 https://codezine.jp/article/detail/1628 https://codezine.jp/article/detail/1629 記事中においてJavaでSQLを生成している部分はVBAで書けるだろうけれど、 他のRDBMSで使えるSQLの全てがAccessでも使えるわけじゃないから その辺をうまく置き換えたりVBAで補ったりする必要はあると思う 各DBで使えるSQL構文一覧表 (ROLLUPは jet使えない oracleはokとか) のページが昔あったのに 今見たら見あたらなかったわ 総あたりする場合、SQLはどうやって 候補を管理してるんだろ? ふつうにメモリ上に持ってたら メモリが足りないような 数字の書かれたパネルがあります このパネルのマスをいくつか ぬりつぶし、残った数字の積が、 たて・横のどの列も12になるように してください 2523 6257 5262 2334 これぐらいの規模の問題で 練習したほうがいいかも ぬりつぶしは1に置き換える 動的SQLっていうから DBエンジンにSQL投げる ↓ その結果を受けて自分を書き換えて 再度新しいSQL投げる ↓ 望む結果になるまで繰り返す みたいな話を期待したら 拍子抜けだった >>487 SELECT 解答 FROM すべてのあり得る盤面 WHERE 今回の条件 だから まず盤面を1行にして 2523625752622334 と表す すべてのあり得る盤面は 2523625752622334 2523625752622331 2523625752622314 2523625752622311 〜 1111111111111111 だけどこれをどうSQL文の中で 表現すればいいのかわからん VBAのコード内の文字を置換するプログラムをVBAで行うことはできるでしょうか? 置換の組合せが複数あるので一つずつCtrl+Hで操作すると間違いそうなので, 置換前文字列と置換後文字列の配列を書いて,それを順に実行するようにしたいのです. 自分のコード内に当該置換文字列をがでてくるので,その回避も考えないといけないですが よろしくお願いします ACCESSにもApplication.VBEがあるっぽいから、エクセルとかと同じようにできるんじゃね そもそもコード内をそうそう置換するって状況がよくわからんがな >>494 オブジェクト名を修正すると,名前の自動修正機能で,オブジェクト間の整合性は保たれます. 例えば,Aクエリー内でBテーブルを使用していて,Bの名前をCに変更するとA内のBテーブル名もCに自動的に修正されます. ところが,コード内でオブジェクト名を引数に使用している場合(DoCmd.OpenQuery()やQeryDef()など)は,自動的に修正されないので コード内の文字置換で修正するしかありません. オブジェクト名をより統一的にしたいとか,あるルールで短くしたいなどの事情です. でも本当にコードを使ってコード内の文字置換できますか? 「エクセルとかと同じようにできる」とのことですが,エクセルのVBAでできる方法を知りません. >>494 がApplication.VBEってヒント出してくれてるのに自分で調べる気は無いの? >>496 いままでApplication.VBEとVBAの違いをしりませんでした. Application.VBEで検索して,オブジェクトであることをしりました. できそうな気がしてきました. 調べます >>497 お前みたいな馬鹿は、方法自体間違えていると思うよ >>498 正しい方法言ってみな。 言えなきゃ超バカ決定。 やっぱり馬鹿だったか 馬鹿に馬鹿と指摘すると怒りだす >>494 ,>>496 497ですが、 Application.VBE.ActiveVBProject.VBComponents(i).codemodule.ReplaceLine(j,"修正後コード文字列") を使ってできました。 名前は文字列だろ! VBAの提供するオブジェクトは大抵コレクションで管理されているだろ! お前の作ったオブジェクトも管理できるようにしろ! 初歩だぞ初歩! >>507 人のこと馬鹿、馬鹿ってほんとにうるさい奴だな 今回のアプリは俺しか使わずオブジェクト名変更も今回限りが確定しているんで、 オブジェクト名をデータ化できるCreateQueryDefなどを使う手間を省いてクエリデザイナーを使っているだけ。 そういう事情も含めて「もういいよ」と書いたんだけど、読み取れんわな。 お前は実生活で他人の事情を汲み取る力が弱くて他人から避けられてるだろう。 実生活では流石に馬鹿と面罵しないとは思うが態度にはでてると思うよ。 エクセルVBAのようにワッチョイ付きならNG登録するんだが。 味噌も糞もいるのがこういう掲示板の特徴 それが面白ければ来るし退屈なら来ない 文句言うのはカッコ悪い アプリケーションタイトルについて質問です。 今使ってるmdbのタイトルが2種類あって、「Access」のものと「ファイル名:データベース-フルパス-Access」のものがあります。 全部後者のタイトルにしたいのですが、設定の仕方がわかりません。 ヤフー知恵袋の「Accessのタイトルバーにファイル名を表示させることはできますか。 Excelでは表示されるのですがAccessでは”Access”としか表示されず少し不便なので、、」 を読むと何の設定もしなくても後者のようになると書いている人がいます。 どうしたらそうなるのでしょうか? 後者のやつは別にAppTitleとかで設定していませんので不思議です。 >>518 いろいろ試したけど、結論は超簡単。 ファイル→オプション→現在のデータバース→アプリケーションオプション→ドキュメントウィンドオプション→タブ付ドキュメントをon これでファイル名とパス名が表示されて複数のmdbを起動しても混乱しなくなりました。 OS:win10 Ver:365 16.0 フォルダの中に複数のExcelファイルがあります accessで全てのエクセルの同一セルの文字をテーブルにまとめたいのです Accecc vba エクセルの特定のセル などで検索してみましたが解決に至っていません どうかお力添えお願いします 何がしたいかと、どこまで出来て何がわからないのか詳しくかけ >>520 Excelシート全てインポートすればクエリー加工出来ると思うが、、 ネ申エクセルからデータを拾いたいとかそんな話じゃね? CreateObject("Excel.Application") 使って対象ファイル開いて、そっからさきはExcel VBAの範疇やろ なんだ Accessでテーブル化したい、のでは無いのか? 何やりたいのか分からんな 「AccessVBAからexcelファイルのセル参照ってどうやるの?」ていう質問でしょ 質問には答えられるけど 答えるとまた次の質問が来るのが予測出来るからまんどくせ >>521-523 なにをやりないか再度確認してコード見直していたら不具合点見つかって前進しました… >>525 やりたいのはこれで30個程度のエクセルがあって全てフォームは統一されています a3とb4とw30の値をテーブルにズドンと引っ張りたいのです もうちょっと頑張ってみます 遅くなってごめんなさい ACCESS VBA EXCEL CELLでクグルと沢山出て来ますね。 ACCESSからEXCEL開いて操作できると便利です、頑張ってください。 >>529 CreateObject("Excel.Application")でエクセルを操作できるようにする 対象とするシートからa3とb4とw30の値を取得して変数 X Y Z に格納する 変数 X Y Z の値をAccess のテーブルに追加する この二つの処理を全てのシートにループで行う 釣りが終わったExcel オブジェクトを閉じる Access のオブジェクトの閉じる これでいけるんじゃね? >>531-532 ありがとうございます こう書くとすごくわかりやすいですね テーブル追加やLOOPは調べて書き方を学べそうなのでやってみます! たびたびすみません ばしっとフォルダ内のファイル名を取得することはできました >CreateObject("Excel.Application")でエクセルを操作できるようにする これの意味がようやくわかりました ありがとうございます C:\Users\sanae\Desktop\vba\Book1.xlsx というExcelファイルのa3を変数に入れようとしているのですが ぐぐったところファイルパスをつける書きかたが参考にできるページがみあたらず詰まっています (このあたりにファイルパスとかシートとかを指定して)range(3.1) みたいなやり方かなあなんて思っているのですがどれもエラーになっちゃいました 参考になるページでもご教示いただければ幸いでございます >>534 http://officetanaka.net/excel/vba/file/file01.htm を参考にしてください。 Sub Sample1 set mybook=myexel.Workbooks.Open "C:\Users\sanae\Desktop\vba\Book1.xlsx" x=mybook.worksheets(1).range("A 3") X の値をテーブルに書き込む End Sub myexelはクリエイトオブジェクトで作ったエクセルオブジェクトね あと変数は適当に定義しておいてね。 >>535 おおお できてきました とても進みました ・フォルダを指定してファイル名を取得 ・変数XYZに特定のセルの値を取得 ・ すみませんCTRL+エンターで送信になってしまいました ・フォルダを指定してファイル名を取得 ・指定したシートから変数XYZに特定のセルの値を取得 ・XYZの値をテーブルに追加 超進みました 後は指定したシート名を持たないファイルに遭遇した時にどんなエラーになるのかが気になりますので 近々時間みつけて頑張ろうと思います ありがとうございました!超ハッピー! VBAでやらなくてもテーブルimportで出来るやろ 無駄な努力だな >>539 ブック数が多いから VBA でやりたいんじゃないの? インポートでできる量だったら手でコピペの方が早いだろ 対象のExcelファイルが固定なのか、頻繁に入れ替わるかどうかにもよるわな どなたか教えてください。 売掛金消し込みのマクロを作成しています。VBAでソルバーを自動化したいと思っています。 目的セル、制約条件の参照セルの開始行が40行ごとに下がっていき、指定値は数値ではなく、セルを指定したいです。 とりあえず、全部の変数をvariant型にしてますが、なかなか上手くいきません。 こんな奴が作るプログラムで金勘定とか笑えるわ 己を知らないって馬鹿の特徴なんだよな >>542 Access VBAスレでExcelの質問するなよ EXCELで記録したVBAをACCESSで実行するとEXCELはXlmxにしなくても良いからじゃないの? ソルバーは使い方わからんのでなんにも言えなくてスマン。 >>546 Excel VBAスレみればなにがあったのか分かるよ 昨日アホな質問した541です。 accessスレにexcel VBAについて投稿してしまい、すみませんでした。 VBA初心者なので、よくわからずに投稿してしまいました。 >>551 それだけ焦ってたんでしょ。Excel VBA で反応がなければ藁をもすがる気持ちで アクセス VBA で聞いたんじゃない。 広い気持ちで x VBA初心者 o 5ch初心者 o パソコン初心者 o コミュ障入門者(上級) DoCmd.OpenReport "レポート名", acViewPreview DoCmd.PrintOut acPrintAll, , , acHigh, 枚数 新規レポートにラベルを貼っただけものだと希望どおりの枚数が印刷される. しかし,別のレポートだと常に1枚しか印刷されない. ネットでも同じ報告を確認した.バグ説もある. 皆さんはどうですか?やっぱりバグですかね? 解決した. デコンパイルとコンパクトしたらいつの間にか設定した枚数が印刷されるようになった. accessはマジで面倒くさいなあ. デコンパイルとコンパクトの待ち時間をを返して欲しいよ デコンパイル、昔は割と鉄板の解決方法だったんだけどね それでだめなら新規作成して全モジュールインポートとかもあったな 最近は必要性が減ったけど、まだたまにはあるんだな コンパクトだけでも良かったのかも知れないが,習慣で両方やることにしている ついいましがたも.Docmd.OpenReportのOpenArgsがレポートに渡らなくて困っていたが,コンパクトをしたら作動した. 終了時にコンパクトするオプションがあるくらいだから頻繁にやるべきなんだろうね. コード書いているときは非常に頻繁に破損するからね. あれはデータ領域を圧縮するのが主で、コード部分にはあまり影響しなかった気がするが 最近のアクセスでコードが破損するのはだいぶ減ったと思うが VBEからコンパイルするだけで解決してたんじゃないか? くわしいことはわからないが,挙動不審が治ることがあるんだよねえ とにかく,試行錯誤していると必ずと言っていいほど,壊れるよねえ. メモリーが不足していますとか出始めると,その日のうちに全フォーム消失とか起こるからなあ. 試行錯誤の過程のほとんどを貯め込むからな 設定で「終了時に最適化」で、都度終了を心掛けるか 大幅な改修の度にコンパイルのクセを付けるか ファイルサイズに気を付けて、「こんなサイズのはずは無い」ってな時は要注意 で、それは、お道具の使い方が雑、間違ってるってだけで、すぐAccessのせいにする連中はお里が知れる ってこと 下のコードでmdbのディレクトリが表示されると思いきや、 ディレクトリ Documents フルパス C:\Users\MyName\Documents が表示された。vbsならscriptの存在するディレクトリだからmdbの存在するディレクトリが表示されると思ったのに、違う。 このことを説明してある資料ありますかね? Sub test() Dim fso Dim objfolder Set fso = CreateObject("Scripting.FileSystemObject") Set objfolder = fso.GetFolder(".") Debug.Print "ディレクトリ", objfolder.Name Debug.Print "フルパス", objfolder.Path End Sub >>562 mdb/accdbファイルの場所が欲しいのなら CurrentProject.Path を使おう CurDir$や>>562 の例なんかで返されるカレントディレクトリはファイルダイアログとかで開いたフォルダになるっぽい その辺の仕様に関する資料は知らんけど そもそも、 >vbsならscriptの存在するディレクトリ が間違ってる気がするが カレントディレクトリの概念って最近は説明されてるの見ないなぁ GetFolder(".")が返してるのはカレントディレクトリ(からの相対パスで自分自身) カレントディレクトリはACCESS.EXEの場所や.MDBファイルの場所とは別に存在する まあMDB開くときはそこをカレントにする場合が多いけどな つねに一致してるとは限らん >>564 > そもそも、 > >vbsならscriptの存在するディレクトリ > が間違ってる気がするが VBSで稼働していたスクリプトをVBAに移植している際に気づいたので、正しいと思います。 スクリプトを任意のフォルダにコピーしてそのフォルダ内のファイルを一括処理するのに使っていましたので。 いやだから、scriptの存在するディレクトリじゃなくて、 カレントディレクトリが表示されてるって話なんだがな たまたまそれが同じだっただけだ ここ理解しないと思ったディレクトリが表示されない理由が理解できないぞ >>565 そのスクリプトをショートカットにして、 作業フォルダを変えて動かしてみたい カレントディレクトリみたいな、あやふやなものを使ってはいけない。 これが使えるのは、絶対に変化しない場合だけ 起動時に、特定のフォルダを指定するとか、 あらかじめ定数などに保存しておく 例えばデスクトップに、以下のショートカットを作ると、 WSL2 で、Ubuntu 18.04 を起動して、 その /home/ユーザー名/test ディレクトリを、VSCode で開く リンク先 C:\Windows\System32\wsl.exe code . 作業フォルダ \\wsl$\Ubuntu-18.04\home\ユーザー名\test もはやAccess VBAとは関係ない話になってるし、元質問者は聞く耳持たないみたいだから これ以上続ける意味無いよ >>574 なぜ「fsoを使うと」なにが、「当たり前」なんだい? 7月12日のWindows Updateを実施した端末で軒並み「要求されたタイプ ライブラリまたはウィザードは VBA プロジェクトではありません。」 というエラーが出てAccessで作ったものが起動できない症状が出てるんだけど、何か知ってる? ちなみにAccess Runtimeを再インストールすると直る。修復ではダメ。 >>576 書き忘れたけど手元で問題が発生しているのはAccess Runtime 2013 32bitの端末。 OSはWin8.1とWin10の両方で発生してる。 うちの環境とほぼ同じですね、まだ発生してないけど明日あたり起きるのかな。 runtimeの入れ直しですね、了解っす。 >>576 特定した。 KB5002121を入れると症状が発生する。 Access Runtimeを再インストールしても再度Windows Updateを実施すると元に戻るから KB5002121をブロックしないとダメだ。 迷惑な話ですねえ。 MSのプログラマーがアホなのは今に始まったことじゃないけど 昔EXCELのVBAで似たような話が合った気がするな その時はテンポラリディレクトリの掃除したら起動するようになったはずだから いちど試してみては MSは自社製品のテスト駆動開発すらしてない テストが面倒になるとサポート打ち切り 2022年7月パッチで「Microsoft Access」に問題、バージョンが異なるとファイルが開けない https://forest.watch.impress.co.jp/docs/news/1425748.html >異なるバージョンの「Microsoft Access」で作成されたデータベースファイル(ACCDE/MDE)を開こうとすると、「要求されたタイプ ライブラリまたはウィザードは VBA プロジェクトではありません」というエラーが発生する場合がある Formを変数にSetするとき下の二つのやり方のどちらが速いか試したら、結構まちまちなんですよね。 後者はEarly Bindingだと思うんだけど、ループさせると前者が速いことも結構あって不思議だ。 だれかこのあたりの事情をご存じの方いますか? Dim F As Form Set F = Forms!FormName Dim F As Form_FormName Set F = Forms!FormName >>584 runtime版でそれ出たな、試行錯誤でruntime2016からruntime365に変えたら動いたw事がある。 >>585 あってるかどうかは知らんが !は実行時に列挙する気がするんだが 後者は型チェックと変換が入るから後者のほうが遅いと思う 前者も入るかもしれんが、そうなるとForm型とForm_FormName型でどっちのキャストが早いかで 結局やっぱり後者が遅い気がする どっちにしたってFは型指定されているので事前バインドだが、 それが差に出るのはFのメンバーを使うときだぜ まあ、なんにしても誤差レベルだと思うが PC画面のスクショを撮って、印刷させたいのですが とっかかりすら分からない初心者です 検索しても該当サイトはなかったので よろしければご教授願いたいです >>589 Windows標準の切り取り&スケッチを使えばできます ACCESSからコントロールしたいのですか? >>590 はい、ExcelかAccessでとのことで、 今後の勉強含めAccessに挑んでいます。 不特定多数が使用する環境で (リテラシーが低い人も混在) ボタン一つで全画面スクショ印刷と アクティブウィンドウのみスクショ印刷 の2通りできるようにしたいです (スクショしたデータは印刷後削除される仕様にしたい) 今のところ全画面スクショはできたのですが アクティブウィンドウと その後の印刷と削除で、つまづいてます。 ド初心者なので、見当違いな質問をしていたら 申し訳ありません API経由で[PrtSc](全画面)、[Alt]+[PrtSc](アクティブウィンドウのみ)を押せばクリップボードに画面キャプチャができるだろうから それをレポート上のImageに突っ込んで印刷すればいいんじゃないのかな? 試してないから実際にできるかは知らんけど >>592 ありがとうございます 土日に試してみます! サーバーから検索したいのに上手くいかない どこか修正するとこありますか? Private Sub CommandButton1_Click() Const BASE_PATH = "\\L\設計\図面"Dim myPath As String, myName As String Dim FSO As Object, oFolder As Object, oSubFolder As Object, oFile As Object On Error Resume Next If TextBox1.Value = ""Then Exit Sub ListBox1.Clear Set FSO = CreateObject("Scripting.FileSystemObject") Set oFolder = FSO.GetFolder(BASE_PATH) For Each oSubFolder In oFolder.SubFolders For Each oFile In oSubFolder.Files If LCase(oFile.Name) Like LCase(TextBox1.Value) &"*.pdf"Then Debug.Print oFile.Path myPath = oFile.ParentFolder &"\"myName = oFile.Name ListBox1.AddItem myName ListBox1.List(ListBox1.ListCount - 1, 1) = myPath End If Next Next Set FSO = Nothing End Sub 何がどううまくいかないんだ? On Error Resume Next外して、エラー内容かけ 知らんけど、コマンドプロンプトで取得した方が速いと思うぞ。 表形式にしたフォーム上の一行一行に対して、そのレコードのID.pdfが指定のフォルダにあれば○、無ければ空白って文字を連結したテキストボックスに入れたいんだけど。 Dir使って判定させるところまでは出来たけど、vbaを実行させるタイミングの問題なのかな? 詳細セクションの描画時選んだら代入出来ませんって出た。 試しに詳細セクションダブルクリックだと該当レコードだけは入ったけど。。 一括で全レコード対象にする方法あるんでしょうか。。? データシートビューのソースの段階でクエリ使ってる? 〇や(空白)を入力するフィールドは確保されてる? 元のソースにpdfファイルがあるか無いかを画面上で比較しながらひとつずつ入力するつもり? 仮のテーブル作ってフォルダ内のpdfのファイル名をDir使ってそのテーブルに代入すれば 簡単に元のソースにも反映出来ると思うけど どうしてもデータシートビューで比較しながら入れたい? pdfが入ってるフォルダ内がしょっちゅう追加・変更・削除がある場合だとしても、仮のテーブル使っとけば 都度最新の状況での比較が可能だと思えるし、不足してるからpdf作らなきゃ、の指針にも成るような気がする でも、元のソースに〇のフィールド作っちゃうと、pdf削除されても〇のまま消えない可能性もあるから対策必要か つまり、一括で全レコード対象にするなら、Dir結果をcsvなりtxtなりに落とし込んで、それと元ソースで更新クエリがいちばん早い >>599 ありがとうございます 一旦別のテーブルなりCSVなりにファイル一覧作ってみる事にします! 思い付きもしませんでした 値にtrueやfalseが含まれるexcelファイルをDocmd.TransferSpreadsheetを使ってテーブルに取り込むと、 数値として反映されてしまうんですが、理論値のまま取り込む方法はありますか? 変換かけるしかないのかな >>601 取り込んだ後でクエリーで値変えれば良かろうに recordset.Fields.Append "フィールド名", adChar, 200 とかでフィールドを新規設定するといろいろと挙動不審になって、エラーが頻発した。 俺が気がついたのはLen関数がおかしな数字を返すこと。スペースの数を返す。 これのおかげなのか、DictionaryのKeyが変なことになり、ただしいItemが取得出来なくて2日潰したわ。 Trim関数に入れたらまともに動き出した。よけいなスペースが付加されていたため、本来の値と異なっていた。 このあたりの事情を書いたものあるのかなあ? Recordsetの作成(DAO編) http://www7b.biglobe.ne.jp/ ~cbcnet/DAO/database.html レコードセットの作成(ADO編) http://www7b.biglobe.ne.jp/ ~cbcnet/ADO/append.html 第4話 DAOとADOの違い https://www.r-staffing.co.jp/engineer/entry/20210806_1 同一システム内でDAOとADOを併用しないよう留意 とか? エラーが出るもんだから、VarType関数使って疑わしい変数を調べたら、18が返ってきた。 しかし、そんな定数ないんだよなあ。これはどういうことだ? 値の合計なので、10と8とか 5と6と7とか 思い当たるのをひとつずつ潰してく >>606 ありがとう。 Msgboxでそような定数の合計をしますね。 ところで、そのような知識は私の持っているVBA、VBS、Accessの本には記載されていない様な気がします。 もしかしたら、Visual Basicでは常識なのでしょうか?それとも一般的なプログラミングの世界での常識ですか? 私は仕事でVBAをいじるだけで、一般的なプログラミングはほとんど知らないのでお尋ね致します。 >>603 CHARとVARCHARの違い まあ、SQLの型の基本なんだが、ACCESS関連であまりちゃんと解説してるのみたことないな https://learn.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/datatypeenum OLE DB プログラマリファレンスの第 13 章および付録 A を参照してください、らしい >>607 ビットマスクって考え方があって、別にVBAに限った話じゃない が、VarTypeで18ってリファレンス見る限りないな。 どんな変数がその値だったんだ? AIに書いてほしいコードを聞くと正しく動くコードが返ってくる bingとchatGPTは頼れる、かも 最近の VisualStudio に搭載されたコード補完は おせっかいなくらいにコードの続き出てくるな >>611 俺はChat GPTに嘘ばかり教えられている。 用語の定義から間違えている。 Chat GPTの吐いた嘘を貼り付けるページがあったら参加したいわ。 >>613 確かに鵜呑みには出来ないね、よく嘘を言ってくる。ある程度自力で捌けないとヤバいね 嘘を嘘と見抜けない人の利用はお勧めできない、か どっかで聞いた話だな Excelスレに貼られていたWebview2のコードはワロタ 今日も大嘘をつかれました。 質問 MS Accessのvbaで既に存在するプログラム中に宣言されていない変数があります。これを探して,宣言するvba プロシジャーを教えて。 回答 MS AccessのVBAで、プログラム中で宣言されていない変数を検出して、宣言するための手順を説明します。 MS Accessを開き、VBAエディターを起動します。 検索機能を使用して、すべてのモジュール内の未宣言の変数を検索します。 未宣言の変数を検索するには、VBAエディターで「Ctrl + F」を押して、「検索」ダイアログボックスを開きます。ダイアログボックスで「未定義の」または「未宣言の」を検索キーワードとして入力し、「検索」または「次へ」ボタンをクリックします。これにより、未宣言の変数が使用されている場所がすべて検索されます。 未宣言の変数を見つけたら、変数の宣言を追加します。 例えば、未宣言の変数「myVariable」が使用されている場合、以下のように宣言を追加できます。 Dim myVariable As DataType ' 変数の宣言 DataTypeは変数のデータ型を指定するために使用されます。例えば、myVariableが数値である場合、データ型はLong、Integer、Doubleなどになります。文字列である場合は、データ型はStringになります。 全ての未宣言の変数を宣言したら、プログラムを保存して実行してください。 これにより、未宣言の変数エラーが回避され、プログラムが正常に実行されるようになります。 未宣言の変数が300種類くらいあるポンコツ業務用mdbがある。Option Explicit化して手作業で未宣言変数を探すとものすごく時間がかかる。ローカル変数だけならテキストに対しての構文解析だけで出来そうだけど、誰かやり方知ってますか? Access用の解析ツールは時間がかかりすぎるので諦めました 全角数字を含むフォームは普通VBEのプロジェクトエクスプローラでも全角数字で表示される。 しかし、俺の持っているmdbはなぜかフォームによってはVBEで半角の場合がある。 つまりForm1番→Form1番 というように半角になっている。 フォームのもっている名前とモジュールの名前が異なるので検索漏れが発生して何かと不便。 解決策ありますかね? >>620 Accessのバージョンによって全半角を同一視されるのとされないのがあったよーな 半角に統一して、置換するしかないんじゃね >>621 VBEはクラスオブジェクトのリネームはできないんですよねえ Text化してファイル名を統一してから読み込みますかねえ?それでなおるか未確認ですが。 今は検索文字列のパターンを増やして対応してますが、邪道だなあと思いながらやってます。 ACCESS側で名前変更しても、VBE側が変わらないことがあるっぽいな フォームの コード保持 を いいえ にして保存してから はい にしたら同じになったぞ まあ、コード全部いったん消えるがな >>623 テキスト化してフォームと同じ全角のファイル名にしてからLoadしたらVBEのクラスオブジェクトの名前と一致させることが出来ました。 思うに、このプログラムを書いた人はテキスト化して、お好みのエディタで書いていたんでしょうね。 だからOption Explicitなんてしてなくて、問題なく書けるので、変数のスペルミスがあります。 今回はファイル名の全角半角を間違えてままLoadしてフォーム名とクラスオブジェクト名が一致しないということになったと思います。 よほどVBEを使いたくなかったんでしょうね。 やけにエラーが出るので調べたら、クラスオブジェクトの名前のカッコが前側が半角、後側が全角のものを発見。しかも複数。 俺はプロじゃないけど、このデータベースに毎月金を払っている。金取るならちゃんとしたものを作って欲しいわ。 宣言だけして読み書きしない変数が約2000個、呼び出されないプロシジャーと空のプロシジャーが100個以上がもあるし、どうなっているんだ? 戻り値のないプロシジャーをFunctionにして,呼び出すだけのために変数を使ったりしてアホかと思うことばかり クエリがいくつかあってそのなかであるテーブルを使ってるかどうか検索する方法ないですか QueryDefsのSQLプロパティをinstringで調べる それをループ かな 流行りのChatGPTをACCESSで使えるようにしてみた BingやBardもレスポンス良く使えるようになったのであまり意味はなかったが面白かった VBAコードはChatGPTに書かせたのをほぼコピペで動くようにできた スレの意図を無視するがAccessは出来るだけVBA使わず作成する方がバージョンアップにも対応し易い お客様に納品するならそういう気遣いも要りますね 自家用なので気の済むまで作り込みます 自社の50人くらいが快適なように どうした? 総合で同意が得られなかったから改めてコッチに書いたのか? Accessをインストールだけして使わないでいればバージョンアップもへったくれも無いから、そうした方がいいぞ? Rubberduckは大きいデータベースだとパース中にエラーが出て使い物にならないねえ 数年前よりはるかにマシになったけど。 msgboxの戻り値を格納する変数の型をvbMsgboxResultにするかLongにするか悩んだので、 時間を計ろうと思って、古い本を引っ張り出して、二つを比較するプロシジャーを書いた。 ふと、全く同じテストをしたらどうなるのか気になったので、やってみたら、全く同じプロシジャー同士の比較なのに30%位スピードに差が出る。さっきやったら最大で37%速度差があった。 一方が速いこともあれば、もう一方が速いときもある。こんなのでスピード比較する意味あるのかなあ? 時間測定はGetTickCountを使って、変数宣言のみ100万回のループをするプロシジャーを100回呼び出すという感じ。 なんかいい測定方法ありますかね? timerが秒単位でGetTickCountはミリ秒単位と古い本に書いてあったなあ あと、timerはそれ自体の動作が遅いって書いてあった ユーザーフォームが大きいんで下半分を隠す、上半分を隠す、という2つのコードを書きたいんです。下半分を隠す、はハイト プロパティを小さくすれば可能なんだけど、上半分を隠す、は不可能なんですかね。 >>639 何をやりたいのかイマイチ分からんけど、タブコントロールじゃだめなん? 上半分を隠したら×ボタン無くなってにっちもさっちも行かなくなるぞ >>640 >>642 ありがとう。皆さんのアイデアをためします 質問です。 Excelファイルを読み込んで、加工してからテーブルとして保持したいんですが、 Excelファイルのまま編集してinsertするのと、 一度テーブルとして読み込んでから編集してinsertするのはどちらが高速でしょうか? insert ? inport の手順なら下記リンク先を参考に https://hamachan.info/win8/access/import.html Excelファイルをリンクでもいけるし 同作業を何度も繰り返すとかでも、操作を保存しとけば楽だし データのボリューム次第とかマシンスペックとかも兼ね合いがあるから、どちらとも ウィザードの途中画面をよく見て、事前にExcel側を整えて置けば inport も楽だし 編集内容がより細かく設定できるのはExcelなのかAccessなのかを知る事でも、どちらの方法を採るかの判断になる いろいろありがとございます、しかしimportではなくinsertです 内容を見て既存のテーブルに1行ずつinsert(もしくはupdate)していく形になります。 んーと、Access側のテーブルはあくまでもデータストック用な立ち位置? 事前にExcelでの編集が伴うなら、Accessのテーブルとしてから編集するのはムダなような https://tonari-it.com/excel-vba-access-add-records/ コッチのが参考に成るかも 実行速度の検証もしてる様子 ありがとうございます! いまさらっとですが見てみたところ、速度比較などもしていて参考になりそうです。 見てみます! 中間テーブルを作成してから編集した方がいいよ、という声を聞いたんですが いちいち使わないテーブルに投入する必要はないのでは?と思い質問いたしました。 事前編集方式でやってみます! Excelの元データと、何をどう編集したいかも判らないから、中間テーブルの必要性は当人しか判断不能 上でも書いたけど、編集内容がExcelの方が楽で早いのかAccessの方なのかでも手順は変わるような 速さを第一に求めているように読めるけど、「一行ずつ」って書かれた部分で「おや?」と スムースにデータを移行させるには、最初のリンク先の「データクレンジング」も読んでおいてもムダには成らない アチコチに目を配らなければならない様子でお疲れ でもそれがじぶんの糧に成る >>644 ExcelインポートしてAccessで加工する方が速いよ ExcelでVBAでデータ加工するなんて愚の骨頂 みなさまいろいろありがとうございます 自分の説明不足&理解不足ですみません。 ACCESSに入っている一覧情報を定期的に更新しなければならず、 その更新情報がExcelで来るのでそれを読み込んで…とやる感じです。 ACCESS側で固有に更新している情報もあるのでまるっと上書きではなく、 一行ずつ確認して該当の列のみ追加や上書きをしなくてはいけません。 それを、いまはAccessVBA内でExcelファイルを開いて 一行ずつ読み込んで内容確認して内容によってSQL流して…とやっているのですが、 もしかしてExcelファイルを中間テーブルにimportしてから 操作した方が早いのかな??と悩んで書き込んだ次第です。 「ExcelインポートしてACCESSで加工」と言ってくださってるのは 後者の場合を指しているのですかね? 今はとりあえずサンプルを作って動かして比較しようかと思っています。 そういうことなら中間テーブルに取り込んで、テーブル同士の差分をチェックかな https://tasukete-access.com/2022/11/28/accessintro_table_comparison/ [フィールド単位での差分をチェックする] この方法のが近いのか 返信遅れてすみません!ありがとうございます! こんなやり方ができるんですね! 全部SQL書こうと想ってましたがクエリで楽に作れるかもしれず嬉しいです。 参考に書いてみます、本当にありがとうございます! 500以上のモジュールにOption Explicitが書いてない。 当然、宣言されていない変数が何百もある。 ここにOption Explicitを書くと、宣言されていない変数を見つけるたびにコンパイルが止まるので面倒。 一括して発見する方法を知ってる人いますか? VBEが発見できるので、その方法が分かればユーザにも分かるはずだと思うが、検索しても見つからない。 Cのコンパイラを自作する技術があれば、文法解析の手法が使えると思って調べたけど、全余暇時間をコンパイラ自作に割り当てても6ヶ月かかったと言ってる人がいて、踏み出せない。 こんなん見付からはりました https://stabucky.com/wp/archives/6297 実際に検証はしてないんで、自己責任 ←重要!! 現物mdb(そんなのはAccdbでは無くmdbだと勝手に決め付けてる)では無く、コピーしたファイルで 尚且つネットから切り離しスタンドアロンで、更に30秒後に発火するかも知れないので消火器用意してから 試してみてください 結果報告が期待されます VBE上でCtrl + Spaceで入力支援機能(サジェストっつーの?)を出して、いっこずつTABで拾いだす案を 提案しようと思いつつぐぐってたら出てきた代物 宣言してなかったら自動メンバー表示(どの名称が正式か知らん) にも出てこないのか!?と、ようやく気付いたレベルの人間のレスなので、眉唾しながら(若しくはスルー推奨) VBAでJavaScriptを使うには?という場合は : https://extan.jp/?p=10611 とか あと、『なお「unique」という自作の関数を使っています』とあるので、それも併せておかないと動作しないかも(きっと) >>655 ありがとう。 少しずつ試してみます。 いろいろ調べて、いまはFlexとbisonという奴でもやってみたくなっています。 配布したaccdbを365runtimeで動かしてて、今朝突然レポートが開かなくなった ほぼ午前中すったもんだして2013runtimeならレポートの印刷やプレビューが問題無い事がわかってruntime差し替えた こんな目にあったひと他にいない? >>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)ですかね それでダメならもう一つ前へ それって、MSからバグフィックスや修正が為されたのを察知するにはどうしたらいい? ロールバックしっ放し? 勝手にアプデされてまだ直らなかったら二つ前にロールバック? ずっと修正されなかったらロールバックバックバックとかに成らん? >>660 察知は毎月リリースページを確認していました バグが修正されるまでは Office の自動更新を止めます なのでロールバックは最初の1回だけです バグが修正されたら自動更新を有効に戻して最新版にする感じでした 更新は重大バグ修正の時のみ、原則自動更新は使わないという運用もあります これに関してはお客さん次第ですかね そうだよね 委託を請けてる業者さん目線だよね エンドのユーザーはそんなのに目を通さないしね 見てもどれが自分の不具合に当て嵌まるか解かり辛いしね じゃあ内製のユーザーはロールバックバックバックし続けるしか無いよね アプデを停め続けるひとも居るかも知らんけど、そうすると1年分とか溜まってそれはそれで地獄を見るしね やっぱこういう場所で症状とかを意見交換するのは貴重なんだ、と再認識 >>662 はい、開発委託業者です 確かにエンドユーザーさんにリリースページは無縁ですよね 一応システム担当者さんにはお知らせしましたけど、こちらで随時チェックという感じでした また修正されてもリリースページに載らない細かい不具合修正も多いです レポートの罫線不具合はまさにそれでした ■最新チャネル リリースのリリース ノート - Office release notes | Microsoft Learn https://learn.microsoft.com/ja-jp/officeupdates/current-channel あと、マクロだと screen.active.control とか出来ないよね sleep をどんだけにするかどうやって決めるの? VBAで自作のクラスモジュール作成したんですが、 それを引数で渡す関数の書き方がわかりません Sub test(ByVal hoge As Hoge) みたいな感じで書いたのですがうまくいきません。 (As Hogeが自動でAs hogeと変換されるし、エラーになります) どなたか教えていただけませんでしょうか? >>667 引数hogeに引っ張られるVBAの仕様です VBAでは変数にクラス名を使うのは避けた方が良いですよ プロジェクト内に変数hogeが存在している時も同様です >>669 流石にそれはない。クラスモジュールがある方が便利だよ。 bindってのでクラスモジュールの有り難みを知りました クラス使わないと同じようなコードが量産されて面倒くさすぎる ただでさえポンコツな言語なんだから、クラスぐらい使おうよ。 >>673 そのせいだったのか、クラス使えば良かった ADOでCSVからテーブルを作ろうとしたらレコードが大きすぎますって怒られるんですよ! 1レコード2000バイトも無いのにですよ! 400列くらいあるのがダメなんですか? 2013なんですが。 過去最大のフィールド数は500 テーブル分割して収納した Access2019でリボン非表示にするのは、どうするの? XML??? VBAでなら DoCmd.ShowToolbar "Ribbon", acToolbarNo ってのがあるが それだと使用者に解除されちゃうので、XMLで空のカスタムリボン作って、オプション→現在のデータベース→リボンとツールバーのオプションに設定したいんよ Access2019だとスクラッチからリボン作ってもファイルボタンが残っちゃうのが解ったので、それで我慢する サブフォームをもつフォームにおいて、 親フォーム側から Me.サブフォーム.Requery を実行すると、サブフォームのCurrentイベントが2回発生するんだけど、なんでなんだろ? 大抵はそう組まれているからそう動作する 親フォームからひとつずつチェックしてみれば「あぁ、ここか」が出てきたりする >>688 検証のために、メインフォーム上ににサブフォームとサブフォームをRequeryさせるだけのボタンの最小限の構成にしても 687で書いた現象が発生している(サブフォーム側はCurrentイベントにdebug.printを書いただけ) 私は何か根本的な勘違いをしているのだろうか?それともAccessの仕様なのだろうか? フォームをデザインビューにした時に出て来るプロパティシート おおむかし、あの枠が狭くて知らぬ間に二行に記載していたことは稀によくあった Excelで言う、セル内改行をやってしまっていた 見た目はいっこなので気付きにくい 或いは、サブフォームをよりシンプルなものでテストするとか 仕様なら同様の質問疑問がてんこ盛りに投稿されるはず と思って探ってみたら、こんなのが・・ http://yamav102.cocolog-nifty.com/blog/2015/05/from_current-96.html これ系? >>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 --------------------- こんなかんじの検証用のを用意 んで、実行結果(イミディエイトウィンドウ)が clicked ------ frmSub Form_Current frmSub Form_Current -------------- イメージだけで応答してたから、どうにもとっ散らかってた 現物当たって真似してみた https://learn.microsoft.com/ja-jp/office/vba/api/access.form.current このイベントは、フォームが開いたときと、フォーカスがレコード間を移動したときの いずれの場合にも発生します。 複数回発生して当たり前だった Form_Load (読み込み時) 或いは Form_Abtivate (アクティブ時) に変えればおk どうしてもForm_Current (レコード移動時)に設定したい場合は見て見ぬ振りをするしか >>693 loadやactivateではrequery時にイベントが発生しないので、本来の目的を達成できません また、最初にフォームが開かれたときにはcurrentは一度しか発生していません 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の使い方もクセがあるので切磋琢磨が 必要だったり >>695 frmSubはfrmMainに貼り付けられているのでfrmMainを開くと当然frmSubも開かれるので、 Open, Load, Current等のイベントはひととおり発生します(仕様通り) これについては特に問題ではありません 問題にしているのはbtnRequeryをクリックしたときに、Me.frmSub.Requeryを一度しか呼んでいないのに frmSubのCurrentイベントが二度発生していることです 紹介いただいたteratailのページを参考にあれこれ試してみたいと思います AccessにGROUP_CONCATみたいなのなかった? サブフォームのレコードソースにテーブル指定して >>691 やってもカレントは一回しか表示されんけどな レコードソース無ければ2回カレントは表示される サブフォームにレコードソース指定してる? >>698 たしかにレコードソースはしていしていません なるほど理由はよく分からないけれど、原因は分りました ありがとうございます ちょっと不思議な話 よくある数値の切捨て処理の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なんで、暗黙的な型変換が行われているせいなんだろうけれど、微妙に納得がいかない不思議な話でした ちなみに蛇足ですが、普通に Function RoundDown(dblNum As Double, intPlace As Integer) As Double とdoubleを引数にした場合は、特別なことをしなくても RoundDown(33.6, 2) の結果は33.6となります 浮動小数点を経由するので誤差から免れることはできません(以下はイミディエイト ウィンドウでの実行と結果) ? 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()で一度補正?したりで影響を減らすとかも考えられます。 検証ありがとうございます 浮動小数点を経由するので誤差がでるのは理屈としては理解できるのですが、 わざわざ十進型を使ってるのに…というのや、Fix()に渡される式の結果ではなく、 渡された段階で暗黙的な型変換が行われているっぽいのが腑に落ちなさの一因なのでしょう ? 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万回くらい(適当)ループして検証してみてください。 更なる解説ありがとうございます ? TypeName(10^2) Double 正直これは盲点でした 原因がはっきりわかりすっきりしました ありがとうございます VBAの内部計算につかう型は結構複雑な変換をする 33.6@ * 整数変数の結果は、Currency型だぜ 多くの関数や演算子で、より精度の高い型を使おうとするんだが、べき乗はDoubleしか返さん仕様っぽいな 自分でCurrencyかDecimalでべき乗する関数作れば解決 OpenArgsってなんて読んでますか? 何の単語の略なんでしょうか ご存じのかた教えてください >>706 CurrencyかDecimalでべき乗する関数ってどのような? >>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で宣言してる >>707 おーぷんあーぎゅめんつ argsはargumentsの略 引数 >>709 そんな低レベルな関数書いて「解決っ」とか言っちゃって時点でバカにも程がある 業務用のmdbがポンコツコードだらけなので書き換えてるんだけど、IIFが最大4個ネストしてあった。 4個ネストしてあるのは変数の値の判定が条件になっているけど、3個以下のは関数を呼び出している。 皆さんだったらどうします? 将来も含めてどのレベルの人がメンテしていくかだろうな ソースの書き方も人それぞれ 例えばコメントの書き方でも、巷では行間に書くのが多いが、私は画面内に一度に表示できるロジックの行数減って見通し悪くなるから、行末側に書きたい 画面も横長だし とか厳密に書き方決めないと人それぞれになってしまうのよね ネストの段数にしても固定してしまうと、ムダに外出ししてしまうとかもあったり ソースを見やすくするか、コメントで逃げるとかはもうコーティング規則にするか、それしないなら担当者判断でしかない iifもネストなんて場合によりどちらでもいい とりあえず、測定用の簡単なVBAを作って、IIFのネストがどのくらい遅いのか確かめてみます。 変数の値の判定くらいなら差はほとんどないという記事を読んだことがあります。しかし、関数呼び出しをするとかなり違うという記事も読んだことがあります。 なので、呼び出された関数が10個、さらにそれぞれの関数が10個の関数を呼び出すようなコードでも書いて調べてみます。 昔Ken Getzの本を何冊か読んだ記憶ではOptimizationの章では揃ってIIfを避けるように書いてありましたね。 >>714 あぁ、それなら全ての条件を評価する(初期の判定で達しないとこも)から、遅くはなる そういう弊害があるから一律使わなくするなんてことは、あったりするだろうね そういうの見ると「はぁ⤵」って思うけど >>715 ちなみにif~thenも全判定なので、iif禁止で問題解決になるわけでもない >>714 Access のIIFの問題は判定結果に関わらず TrueパートとFalseパートの両方が評価(関数なら実行)されてしまう仕様 a = IIF(True, funcA, funcB) funcAだけでなくfuncBもコールされる aにはfuncAの戻り値が入る 関数の実装内容によってはパフォーマンスに影響が出るでしょうね IFではどちらか一方のみ結果パートが評価されます >>716 if thenが全判定てなにを言っているんだ andとorがショートサーキット演算しないだけだぞ 基本vbaはショートサーキットしない 例外はif関数ぐらいか >>718 日本語理解できない、省略を補完する知識もないシナのアホが飛来したな Select CaseはTrueが出たところで打ち切るからTrueになりそうな条件を上の方に書くべきて読んだことがあるなあ >>720 普通の人間ならそうなるだろ? レアパターンを先に評価するやつなんて変わり者 >>721 1、2、3……順とかにするのは普通 頻度順にまではしないことも多々ある read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる