Access VBA 質問スレ Part2
Access の VBA に関する質問スレです 質問テンプレ(雛形)は用意しませんが、OSとAccessのバージョンぐらいは必ず書きましょう 前回のスレッド Access VBA 質問スレ Part1 https://mevius.5ch.net/test/read.cgi/tech/1328536426/ もはや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ってのでクラスモジュールの有り難みを知りました クラス使わないと同じようなコードが量産されて面倒くさすぎる read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる