Access VBA 質問スレ Part2

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

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


前回のスレッド
Access VBA 質問スレ Part1
https://mevius.5ch.net/test/read.cgi/tech/1328536426/
2021/09/04(土) 16:34:10.88ID:JBLhGxRz
ん、まぁ、ガンガレ
421デフォルトの名無しさん
垢版 |
2021/09/05(日) 03:44:21.58ID:Ocn+wvkQ
外部からaccessの特定のレポートを開く方法ある?
2021/09/05(日) 14:14:02.27ID:ICYnYWWd
外部って?
普通にCOMで操作すれば良いんじゃねえのか
423デフォルトの名無しさん
垢版 |
2021/09/07(火) 12:53:43.40ID:3mZ93kfX
パススルークエリのパラメータをaccess外から設定する機能教えてください。
2021/09/07(火) 13:13:29.25ID:7P2mUzTw
access外って?
何がやりたいかわからん
425デフォルトの名無しさん
垢版 |
2021/09/07(火) 14:16:04.54ID:QthkAqNV
ADO
ADODB
DAO
426デフォルトの名無しさん
垢版 |
2021/09/08(水) 22:14:40.15ID:jpM3jR9r
>>425
データベースに
ドライバなしでvbaで接続する方法ってないの?
427デフォルトの名無しさん
垢版 |
2021/09/09(木) 01:34:00.79ID:4EZcQadY
>>426
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/open-statement
2021/10/09(土) 23:35:10.80ID:uMcy1fPR
VBAエキスパートって取ったほうがいいでしょうか
2021/10/10(日) 08:29:41.88ID:fy4lWk3l
資格マニアを見る世間の目は冷たい
430デフォルトの名無しさん
垢版 |
2021/11/02(火) 07:37:22.79ID:0Z1mhYfJ
>>428
資格より実践を積むべし
2021/11/29(月) 15:04:38.27ID:vB15GkdT
レコードが存在しない場合に 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に、何か制限などありますでしょうか?
2021/11/29(月) 15:15:06.43ID:MiFRCJa7
直接の返答じゃないけど、SQL一発書きじゃなきゃだめなの?
事前にレコード数チェックして分岐じゃだめなの?
2021/11/29(月) 15:17:50.75ID:vB15GkdT
UPDATE と組み合わせて、SQL一発を考えてます
無理であれば、おっしゃるように分岐かなと
2021/11/29(月) 16:01:33.58ID:MiFRCJa7
ちょっと気になったので手元で実験してみたけど、dummyテーブルが存在して空ではないときには
(多分)431の想定どおりの挙動をしていると思う
バッドノウハウ臭いので、おとなしく事前チェックして分岐かなぁ
まぁAccessのSQLって変だよね
435デフォルトの名無しさん
垢版 |
2021/11/29(月) 17:41:32.65ID:XYio4/pG
access はupdateいっぱつで初挿入もできたはず
しゅきーのヌルを上書きする感じで
2021/11/30(火) 05:36:52.18ID:KirC+CSy
>>435
さすがにそんなことはないと思うが、ちょっとサンプルコード書いてみてくれ
437デフォルトの名無しさん
垢版 |
2021/11/30(火) 09:01:45.87ID:qEKwfbTR
>>436
選択クエリは更新できる
UPDATE TableA RIGHT JOIN TableB ON TableA.ID = TableB.ID
SET TableA.ID = [TableB]![ID], TableA.Data1 = [TableB]![Data1], TableA.Data2 = [TableB]![Data2];
438デフォルトの名無しさん
垢版 |
2021/11/30(火) 10:50:50.28ID:d0QAjKSx
>>431
values (1, "name")
じゃ駄目なの
2021/11/30(火) 10:58:46.58ID:+NfPg838
>>438
単純にinsertするだけならそれでいいんだけど、existsを使って条件付けようとしてるのでvaluesは使えない(エラーになる)
2021/11/30(火) 12:38:13.11ID:nsxxcWz3
それ自分でDUALという名称でテーブルを作って1レコード入れておけば出来るよ。
OracleのDUALも実体はそんな感じだったと思う。
2021/11/30(火) 16:33:37.59ID:KirC+CSy
>>437
更新はできるけど、存在しない行を更新しようとしたとして
その行を新規追加することなんてないだろ...
と思ったけど、追加されるのか

ACCESS無茶苦茶しやがるな
リンクテーブルに対してでも追加しやがる

SQL ServerだってFromでJoinしてUPDATEできるけど、
さすがに行が追加されることなんてないぞ
エラーの原因が分からない?
2021/11/30(火) 16:35:34.50ID:KirC+CSy
あ、最後なんか変な行入った
2021/11/30(火) 17:23:09.43ID:aruulzL7
あくせく働くぜ
444デフォルトの名無しさん
垢版 |
2021/11/30(火) 18:49:33.51ID:VsTnDahT
>>441
Access的には「更新可能クエリ」はテーブルと同等の扱いなのだろう
2021/11/30(火) 22:05:19.66ID:KirC+CSy
>>444
Viewが実テーブルとほぼ同じ扱いってのは別に問題じゃない
UPDATE文でテーブルの行数が変わるのが無茶苦茶なんだよ
446デフォルトの名無しさん
垢版 |
2021/11/30(火) 22:10:51.28ID:VsTnDahT
SELECT * FROM TableA RIGHT JOIN TableB ON TableA.ID = TableB.ID

これの更新だから行数は変わっていない
2021/11/30(火) 23:40:10.71ID:KirC+CSy
UPDATE文で実テーブルの行数が、な
2021/12/01(水) 09:46:36.82ID:dv4Z+qI2
>>431
SQL一発では出来ないよ
残念だが
DOループで回す事になる
449431
垢版 |
2021/12/02(木) 11:57:32.43ID:nKskuO+T
ありがとうございます
分岐で分けることにしました
450440
垢版 |
2021/12/02(木) 22:29:47.92ID:vu0CN48k
もうちょっと俺を信用してもええんやないかと思ったが
出来たんならええか
2021/12/08(水) 11:00:44.75ID:8eCyKUYS
データベースに対し、レポートを外部データの取込で追加するのですが、
この操作をGUIでなくコマンドで行う事は出来ますでしょうか。
452デフォルトの名無しさん
垢版 |
2021/12/08(水) 11:36:19.36ID:XFpeOKs/
mdbファイルまるごと差し替えでok
2021/12/08(水) 14:57:00.86ID:8eCyKUYS
>>452
返信ありがとう
やっぱ基本はDBごと差し替えになるんですね・・・
最新を管理しないといけないということですか
2021/12/08(水) 16:58:22.13ID:sRvDCOgH
>>450
レコード入れずに試してみてました
あとで確認してみます
2021/12/08(水) 18:12:44.70ID:ixTDMdmo
>>451
access起動コマンドラインオプションに
/x マクロ名
で自動実行可能

向きが逆だけどオブジェクトのコピーでレポートをコピー出来る
2021/12/08(水) 20:30:00.04ID:FsTgnRus
>>451
DoCmd.TransferDatabase acImport
2021/12/13(月) 11:19:46.91ID:HhLRYuYl
>>440,450
ありがとうございます、確認しました
dummy テーブルにレコードを入れて動作しました

INSERT INTO t_table(id, name)
SELECT 1, "name"
FROM dummy
WHERE NOT EXISTS(
SELECT * FROM t_table WHERE(id = 1)
);
458デフォルトの名無しさん
垢版 |
2022/01/15(土) 00:52:56.35ID:ALzAiADU
VBAって、サポート切れてんの?

企業とかこれから、多数のツールどうすんだろうね。
2022/01/15(土) 07:46:29.84ID:8MS0rOI1
サポート気にするような部署でvbaを採用するだろうか?
2022/01/17(月) 00:16:00.31ID:oS3b1eNW
VBAって単独の製品じゃないんだが
そもそもVBAがサポート切れってどこの情報だ?
2022/01/17(月) 12:28:46.14ID:t8m0YBBL
OneDriveにコードをバックアップして直接開いたところ

http://imgur.com/qO7I0AB.jpg

こういった線が付きました
Office2016 Proなのですが設定等でVBエディターでも表示できますでしょうか
またお恥ずかしながらこの線の一般的な名称も教えて頂けませんでしょうか
2022/01/17(月) 17:44:28.15ID:hBkYcVxQ
>>461
何で開いたのかは知らんけど、AccessとかのVBAエディタには、そういった今どきの便利な機能は無いかと
一般名称かどうかはしらんけど、VSCodeとかの設定では Indent Guide でひっかかるんじゃないかな
2022/01/17(月) 20:02:01.14ID:r2vXEkpI
>>462
ありがとうございます
名称のほうぐぐってみまして、確かにVS関連の情報が多く出てきました
大変便利ゆえに残念です!
2022/01/31(月) 11:21:11.42ID:ZCY1so+a
Microsoft 365 Access Runtime ダウンロードリンクが動作してないのですが
ダウンロードできた方おられます??
2022/01/31(月) 11:29:43.23ID:Di33df7w
>>464
見てみたけど、ダメだねぇ
2022/02/22(火) 22:36:04.61ID:h8gQU92u
アクセス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のから操作するとうまくいきません.解決策はないでしょうか?
2022/02/22(火) 22:38:16.30ID:h8gQU92u
間違えました。
GetOpenFilenameが開くフォルダーをGetOpenFilenameに→
GetOpenFilenameが開くフォルダーをc:\x\yに
2022/02/23(水) 09:19:56.78ID:yBLUqW/Q
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
2022/02/23(水) 10:16:59.77ID:/GeE/zJY
>>468
GetOpenFilenameでダイアログが立ち上がったときのフォルダーをc:\x\yにしたいという意味です。
2022/02/23(水) 14:00:43.13ID:3ksW4w1X
FileDialogを使う
2022/02/23(水) 15:58:28.79ID:noR6ud0U
https://officevba.info/filedialog/ こっちスかね
メリットもデメリットも書いてあって親切
2022/02/23(水) 16:48:55.01ID:/GeE/zJY
>>470
ありがとうございました.
FileDialogだとカレントフォルダーで開いてくれました.
2022/02/23(水) 16:53:30.10ID:/GeE/zJY
>>472
ありがとうございます。この説明はとても親切ですね。よくわかりました
2022/02/24(木) 15:49:02.02ID:G5PhgONP
>>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
デフォルト何だっけな
2022/02/28(月) 11:00:59.24ID:JmI4xSUc
初歩的な質問でお恥ずかしいのですが教えて下さい
面倒な計算や処理をして値を返す関数Aがあった場合

その戻り値を判定したい場合

If A = 1 or A = 2 then

と記述するとaccessは 2回処理することになるのでしょうか

それでしたら仮に変数(V)を用意して、一旦
V = A

のように格納してから
If V = 1 or V = 2 then

と記述したほうが処理的には一回で済むという解釈になりますでしょうか
すみませんがご教示頂けたらと思います
2022/02/28(月) 11:49:10.60ID:JmI4xSUc
すみません、試してわかりました。
後者は一回で済みました。

質問することでその後すぐ簡単な確認方法を思いつくことがよくあります
お恥ずかしい。スレ汚し失礼しました;
2022/02/28(月) 12:38:27.12ID:jOzz1fM6
どんまい 気付きや学びに成りゃ無駄じゃ無い
2022/02/28(月) 12:41:50.52ID:frLBMESq
ちょっと違う話だけど、VBAにもOrElseやAndAlsoが欲しいなと思うときはある
2022/03/06(日) 15:10:37.27ID:R+n9Kzax
SQLの勉強をさいきんはじめました

動的SQLによる数独の超高速解法
というのを読みました

動的にSQLを生成するため
・一つはJDBCを使う方法
・もう一つはストアド・プロシージャを用いた方法
云々って書いてあります

これらって、アクセスのSQLでもできそうなものでしょうか?
(過去に話題として出てたらごめんなさい)
できそうならやってみようかと
茨の道ならあきらめます
2022/03/06(日) 16:34:17.90ID:TgGQVPNx
2つとも分からんけど、VBAが使える環境なら動的SQLは可能なはず
481479
垢版 |
2022/03/06(日) 17:10:27.06ID:R+n9Kzax
SQLとは、使用人から経営者になることだ
今まで自分で作業してたのをしなくてよくなる
使用人に、「こういうのを出してくれ」と
言うだけでよい

数独についてであれば、今まで
総当りするプログラムとか
条件判定とかを自分で考えていたが
SQLならそうしたものは自分で考えなくてよい
勝手に総当りして勝手に判定してくれる

・・・ということが書いてありました
これって、既存のプログラムの要件を
SQLで表現できれば中身は考えなくてよい
ってことですよね けっこうおもしろいかも
2022/03/07(月) 07:14:29.39ID:xVPINsIe
経営しなくてもお金が稼げるSQLがどこかに書いてあると良いのに。
2022/03/07(月) 12:53:13.63ID:+OeG3Wfd
>>479
JDBC Driver で Access MDB に接続できる

つまりワカラン
2022/03/07(月) 13:11:37.42ID:3lxJ/2QX
これかな?
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で補ったりする必要はあると思う
2022/03/07(月) 14:07:14.74ID:tjPYNfUL
各DBで使えるSQL構文一覧表
(ROLLUPは jet使えない oracleはokとか)
のページが昔あったのに
今見たら見あたらなかったわ
2022/03/08(火) 06:28:34.40ID:fGzXxwFZ
総あたりする場合、SQLはどうやって
候補を管理してるんだろ?
ふつうにメモリ上に持ってたら
メモリが足りないような
2022/03/08(火) 20:13:50.94ID:fGzXxwFZ
数字の書かれたパネルがあります
このパネルのマスをいくつか
ぬりつぶし、残った数字の積が、
たて・横のどの列も12になるように
してください

2523
6257
5262
2334

これぐらいの規模の問題で
練習したほうがいいかも
ぬりつぶしは1に置き換える
2022/03/09(水) 11:17:27.88ID:wDARNtYc
動的SQLっていうから

DBエンジンにSQL投げる

その結果を受けて自分を書き換えて
再度新しいSQL投げる

望む結果になるまで繰り返す

みたいな話を期待したら
拍子抜けだった
2022/03/10(木) 18:36:45.22ID:y/Xk/sN2
>>487
SELECT 解答
FROM すべてのあり得る盤面
WHERE 今回の条件
だから
まず盤面を1行にして
2523625752622334
と表す

すべてのあり得る盤面は
2523625752622334
2523625752622331
2523625752622314
2523625752622311
 〜
1111111111111111
だけどこれをどうSQL文の中で
表現すればいいのかわからん
2022/03/11(金) 12:30:05.01ID:+z9vFN5I
>>489
>>484の記事を1から読んでこい
2022/05/01(日) 00:28:53.70ID:uZ+uV6s8
VBAのコード内の文字を置換するプログラムをVBAで行うことはできるでしょうか?
置換の組合せが複数あるので一つずつCtrl+Hで操作すると間違いそうなので,
置換前文字列と置換後文字列の配列を書いて,それを順に実行するようにしたいのです.

自分のコード内に当該置換文字列をがでてくるので,その回避も考えないといけないですが

よろしくお願いします
492デフォルトの名無しさん
垢版 |
2022/05/01(日) 07:29:11.23ID:1HGTgNe1
>>491
できるよ
493デフォルトの名無しさん
垢版 |
2022/05/01(日) 07:36:23.30ID:1HGTgNe1
ごめん、AccessVBAスレだった
知らん
2022/05/01(日) 16:14:10.55ID:4P2yloMu
ACCESSにもApplication.VBEがあるっぽいから、エクセルとかと同じようにできるんじゃね
そもそもコード内をそうそう置換するって状況がよくわからんがな
2022/05/01(日) 20:13:11.92ID:uZ+uV6s8
>>494
オブジェクト名を修正すると,名前の自動修正機能で,オブジェクト間の整合性は保たれます.
例えば,Aクエリー内でBテーブルを使用していて,Bの名前をCに変更するとA内のBテーブル名もCに自動的に修正されます.
ところが,コード内でオブジェクト名を引数に使用している場合(DoCmd.OpenQuery()やQeryDef()など)は,自動的に修正されないので
コード内の文字置換で修正するしかありません.
オブジェクト名をより統一的にしたいとか,あるルールで短くしたいなどの事情です.

でも本当にコードを使ってコード内の文字置換できますか?
「エクセルとかと同じようにできる」とのことですが,エクセルのVBAでできる方法を知りません.
496デフォルトの名無しさん
垢版 |
2022/05/01(日) 20:33:27.28ID:XyObubkl
>>494がApplication.VBEってヒント出してくれてるのに自分で調べる気は無いの?
2022/05/01(日) 20:51:07.35ID:uZ+uV6s8
>>496
いままでApplication.VBEとVBAの違いをしりませんでした.
Application.VBEで検索して,オブジェクトであることをしりました.
できそうな気がしてきました.
調べます
498デフォルトの名無しさん
垢版 |
2022/05/01(日) 21:27:48.04ID:q0kLnjNb
>>497
お前みたいな馬鹿は、方法自体間違えていると思うよ
2022/05/01(日) 22:36:20.05ID:uZ+uV6s8
>>498
正しい方法言ってみな。
言えなきゃ超バカ決定。
500デフォルトの名無しさん
垢版 |
2022/05/01(日) 23:10:31.48ID:q0kLnjNb
やっぱり馬鹿だったか
馬鹿に馬鹿と指摘すると怒りだす
2022/05/03(火) 18:13:45.75ID:hABwtxOZ
>>494>>496
497ですが、
Application.VBE.ActiveVBProject.VBComponents(i).codemodule.ReplaceLine(j,"修正後コード文字列")
を使ってできました。
2022/05/03(火) 21:57:49.43ID:uVFGqhpy
>>501
ありがとう。勉強になります。
2022/05/03(火) 23:56:04.39ID:9Zz7qGMa
コードとデータは分離しなさーい!
2022/05/04(水) 01:12:27.06ID:L2QcoKdh
>>503
オブジェクト名はデータにできない
2022/05/04(水) 01:29:47.87ID:T57Ht3+D
名前は文字列だろ!
VBAの提供するオブジェクトは大抵コレクションで管理されているだろ!
お前の作ったオブジェクトも管理できるようにしろ!
初歩だぞ初歩!
2022/05/04(水) 01:39:45.29ID:L2QcoKdh
つまらん
もういいよ
507デフォルトの名無しさん
垢版 |
2022/05/04(水) 03:22:14.79ID:bSJdUNny
やっぱり馬鹿だった
2022/05/04(水) 08:25:20.61ID:L2QcoKdh
>>507
人のこと馬鹿、馬鹿ってほんとにうるさい奴だな

今回のアプリは俺しか使わずオブジェクト名変更も今回限りが確定しているんで、
オブジェクト名をデータ化できるCreateQueryDefなどを使う手間を省いてクエリデザイナーを使っているだけ。

そういう事情も含めて「もういいよ」と書いたんだけど、読み取れんわな。

お前は実生活で他人の事情を汲み取る力が弱くて他人から避けられてるだろう。
実生活では流石に馬鹿と面罵しないとは思うが態度にはでてると思うよ。

エクセルVBAのようにワッチョイ付きならNG登録するんだが。
2022/05/04(水) 12:11:33.62ID:T57Ht3+D
何人登録するつもり?
2022/05/06(金) 14:43:39.68ID:HOAU3QSN
>>508
もういいから馬鹿は黙ってろ
511デフォルトの名無しさん
垢版 |
2022/05/11(水) 09:14:31.47ID:+mNN1hZ/
ここはBKのあつまりでつか?
51244
垢版 |
2022/06/18(土) 22:47:23.35ID:yLkug1TW
味噌も糞もいるのがこういう掲示板の特徴
それが面白ければ来るし退屈なら来ない
文句言うのはカッコ悪い
513デフォルトの名無しさん
垢版 |
2022/06/19(日) 06:53:58.66ID:R9q2ZnJn
>>512
こういうのかっこ悪い
51444
垢版 |
2022/06/19(日) 07:49:57.69ID:ZfwUc+SV
>>513
いやいや本当のイケメンだろうな
2022/06/21(火) 16:34:11.41ID:q4pJaYn5
test
2022/06/21(火) 16:34:30.21ID:q4pJaYn5
アプリケーションタイトルについて質問です。
今使ってるmdbのタイトルが2種類あって、「Access」のものと「ファイル名:データベース-フルパス-Access」のものがあります。

全部後者のタイトルにしたいのですが、設定の仕方がわかりません。
ヤフー知恵袋の「Accessのタイトルバーにファイル名を表示させることはできますか。
Excelでは表示されるのですがAccessでは”Access”としか表示されず少し不便なので、、」
を読むと何の設定もしなくても後者のようになると書いている人がいます。
どうしたらそうなるのでしょうか?

後者のやつは別にAppTitleとかで設定していませんので不思議です。
517516
垢版 |
2022/06/21(火) 17:34:19.49ID:q4pJaYn5
解決しました。
518デフォルトの名無しさん
垢版 |
2022/06/21(火) 19:20:51.51ID:EkCiEQiW
>>517
どうやって?
知りたい
519516
垢版 |
2022/06/21(火) 19:44:50.71ID:q4pJaYn5
>>518
いろいろ試したけど、結論は超簡単。
ファイル→オプション→現在のデータバース→アプリケーションオプション→ドキュメントウィンドオプション→タブ付ドキュメントをon

これでファイル名とパス名が表示されて複数のmdbを起動しても混乱しなくなりました。
520デフォルトの名無しさん
垢版 |
2022/06/21(火) 20:23:15.71ID:QtwFSmmg
OS:win10
Ver:365 16.0

フォルダの中に複数のExcelファイルがあります
accessで全てのエクセルの同一セルの文字をテーブルにまとめたいのです
Accecc vba エクセルの特定のセル
などで検索してみましたが解決に至っていません
どうかお力添えお願いします
レスを投稿する

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

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