Access VBA 質問スレ Part1
レス数が900を超えています。1000を超えると表示できなくなるよ。
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
言語の問題ではない
しかし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
エクセルのテーブルに格納したらアクセスにインポートするのが良いんじゃない?
エクセルのままでも良いと思うけど、 貴乃花親方にしろ有賀さつきにしろ
やはり「語らない」ことが年末から今年にかけてのポイントだな
逆に語っている方が何かと物議を醸しているし すみません質問させてください。
Private Sub Form_Load()
Me.TimerInterval = 1000
End Sub
Sub Form_Timer()
Static intShowPicture As Integer
If intShowPicture Then
Me.btnPicture.Picture = "C:\taiyo.jpg"
Else
Me!btnPicture.Picture = ""
End If
intShowPicture = Not intShowPicture
End Sub
このコードは何をしているのでしょうか?
ご回答よろしくお願いします。 ご回答ありがとう御座います。
イメージはなんとなく掴めたのですが、
この場合のintShowPictureには何が格納されているのでしょうか?
もしくはBoolean型なのでしょうか? Static intShowPicture As Boolean
にして試してみろよ VBAには暗黙の変換ってのがあるから
IntegerをBooleanに暗黙的に変換して評価してる
まあ、あまり良いコードじゃないな >>852さん
試しに、フォームと画像を用意して作ったら、点滅しました!
>>854さん
この文でも点滅しました!
>>855さん
Falseが0でTrueが-1なのですね!
ご回答ありがとうございました。
解決しました! >Falseが0でTrueが-1なのですね!
そうだっけ? Access で画像を点滅する?
そんなの普通は、JavaScript, jQuery とかだろ 10万件以上の大量レコードを追加するインサート処理をクエリを作成してDocmd.OpenQueryでやっているが時間が1分以上かかる
この処理をモジュールにADO、もしくはDAOでインサート処理を記述したら、Docmd.OpenQueryより早くなるかな? VBAで書くと数倍遅くなるんじゃね?
Cからなら速いかも知れん BULK INSERT は?
そもそも、INSERT文は速くならない! 10万が大量かどうかという問題も有るがRecordset + AddNewの方が速いと聞いたし、実際俺が組んだ場合も明らかに早いんだが。
状況にもよるかもしれんけど。 そもそもOpenQueryでどんなクエリ流してインサートしてるかわからんのに比較にならんわ >>865
例えば単純な追加クエリや、INSERT SELECTするSQL発行するより
1件ずつAddNewして(どこかから値持ってきて)1カラムずつ値セットするほうが早いっての?
どこで聞いた話だそれ? やってみてから言ってくれ。
俺の場合は実際早かった。
俺の場合は1カラムずつじゃなくてフィ―ルド名の配列と値の配列でAddNewだけど、たぶん1カラムずつセットしてUpdateでも早いんじゃないかな。 SQLでもINSERT一回じゃなくて1行のINSERTを何度も繰り返したら遅くなるからな
それと比べるなよ >>868
やってみるから、フィールド数、フィールド長とレコード数教えれ
あと配列のデータどう用意するのかと、比較するクエリの元データどうすのかも
とうぜんACCESSと対象DBエンジンとADOかDAOのバージョンも明示してくれよ
で、ループまわして1レコードずつ.AddNewして.Updateするんだな
これでほんとにVBAが速いならちょっとACCESS使うの考えるわ >>870
そんな低レベルの話はしとらん。
>>871
たぶんフィールドは40~50ぐらいじゃね?
レコードは200万ぐらい。
リモートでOracleに接続してる。
JOINで20個位のテーブル繋げてるな。
ADO使ってる。
パススルーのSELECTクエリ+INSERTじゃ永遠に終わらない感じが20分程度で取得出来るようになった。
「access insert addnew 速度」でクグってみればけっこうAddNewの方が早い話が見つかるぞ。 だからどこからどうやって元データ取ってきてるんだと
リンクテーブルやリモートDBでADOの方が早いとかなら別に驚くに値せんけどな
というかお前らOpenQueryってレコード数分実行する前提で話してたのか? パススルーωとか使っちゃいけないTOP3じゃないか
素直にリンクテーブルにすれば良いのに パススルーって駄目なの?
リンクテーブルは話にならないくらい遅くてパススルーのが全然早かったんだが。 ケースバイケース
たいていの場合、リンクテーブルに対する操作よりはSQL飛ばすほうが早いとは思うけどな
パススルーが使っちゃいけないTOP3とか初めて聞いたわ keydownイベントからのキー取得ではなくて、
OnKeyDownイベントからキーを取得する方法がわかりません。
Me("テキストボックス"& i).OnKeyDown = "=get_Key(" & this? & ")"
ご教授お願いします。 >>877
OnKeyDownイベントを知らなくてすまん。 Excel で JavaScript も扱える様になるらしいね 業務用mdbのコードを見てて気づいたんだけど、戻り値を使わないのに、functionを作成しているのが非常に多い。
どんなメリット、デメリットがあるのですか?戻り値用の変数を用意するから速度が低下するのが問題なんですか?
英語の本には
>>Many programmers think that they must return something, even if they have to make some artificial return code or status. This practice can make your code harder for others to understand.
て書いてあってヤメレって書いてあるのになんでやりまくるのですかね? >>881
しまった戻り値無いfunction俺も作ってた
動くから別にいいやって感じだった 業務でプログラム組むような場合は、コーディングスタイルが指定されてる事が多いんだよ
正確には戻り値のないFunctiionじゃなくて、戻り値を無視してるだけだけどな functionとsubはcallが要るかどうかの違いだと思ってた。 可読性が低下する以外のデメリットは無いんでしょうかね?
個人的には出番のない変数は目障りなんですけどね。 呼び出しネストの限界がFunctionのほうが浅いってデメリットがあるはず
呼び出しに必要なスタック領域が違うから
昔だれかが実測してたな。まあ再帰でよっぽどのことやらんと問題ないんじゃね
SubをFunctionにして可読性が落ちるとか、それ関数の命名に問題がある気がするがな 戻り値ある前提で組んでるんでしょ。
エラー処理等で単に関数が失敗か成功かを返すとか。
後で作ろうとしてたけどグダグダになって無しになっちゃうとか。 後でやろうとしてやめちゃうってのは非常に大変頻繁によくあることだからね。 >>881
呼び出し側でいちいち call 書くの面倒だから >>890
FunctionもSubもCallを書かなくても呼び出せすので、理由にならないと思います。
個人的には、Callが書いてないと唐突に見慣れない文が出現するので驚いちゃいます。馴れれば、労力の軽減になるのかな? call 書かないと () 付かないだろ
() 付かないから知らない文が出て来たと思ってしまう
() 付ければ関数だと判るが call 書かないといけないって話 >>892
済みません。よくわかりませんのでかみ砕いておしてもらえますか?
Callと括弧がペアで必要なのは理解しています。
もちろん、CALLなし、括弧なしでFunctionもSubも呼び出せるのも知っています。
両者の呼び出しの記法が全く同じで、唯一の例外が
lngSum=AddNumbers(10,20)
等の場合ということも知っています。 つい全文読んじゃったよ
いろんな考えの人がいるんだね >>893
えっcallなしで呼び出せるの?知らない事がたくさんあるなあ >>896
英語の本にはちゃんと書いてあるんですよね。私はVBSの本で知りました。 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
BHZ67 全モジュールをExportするコードがネットにあったので試したら、0TESTModuleという名前のモジュールでエラーになった。0TESTに書き換えたら通った。
予約語かと思ったけど、そんなリスト見つからない。モジュールに名前にModuleが含まれていると失敗するものなの?
ちなみに使ったコードは↓
https://stackoverflow.com/questions/16948215/exporting-ms-access-forms-and-class-modules-recursively-to-text-files 学生はaccessの勉強してないよね。既存の社内システムメンテナンスできる人を募集してるけど応募が無い。
accessなんて社会人になってから仕事の合間に覚える人がまれにいる、程度のものなのかな。 そもそもOfficeのPro版がほとんどの市販PCに載ってないから触れたことすらなかった >>902
給料が安いから応募がないんじゃないの?
いくらで募集なのか知らないが、派遣の求人だと
社内システム作れる人だと時給2100円前後という印象だなAccessは
(高くても2300円くらいか)
だから社内システムメンテ出来る人は普通の会社には行かないのでは
そこまで出来るなら専門業者で働いた方がずっと稼げるだろう 人にもよるだろ。
俺の印象では3000円弱ぐらいまではいく。 >>903
今は単品で15,000円位だから、コスパ良い開発環境だと思うのだが。 VBAで自動メンバー表示できるVBE以外のエディタってあるのかな? >>909
vbseditで試したけどダメだった
emacsで成功した人がいたのでWIN用emacsインスコしてみた
この後は面倒くさいからあしたやるemacsはいろいろ出来てすごいと言うことが少し分かったわ VS CodeにVBA用の拡張があったはず
ふつうのVSにも探せばあるかもな VBE ではないエディタが欲しい場面とは?良かったら教えて。 >>912
VSCの奴は2つ入れたけど,オートコンプリートはできるけど,自動メンバー表示は出来ないですね.
>>913
一般的なエディタと比べると余りにもVBEが低機能だからですね.
たとえばコードフォールディングをしたいし,行番号も見たいけど,出来ないですからね.ズームが出来ないのも案外不便. フォームでマウスホイールをコロコロしてレコードを移動させるプログラムを教えていただけませんか? ソース連結の単票フォームなら、何にもしなくてもホイールコロコロでページパタパタ出来るけど
そういうのとは違うのか 或いは、制作者が敢えて無効にしてるのを有効化したいのか
或いは、帳票フォームの上下・・ これもホイール効くか、、 シーンを限定してもわらないと >>914
913です。VBE良くできてるな便利だなと思って使ってました。もっと捗るエディタも有るんですね。 >>917
ネット上にはVBEを賞賛する声は余り見ませんね。悪口は沢山見ます。
emacsをインスコしてみましたが、Windows7 64bitではダメでした。
emacsならやりたいことが全部出来るはずですが、lisp書けないから悲しいです。 質問です
UPDATEでテーブルを一斉更新する際に、
「Aさん」「Bさん」「Cさん」のようなデータを
繰り返しで連番のように入力させる手段は無いのでしょうか?
連番のような数値型は出来るようなのですが、
文字列で実現する方法が分からないです
目的は出勤している人間(5名程度)に
難易度にムラがある案件(200件程度)を均等・公平に
割り付けるためです
お手数をおかけしますが、どうかご教授ください
よろしくお願いします 一度連番を振ってその後に「連番 mod 3 = 0」をAさん、
「連番 mod 3 = 1」をBさん、連番 mod = 2」をCさん
っていうようにすれば出来なくもないか…
でもスマートじゃないですし、処理に時間がかかりそうですね >>919
解答ではありません。
私ならexcelにエクスポートして手作業でautofill してインポート。またはvbaで一件ずつ読み書き。
Sqlでどうするかわかったら教えてください。 連番(数値型)を繰り返し入力させる方法が分かるのなら、
1=Aさん、2=Bさん、…っていうテーブル用意しておいて、
連番振ったあと更新クエリで文字列を更新させるのは駄目ですか? 20人程度が1つのテーブルにそれぞれ10分間隔くらいでUPDATE INSERTをしているんですが、突然テーブルが開けなくなりました
「他者が開いています」というメッセージが出て開くことやコピーすら出来なくなりました
対策やこの症状が出た時の対処方法はないのでしょうか?
フロントエンドとしてユーザーの数だけUI用のAccessファイルを準備して、
バックエンドはテーブル1つだけのAccessファイルを置いています そうなる前に、誰かがなんかのエラーを発してるはず
或いはエラーを殺しちゃってるかどうか
大概マズイことには口を噤むのが社畜の習い性
エラーにならないよう対策するか、エラー時に対策するか
コピーすらできないなら、サーバー側での対策として
バックアップ時に戻すか
そのファイルさえ救出出来たら修復できるんだろうけど 共有数の制限の気がするけど
そのバックエンドのアクセスファイルはどこでどうやって共有してるんだよ 919です
返答が遅くなってしまい申し訳ありません
>>921
解決しました
元々テーブルに連番が振ってあったので、それを利用して
sqlのswitch文とmodを使ってます
リストボックスで選択した担当者を配列に格納して
ubound関数やらを使ってvbaでsqlを生成しました
switch id mod i
0:Aさん
1:Bさん
2:Cさん
3:Dさん
って感じのイメージです
>>922
週休者には割り当てたくなかったので上記方法で解決しました >>925
先日は事前に取っておいたバックアップまでロールバックして対処しました
未だにエラーの原因が分からないので
不具合が起きた時の対策とバックアップ頻度を上げるような
業務フロー(タイマー関数含む)を追加しようと思います
開けなくなったファイルは日を跨いだら開けるようになりました
恐らく誰かが気づかずにバックグラウンド掴んでる状態だったんだと思います
>>926
特にオプションをいじっていないaccdbを共有サーバに
そのまま置いてる状態です
データを取得するのはサーバのバックエンドテーブルを
ローカルファイル(フロントエンド)にコピーして
ローカルで完結して参照しています
更新や追加する時だけバックエンドのテーブルに
UPDATEとINSERTをしています 質問です。
分割フォームの
分割フォームデータシートプロパティを
VBAから操作できる方法がありますでしょうか?
ご教授お願い致します。 レス数が900を超えています。1000を超えると表示できなくなるよ。