◎正当な理由による書き込みの削除について: 生島英之とみられる方へ:
Access VBA 質問スレ Part2 YouTube動画>1本 ->画像>5枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1544620479/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。
Access の VBA に関する質問スレです
質問テンプレ(雛形)は用意しませんが、OSとAccessのバージョンぐらいは必ず書きましょう
前回のスレッド
Access VBA 質問スレ Part1
http://2chb.net/r/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
http://2chb.net/r/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になってくれて
ある程度はコード書かなくてもできるよえになればいいんだが
え!?ひとりでも最低
じゅじゅじゅじゅじゅうまんえーん!?
ちなみにキントーンもこの商法みたいだな
ACCESSはUIがクソなのと共有がほぼできない、ちょっとしたことでもコード書かなきゃならない、その代わりに激安ってことなんだろうな
逆にそこらを改善するのはこんくらい金とらなきゃできないことなのかもしれん
FileMake使いのやつって
Access使いを見付けると必ず攻撃してくるよね
なんで不況に熱心なのかな
馬鹿
↓
FileMakerはコード書かなくていい(キリっ)
いくらなんでも高すぎる
あれって全社員にipadもたせてリアルタイムでデータ共有するような大企業向けだろ
とはいえほかにACCESSしか選択肢がなくてACCESSは手間がかかり過ぎるが
ACCESSは実質開発が停止してるからな
Web公開手段を再度実装したらFileMakerなんて駆逐出来るのに
>>373 それ元がボケてるんやな
ディスプレイ買い換えるしかないな
うちは拡大してもクッキリやで
>>389 んなことないだろEIZOのFLEX Scanだし
ぼやけるって言葉の認識だと思うが
ベクターとラスターの拡大みたいなこと
拡大鏡だと単純拡大だからガタガタのぼやぼや
スマホの拡大縮小だとおかしくならないよね?
ソフトに標準で拡大縮小が実装されているならそれと同じできれいに拡大できる
ACCESSはないから拡大鏡つかうことにかるから汚いしつかいにくい
>>390 〉拡大鏡だと単純拡大だからガタガタのぼやぼや
単純拡大だからガタガタになるので正しい
しかしぼやぼやにはならない
頭(目?)悪そうだなこいつ
文字が
こうなるのをボヤボヤといってるんだと思う
MSゴシック使ってるやつはわからないかもしれないが
アンチエイリアス入ったフォントで拡大鏡使うとボヤボヤになるよ
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にコードをバックアップして直接開いたところ
こういった線が付きました
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……順とかにするのは普通
頻度順にまではしないことも多々ある
FileSystemObjectのDeleteFolderかFolder.Delete使うと
対象フォルダーにシンボリックリンクやジャンクションあると
リンクじゃなく参照先が削除されるから気を付けた方が良いよ
定期的に掃除するログやバックアップフォルダーに
大事なフォルダーへのリンクなんか悪戯で作成されると消えちゃう
仕込まれた日と削除される日に時間差があるので追跡難しい
Defenderも気付いてくれない
フォルダーの削除はRmDirにしとき
恐ろしい
そんな罠が
最近fsoの方使ってるから気をつけなければ
情報thx
kill のが一般的だと思ってたが、そんなことは無かったのか
シンボリックリンクやジャンクション(つまりショートカット?)とかがある場合の挙動は知らないけど
比べた人が居て、ほぼおなじ動作なら kill のが楽だと
https://www.limecode.jp/entry/difference/kill-deletefile 削除の差異は意識してなかったからよくわからんけど、ファイルやフォルダの扱いがfsoの方が書きやすい、わかりやすいでこっち使い始めたかな…
再帰とかfsoの方が書きやすい(ソースがシンプル)はず…
違うか フォルダの中に拡張子.lnk があるかどうか事前にチェックするべきか(他の対象外のファイルとかも
DeleteFolder や RmDir だと無条件で削除してしまうからキケンがあぶないってことか
キャベツを包丁で切ったら青虫まで一緒に切り刻んでしまいました
あらかじめ葉をむしって洗ってから切りましょう みたいなことだろうな
チェックするの面倒だから豆腐切れない斬鉄剣で切るんじゃないの?
どっちかというとやばいのは
rm -rf *
の方だったかな
>>730 それはBASICインタプリタが起動しているだけ
Accessに限らんじゃん Word でも Excel でもてことだよな
Excel連中に知られたら、阿鼻叫喚の世界だな あいつら節操無いし
知らなくても知ってたといいはるからなw
逆に知らなかったことにすることあるわ
森は大切に育てないとな
Conpact & Repairを内部からVBAで命令しようと思ってAIに訊きながら何時間も格闘したあとにググったらできないことが判明した。
Claude3.5とGemini Proがここまで馬鹿とは。
何度も提案してくるけどシンタックスエラー出しまくるし。基本構文すら間違えるようでは人間プログラマーはまだまだ安泰だね。
ファイルメニューのオプションで、閉じるときに最適化する を選んでおくだけでいいような
これをチェックしないまま使い続けて「壊れた」とか「容量が」とか大騒ぎする方々が多い気がする
気がするだけだけど ×Conpact ○Compact
数十社(延べ数百台)の業務アプリこなして来たけど、そんな事例は一件たりとも経験していない
じぶんが開発用とか運用テスト用とかで仕立てて来たマシンでも、そんな事態に陥った経験は無い
圧縮と書いているけど、最適化を指定しておけば修復もするはず 修復できたものは壊れたとは呼ばない
それでも尚壊れたというなら、お作法に則って無い制作物だったとかなのかも知れない
少なくとも「すぐ壊れる」事態には陥らない
開発途中で、試行錯誤を重ねてあれこれ試してしまった ←ようなケースでも、その作業の途中で
手動で最適化する、或いは一旦閉じて最適化をさせるだけで悲劇からは回避できる
中身全部別ファイルにコピーしないと、なんて事も珍しくはないけどね
運用中に壊れたことないけど、昔は開発中に度々壊れてた(壊してた)な…
昼と夜にバックアップしてた懐かしい思い出w
>>743 最適化は全部別ファイルにコピーしているよ
ニホンゴムツカシイネ
最適化の最中は隠しファイル作ってソッチにコピーした後圧縮して、完了したら元ファイルに上書きしてる
てことを言いたいのだろうが
(おれは)最適化(したファイル)は全部別ファイルに・・とも読めて、一瞬「無駄だろ?」とか思った
日本語プロパティになった時は、なんて事しやがるねんて思った
特定文字列がうまく認識されなかったり(T_T)
初心者にはわかりやすかったけれども
lud20250217102825このスレへの固定リンク: http://5chb.net/r/tech/1544620479/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。
TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像
↓「Access VBA 質問スレ Part2 YouTube動画>1本 ->画像>5枚 」を見た人も見ています:
・Excel VBA 質問スレ Part64
・Excel VBA 質問スレ Part61
・Excel VBA 質問スレ Part58
・Excel VBA 質問スレ Part59
・Excel VBA 質問スレ Part48
・Excel VBA 質問スレ Part68
・Excel VBA 質問スレ Part81
・Excel VBA 質問スレ Part65
・Excel VBA 質問スレ Part73
・Excel VBA 質問スレ Part74
・Excel VBA 質問スレ Part70
・【BlackDesert】黒い砂漠 質問スレ Part18
・【BlackDesert】黒い砂漠 質問スレ Part31
・【BlackDesert】黒い砂漠 質問スレ Part30
・【PS4/XB1】SEKIRO:SHADOWS DIE TWICE 質問スレ Part4【隻狼】
・【BlackDesert】黒い砂漠 質問スレ Part14
・【BlackDesert】黒い砂漠 質問スレ Part19 [無断転載禁止]
・iTunes 質問スレ Part15
・【BlackDesert】黒い砂漠PC版 質問スレPart55
・【LoL】League of Legends 質問スレ Part67
・【D2R】Diablo 2 Resurrected 質問スレ Part5【リマスター】
・【BnS】ブレイドアンドソウル 質問スレ Part21
・Tree of savior 質問スレ Part3
・【PC】Terraria 質問スレ Part17
・【BlackDesert】黒い砂漠PC版 質問スレPart61
・【BlackDesert】黒い砂漠PC版 質問スレPart67
・Hearthstone: Heroes of Warcraft 質問スレ part40
・Excel Python 質問スレ
・VBAなんでも質問スレ Part2
・リトルノア 質問スレPart19
・Excel ピボット Power Pivot DAX関数 質問スレ
・マイニング質問スレ Part.2
・【BlackDesert】黒い砂漠質問スレPart52
・シノアリス質問スレ【SINoALICE】 Part4
・Android開発質問スレ Part2
・Fallout4 PC 質問スレ 25cap
・マイニング質問スレ Part.4
・Panasonic DIGA質問スレ Part82
・Panasonic DIGA質問スレ Part70
・【PC】Warframe 質問スレ RANK61
・Java入門・初心者質問スレ Part.8
・BlackDesert】黒い砂漠質問スレPart37
・メビウスFF初心者・質問スレ Part41
・【BlackDesert】黒い砂漠質問スレPart40
・【ヒット】HIT~Heroes of Incredible Tales~ 質問スレ 5HIT
・【DDON】ドラゴンズドグマオンライン質問スレ Part49
・【PS4/PS3/Vita】ドラゴンクエストビルダーズ 質問スレ part3【DQB】
・ロード初心者質問スレ part378
・ラブライブ!質問スレ part9
・Java入門・初心者質問スレ Part.3
・【PC】Warframe 質問スレ RANK41
・Panasonic DIGA質問スレ Part83
・Panasonic DIGA質問スレ Part74
・Java入門・初心者質問スレ Part.10
・Java入門・初心者質問スレ Part.11
・パソコン初心者総合質問スレッド Part2052
・【ロマサガRS】ロマンシングサガ リ・ユニバース質問スレ Part37
・VB.NET質問スレ(Part43)
・【DQ10】★ドラゴンクエストⅩ 質問スレ★ 182
・【MacOSX】 Apache初心者質問スレ 【専門】
・Java入門・初心者質問スレ(ワッチョイなし) Part.8
・【レベル5】妖怪ウォッチぷにぷに初心者質問スレpart17
・VBAなんでも質問スレ Part3 (137)
・【facebook】フェイスブック初心者質問スレ28
08:10:29 up 63 days, 9:09, 0 users, load average: 8.23, 7.66, 7.15
in 0.094628095626831 sec
@0.094628095626831@0b7 on 061921
|