Access VBA 質問スレ Part1
■ このスレッドは過去ログ倉庫に格納されています
AccessのVBAに関する質問スレです ★1 質問テンプレ(雛形)は用意しませんが、OSとAccessのバージョンは必ず書きましょう。 ★2 AccessのVBA以外の部分に関する質問はNGです。 但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。 ★3 AccessのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。 VBAとは、『Visual Basic for Application』の略で Application ├Workbooks |└Workbook | ├Worksheets | |└Worksheet というApplication以下のオブジェクトを、VB言語で操作するものを指します。 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。 ★4 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、 コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。 ★5 わからなければとりあえず「マクロの記録」(Alt, T, M, R) 関連スレ Excel VBA 質問スレ Part23 http://toro.2ch.net/test/read.cgi/tech/1327763113/l50 すごい基本的な質問ですみません accessのSQLの言語って何ですかね MYSQLとかですか SQLが言語だよ すとらくちゃーどくえりーらんげーじ だったかな 質問の意味も意図もよくわからんね。 access以外のシステムからSQL文をコピペしたいってことなのか!? >>750 MYSQLもSQL。 仕様があって、それに沿って各社実装してる。 が、独自部分も多いから同じSQLだからといって何処でも動くとは言えない。 >>753 SQL言語もポスグレだったりPLSQLだったりあるじゃないですかそれで言うと何になるのか聞きたいんですけど 勘違いしてたらすみません SQLとMYSQLの関係ってCとC♯の関係ですか >>752 コピペでそんなこと気にする必要ありませんよね 気になったから質問したまでです SQLとMYSQLの関係は他人のSQLと自分のSQLの関係です 昔、金井克子という人が歌ってました SQLというのはそれが言語 (たまにSQL言語以外の事をSQLと言っている場合もある) ポスグレやMYSQLやACCESSはそのSQL言語を使う環境(の一部) 環境によりSQLに多少の差はある ポスグレはSQL言語じゃない PL/SQLはSQLを拡張した言語 ACCESSならSQLを超える範囲の言語はVBA >>758 よくわかりました、ありがとうございます >>756 他のSQLの構文をそのままコピペしてAccessで使うのは うまくいかないこともある ことを気遣ってくれたんじゃね? そんな言い捨てるようなレスはいけないと思いますよ >>761 素直な態度の人は成長するらしいですね。 良い事良い事。 変数の宣言を強制するにチェック入れたのに Option Explicit が出てこないのですが どうしたら出て来ますか? 既存のコードには入らないよ 新規で作成するオブジェクトには入る Accessの神々よ、御教えを! Accessでは、CHECK 句が使えないようですが、 カラム数が多いため、 いちいちプロパティから入力規則を設定するのは骨が折れます。 SQL で一括設定する方法をご伝授くださいませ〜 えー、クエリ作ってからSQL表示してコピペ。 そんな事聞いてないよね。 win7x64-office2016x86環境下のみで再現するらしい xls出力からコペピ張り付け罫線操作等々やってる処理で張り付したシートがズレル不具合発生 ネット調べても一切情報でてこなくて期待込めてofficeアプデしたら実行時エラー1401 空白でないセルが云々カンヌん泣きたい 自己レス office365BPの2016でのみ再現 別シートの複数列コピー選択状態でAAセレクトインサートやろうとするとコピーペになる セレクト前に空白セル1コピーで回避 クエリを実行したときに全件レコードを取得できてないのに検索結果画面が開くときってない? ▷|←このボタン押すと検索結果の件数が出てくるんだけど、押してから出るまでに時間がかかるってことは全件レコード取得できてないってことだよね >>774 いや、クエリのSQLをorderby句を書かなかったとき、全件検索する前に検索結果画面が開く @orderby書いてクエリを実行する→1/2500みたいに結果件数がでる Aorderby書かないでクエリを実行する→1 結果件数が上記と違いでない ▷|このボタンおすと上記と同じように1/2500となる @の実行時間10秒 Aの実行時間1秒 ただし▷|ボタン押すと10秒くらいかかる なんかオプションに無かったかな。最初の表示するぶんだけ読み込んでとりあえず見せておいて裏で続きを読むって機能をオンに、みたいな。 会社テーブル id 会社名 ・・・ 1. A社 2. B社 3. C社 4. B社 職員テーブル name 会社id ・・・ 山田. 1 鈴木. 1 飯田. 2 野口. 3 岡本. 4 一対多のリレーションがありまして 会社マスターにダブり登録されている場合(この場合B社) 楽に修正する方法はないでしょうか 250社くらいダブリやトリプルしていて困っております 名寄せマスター 名寄せID 会社ID 新会社ID 1 2 2 1 4 2 名寄せマスターと職員テーブルをJOINしてUPDATE というのはどうですか? その会社マスターがおかしいのを放置するのか修正するのかで違ってくるよね >>781 なるほど 重複クエリに各会社の最小IDを連結して名寄せテーブルを作成し JOINしてUPDATEしました 名寄せテーブルを作成しないでクエリだけでUPDATEまでもっていくのは この場合駄目なんですね はじめ理解できず悩みました >>784 JOINしたAccessのデータをExcelに吐き出し各職場に配布、各々で修正追加。 一年以上たって回収しAccessに貼り付けられて今の状態です。 正確には職員テーブルじゃなくて顧客テーブルですね なあんだ、Excelの段階で調整しちゃえば余計な苦労しなくて済んだのに 初心者なんで教えて欲しいんだけど、フォームの次へボタン押した時に次のレコードが 表示されないのだがどうしたらいいか教えて欲しい。バージョンは2013 Private Sub Form_Load() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb() Set rs = db.OpenRecordset("名簿テーブル",dbOpenTable) Me!名前テキスト = rs!名前 Me!カナテキスト = rs!よみがな End Sub Private Sub 次へボタン_Click() DoCmd.GoToRecord , , acNext End Sub フォームのソースが名簿テーブルならフォーム読み込み時の名前とよみがなセットするコードは無くても先頭レコードが表示される。 フォームのソースを確認しましょう。 非連結フォームならボタン押した時に次のレコードを読み込んで名前とよみがなセットするコードが必要だけど、キーが不明なので何ともアドバイスできません。 長々と書いたがわかりにくいね、すまん。 神さま教えてください。 ADODB.Commandでのインサートが失敗しても エラーが出ないのですが、エラーハンドリングの 方法を教えてください。 よろしくお願いします。 むしろonerrorしかないと思うが、他にやり方あんの? レスありがとうございます。 ON ERROR は当然やってまして その上での質問です。 失敗ってなんだ。 戻り値を取ればAffectedRowsになってるだろうから それで判断するか追加されたはずの行数をあらためSELECTするとか >>786 そのコードはFormがLoadされた時に名簿テーブルを開いてRecordsetに格納し、名前とカナをテキストボックスに入れるというものと次へボタンを押した時にFormがLoadされた時の処理とは全く関係なく次のレコ−ドに移動するもの。 ところで次へボタンでの次のレコ−ドってのは何のデ−タなんだい? 改めて言うけどFormがLoadされた時の処理なんて知らないからとAccess君は言っている。 要は、DoCmd.GotoRecordってのはデータとオブジェクトが連結されていることが想定されていて、連結されているから既にオブジェクトにレコードが表示されているわけだが、それに対して次のレコ−ドと言ってる。 一方、FormのLoad時の処理は連結関係無くデ−タを自ら取ってくるもの。 こちらのやり方を取るならRecordsetをPublic変数にするかForm内でのPrivate変数として保持しておき、他のイベント(次へボタンクリックのような)で使いまわすというやり方になる。 整数型、重複なしの列を書き換えるときはどうしてますか?たとえば、 2 1 3 → 2 1 3 にしたいときに2→1の時点でエラーが出ると思うので回避策を検討しています。 一時的に重複なしを解除して、終了時点で重複なしへ戻す方法や、一旦一時的に重複しない数字に書き換えて、それから再度書き換えるべきか悩んでいます。 なにか一般的な方法はございますか? あれ、スペースがおかしくなっている。 列を書き直すときにたとえば 2→1 3→2 1→3 としたいのです。具体的にはidを振り直す作業です。 レンジのソートでよくね? もしくはフィルタ付けて並び替えてからフィルタ解除とか idには触らないで、整数型のフィールドを追加します。そのフィールドでやりたい放題やります。 どうしてもやりたけりゃ、swapしていきゃいいんじゃないの? 最初は2→1にしたいから、 1 3 2に。 次は3を2にして 1 2 3 に。 入れ替え自体は、UPDATE xxx SET unique = CASE WNEN unique=1 THEN 2 WHEN unique=2 THEN 1 ELSE unique END でCASEで書いちゃえば入れ替えられる。 1クエリ内で完結したら、制約はかからない。 >>797 済みません。AccessにもRangeというのがあるのですか?あと、フィルターの使い方も御教示をお願い致します。 >>798 それが、当該idを参照しているテーブルが20個以上あるので、別のコラムという訳にはいかないのです。 参照先を変更するとなるとクエリやらVBAのコードやらを書き換えないといけないので大変だと思います。 >>799 バブルソートみたいなものですね。レコード数が3万ありますので、何となく時間がかかりそうな気がしますが、試してみます。 今はソート後にDMax+iのループで重複しないidへ書き換えて、書き換えが終わってからDMaxを引くという2段階の作業をしています。 (参照元のidも2段階の書き換えをしています。)) 我ながらドン臭いやり方だと思うので、もう少しスマートな方法があれば御教示をお願いいたします。 その列自体を書き換えちゃうの? じゃあ、今入ってる値は必要無いってこと? だったら削除して連番振り直したら? >>801 idだから主キーです。Nullは不可だと思います。 >>800 もう組み合わせがわかってて、ほんとに単発で1回きりなら、 エクセルで対比表作って、CASEの列とWHENの列足してコピペでクエリ作っても良いけど、全く健全な保守ではない。 2 1 3 2 1 3 に列追加してオートフィルで WHEN unique= 2 then 1 WHEN unique= 3 then 2 WHEN unique= 1 then 3 ってして、 unique= CASE と ELSE UNIQUE endで挟んで、コピペでテキストエディタに貼り付けて、テキストエディタからコピペでAccessに貼り付けるやつ。 しょっちゅうやるならテーブル見直そう。 >>803 方法はいくらでもあると思うけど。 Field追加して連番を振って、追加したFieldを主キーに変更して元の主キーのFieldを削除するとか。 試してないからできるか分からんけど。 そんなことせずに振りなおすならOrderByでId順にして小さい値から振りなおしたら? ただ、主キーを振りなおす意味が分からない。 そういうもんじゃ無いと思うし、テーブルの連結によっては滅茶苦茶になるのは分かってるよね。 主キー振り直すのは、やむを得ずやるのはそのアプリのライフタイムに何発かあると思う。 業務系だと、「スキーマ変えるな」「デカいトランザクションはるな」「一時テーブルすら作るな」とか無茶苦茶言いよることもある。 でも、しょっちゅうやるならホントに設計考えたほうが良い。 >>805 >>そんなことせずに振りなおすならOrderByでId順にして小さい値から振りなおしたら? そんなことが出来るのですか?DAOもADOも1行ずつしかupdate出来ないから、重複データーが発生してしまって出来ないのですが… >>806 ワークテーブルまで含めて数えなおしたら、35個のテーブルで件のidを使用していました。なので35個のテーブルに対して変更を行わないといけませんね。 >>808 それで解決するなら簡単ですね。やってみたいですね。 元の列の属性がすべて引き継がれるならいいですね。試してみます。 主キーの役割はレコードをユニークにすることだろ 並べ替えが必要ならそのための項目を別に用意するわ 作業量を問題にしてるけど 無茶な運用は後に響くよ 分かり易さを優先すべきだと思うわ 主キーを解除して、重複可にして連番を書き込みました。その後に元に戻しました。変更前後の番号を配列に書き込んでおいて、その配列の値から関連するテーブル全部において置換作業を行うことにしました。 idが2万5000レコード、関連するテーブルのレコードが全部で100万近いのですが、2万5000の置換を100万レコードに対して行うので時間がかかりそうな気がしています。どのくらい時間がかかるのか計算する方法がありますかね? 主キーの削除をVBAでやろうとしているんだけど、メソッドが見つからない。SQLでやるしかないのかな? 下を読むとdeleteメソッドはダメみたいだし。 https://msdn.microsoft.com/ja-jp/library/office/ff197351.aspx >>Deleteメソッドは、インデックスオブジェクトが新しいと、データベースに追加されていない場合にのみサポートします。 無理矢理面倒臭い事をしているようにしか思えない まぁ人の話を聞く気が無いみたいだし 好きに調べてやればええよ SQLであっさり出来たわ。後は置換をどうするかだな。関連するテーブル全部を置換できればすべて解決するけど、何を使うかだな。 SQLは遅いんだっけ?レコードセットでループ回す方が速いと読んだ気がする。 >>816 普通に考えればSQLの方が速いに決まってると思ってたが。 遅いとしたらその文書いた奴が悪いという印象。 ま、DB系については大したレベルにないから俺が間違ってるかも。 業務用ソフトのテーブルを眺めていたら、テキスト型のフィールドがあって、256桁の数字が羅列してあった 様々な設定を指定された桁に格納しているようですが、このようなデーター保存方法は一般的なんでしょうか? 他の言語でもあるのでしょうか? >>818 あるんじゃないの?としか。どんなテーブルとか、フィールドの名前とか、なんかヒントはないですか? 様々な設定も謎が深まるだけですね。 たとえばあるフォームAのオプションボタンの値を98桁に書き込む、フォームBのチェックボックスの値は例えばCstr(Abs(True)))でstringへ変換して105桁に書き込むとかそんな感じです。 合理的な気もするのですが、こういう方法は検索しても見つからないので一般的なのか、特殊なアイデアなのか知りたくなりまして。 すくなくともRDBを使う上ではやるなって言われてるやり方 固定長ファイルにデータ保存してるようなシステムなら結構あったけどね >>821 そうなんですか。面白そうな話しなので調べてみようと思います。その手法はどういう名称なんですか?もしくは検索ワードを御教示頂けましたら幸いです。 RPG区分列とかじゃないの?古い呼び方だけど。 酷すぎてだれも触りたくないやつ。 RDBに移すような事があったら、末期には照合順序をbinaryにするしか無くなったりすごく苦しむから辞めた方がいい。 メリットらしいメリット無い。LIKEで雑に'[A-C]__1_2'みたいにSELECTできることぐらい。 残念ながら、ググっても何もヒットしません。 なにかヒントをお願い出来ますか? RPGとRDBで検索したら関係ありそうなのがいくつかヒットしたけど。 検索能力は俺の方が上みたいだな。 固定長ファイルでぐぐったら、先頭に固定長データファイルとはっていうサイトがでたけど なにでどうググったんだか 皆様、御指導、御鞭撻ありがとうございます。 COBOLでよく使う手法だったんですね。 件のmdbはコボラーが設計したんですかね。 そうなんですか。accessの本には全く載っていないでのすが、RDBMSの世界ではごく一般的な手法なんですか 言語の問題ではない しかしRDBMSではやってはいけない よくわからないけど昔のデーターベースの本を読んでみますわ 暇つぶしにちょうどいいわ 自分たちが使うデータをどういった構造で保持するかは各自で考えて構わない ただRDBに入れるのであれば、やってはいけなくもないけど、おすすめはしない、という話では? RDBならテーブル・フィールド分けてデータもコードも見やすくできるのに、そうしないのはもったいないというかなんというか データベースの列が増やせない何かがあった。 開発者の気まぐれ。手抜き。 従来の固定長ファイルと1:1の情報を保持したかった。 とかね。。。 こっちの業界じゃ拡張DM形式なんて固定長ファイルが普通にやり取りされてて、桁数制限とかが厳しいけど、容量の割に情報量が多いし古いソフトの互換性があるとかで100年以上生きると思うわ。 でも固定長ファイルの文字列をmdbに格納するのは正気とは思えない。データベースのメリット全部殺してるじゃん 郵便とのやり取りは今でも固定長フィールド使てんじゃね さすがに今はないか、フロッピーとか 未だに固定長を扱う事はありますが、設計済みDBに展開して処理していますよ 固定長のEDI、増えたりしないだろうけどいつまでも残るんだろなあ。csvやtsvをメール添付で良いのにって思う。 固定長の方がパースが軽いからなぁ あといつまでもなくならないレガシな環境とかな 処理系そのものは変更されてもIO部分の仕様変更はなかなかやらない 今どき固定長レコードなんて使ってるのに前向きな理由なんて無いよ >>839 同じ拡張子なのに何十種類もバリエーションのある欠陥フォーマットを使うのはやめてくれ アクセス始めて触る初心者です。 テキストボックスが複数含まれたワードファイルが5000個ぐらいあります 各テキストボックスからいろんな項目を取得するとして、1ファイルあたり30項目ぐらい つまり5000個のファイル*30項目=15,000項目 これをアクセスで処理していこうと思ってるんですが、アクセスはこの程度さくさく処理できるものでしょうか 目的は、ワードファイルが多すぎて邪魔なんで全部削除したい。必要に応じて元のファイルと同じものを再現できるようにするため、必要な情報をアクセスのデータベースに保存しておくことです 必要なファイルを再現できるように検索機能と再現機能をもったVBAマクロを組むつもりです 最初エクセルでやろうとも思ったのですが、さすがに万単位で今後も増える可能性が高いため アクセスかな?と思ったのですが、どうでしょう >>843 初めて触る様な状態なら無理だから、諦めた方がいいですよ >>844 アクセスは初めてだけどエクセルVBAはそこそこ経験あります エクセルVBAでなら自分で組める範疇ですね すでにアクセスで途中までマクロは組んであります 同一フォルダ内にテスト用に作成してあるワードファイルを順次開いてすべてのテキストボックスの値、位置関連の数値を Debug.Printで出力後、ワードファイルを閉じる ここまでうまくいってるんであとはアクセスの基本機能理解すればそう困難ではないでしょう ざっとみたところ、この用途で使う限りではそう複雑なものでもないようですし。 質問の内容はアクセスでやる利益があるかどうかという点ですね まぁ組めばわかるんですけどね >>845 エクセルのテーブルに格納したらアクセスにインポートするのが良いんじゃない? エクセルのままでも良いと思うけど、 貴乃花親方にしろ有賀さつきにしろ やはり「語らない」ことが年末から今年にかけてのポイントだな 逆に語っている方が何かと物議を醸しているし ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる