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 ちゅーかVBScriptからもいけるじゃん 後付けコンポーネントってわけでもなさそうだし Officeいらないのかもしかして >>487-488 >Jetデータベースエンジンとは、Microsoft社が開発したリレーショナルデータベースエンジン。Microsoft Access用に開発されたもので、現在ではWindowsに統合され、様々な製品から利用されている。 だそうですよ >>491 トン jetってAccess買わなくてもつかえるんだ。 ランタイムはしってたけど windowsに統合されたjetの使い方はどうすれば? レポートをレコードごとに、pdf出力したく daoで以下のような感じで書いたんだが。 ファイルのフルパスが書いてある別クエリの中のレコードとレポートの項目が合致するレコードのフルパスにpdfを出力したいんだがどうしたらいいのかわからない。 Do Until rs.EOF DoCmd.OpenReport 〜 DoCmd.OutputTo acOutputReport, , acFormatPDF, "ファイルパス.pdf" DoCmd.Close acReport, レポート名 rs.MoveNext Loop JETだけでDB組むとか何の拷問だよ 素直にAccess使え で、Accessって 何に使えばいいの? (´・ω・`) >>498 一人で完結する仕事で面倒臭くて外注する予算もなくてなことを 自動化するのに使ってるよ。だから保守も自分でしかできない(笑) そんな仕事じゃないか? 社内の統計担当とかそんなポジションの人かな? 社内の簡単な統計ならほんと楽ちん。 Access使えるか使えないかでどえらい作業能力の差が生まれる。 access2013でフォームからの入力期間の金額を集計してレポート作成をしようとしています。 vbaでリボンにあるレポートボタンを押下した動作と同じコードは存在しますでしょうか。 >>505 ACCESSにマクロの記録は無かったと思ったが 2013とかだと出来るようになってるのか? >>505 は?馬鹿はいちいちスレに出張って来るなよww 何がマクロの操作を記録だ馬鹿が。 普通にフォームと同じソースの「れぽーとほげ」を用意しておいて DoCmd, OpenReport "れぽーとほげ", acViewPreview ではダメな理由があるのかな? フォーム上でレポートに応用できるように画面設計 作り込むよりは専用のレポートで別制作しといたほうが何十倍も効率いいだろうにな >>504 ちょっと出来ない事があるとVBAに頼るのはよくない。 Officeの使い方をもっと勉強してからVBAに手を出すべきだよ。 「パラメータクエリ」と「フォーム」で作ればなんとかなるかな。 というわけで、VBA必要ないので↑の2つのキーワードでggrks フォームからfrom日付-to日付を入力 ↓ テーブルから購入日が対象範囲のデータ取得 テーブル構造は シーケンスno.,氏名,購入品1,購入日1(購入日、購入品は6まで存在) ↓ クロス集計にて月毎の金額を集計 ↓ レポートに出力 入力する日付によってフィールド数が可変なため、レポートの作成はしていないです。 vbaを使う必要がなく可変レポートが作成出来るならスルーして下さい >>513 クエリ作っときゃいいんじゃないの?集計の。 フィールド数が可変とはなんぞ。 >>513 テーブルの基本設計からやり直せ。 購入品と購入日が1〜6って無いと思います。 >>515 くそなテーブルだと思ってますが自分が作ったテーブルではないので変更出来ません >>516 レポート用にテーブル作っちゃうことはできないの? >>516 だからクエリ作れよ。 select id,1 as 区分,氏名,購入日1 as 購入日,購入品1 as 購入品 union select id,2 as 区分,氏名,購入日2 as 購入日,購入品2 as 購入品 : select id,6 as 区分,氏名,購入日6 as 購入日,購入品6 as 購入品 で、あとはそれに対して、fromToでフィルタ掛ければいいんでないの? >>514 入力した期間に応じて月が増減します http://i.imgur.com/gnTtfzv.jpg 集計用のクエリは作成したのでリボンにあるレポートボタン同様に自動でリポート作成出来ないかと思ってます >>519 帳票一枚に並べられる分の月数を元からつくっとけ。 >>517 くえりをそのままレポートは難しそうだったのでテーブル化はしてあります 複雑になってるクエリが循環参照になってるようなのだが、読み解かずにテーブル作成して逃げようとしたらまたエラーなんとかならんかなー >>519 クエリ出来てるなら、レポート作って保存しておけば好きなときに開くだけじゃん vbaでfilecopy(fsoも含む)でリムーバブルディスクにファイルをコピーするとハードウェアの安全な取り外しで ファイルが使用中とかでできない。まぁ警告のダイアログで続行を押すと取り外せるんだけど、これやると マイコンピュータからリムーバブルディスクが消えなかったりすることがある。 accessを終了すると普通に取り外せるんだけど、これをなんとかできないかなぁ。 >>524 Fsoでやるなら、 宣言で as new ...とかしない、最後にNothing入れとくを徹底したら無くなるんじゃないかな。 カレントフォルダとカレントドライブを明示的に リムーバブルじゃないとこに設定してやれば行ける見たいな事を聞いたことがある >>524 それ、使用したメソッドがファイル掴んだままで、開放してないからでしょ。ちゃんとプログラミングのイロハ身につけてたらやらない。 使ったら必ず開放する。VBAユーザはなぜか使いっぱなしが多い。 .NETなんかだとマネージドは書いてもほぼ意味なかったりで使いっ放し推奨 >>525 、527 Dim objFileSys As Object Set objFileSys = CreateObject("Scripting.FileSystemObject") objFileSys.CopyFile 元ファイル, コピー先フォルダ & "\" Set objFileSys = Nothing copyfileの部分だけをかいつまんで書くとこんな感じだけど、解放の仕方を教えてくれないか。 リムーバブルディスクにコピーしたファイルは開けるし削除もできるからロックされた感じじゃないんだよね。 安全なハードウェアの取り外しだけがうまくいかないんだよ。 getdriveとか適当なのを実行してみたら? カレントが移動するかも。 >>526 、530 ありがとう。この方法で解決した。 ChDrive "c" って1行追加しただけでOKでした。言われないと気付かなかったから助かりました。 他のみなさんもありがとう。 重複した文言の多いcsvファイルの情報を読み込む時に、重複しない文言を蓄えたテーブルと、 文言テーブルのIDだけを入力したテーブルに分けて管理する事で容量を節約しようと思ってるんですが、 人が読める様にIDから元の文言を復元したテーブルを作りたいと思った時、 VBAで文言一つ一つ代入したテーブルを新たに作るしかないですかね? IDでテーブル結合したview作るなりクエリにすりゃいいんじゃないの どちらにしろVBAとか関係ないと思う 質問です Access2007ファイルのショートカットをデスクトップに作ろうと思って https://www.moug.net/tech/acvba/0020025.html ここを参考にパスとかだけ変えて作ったんだけど、ショートカットが作成されません 解決策教えてください mdbファイルのテーブル構造をADO.NET SqlCommandで取り出す方法を知りたいです。(データ定義言語的な取り出し) DoCmd.TransferDatabase acExportでできるテーブル構造のコピーと同じことを,ADO.NETで,元データなしで実現(テーブル生成)したり プログラム側が想定するテーブル構造と一致するか確認する処理をテーブル生成→比較とすることで一般化したりしたいのですが Accessでプロマネの仕事頼まれたけど断ったわ もうVisualStudioが無いと何もできない体になってしまった >>540 そういういかにも日本的で世界で通用しない回答は誰も期待していないし、 君みたいな奴は誰も求めていない。 >>541 君には悲しいかもしれないけど、ここ日本なのよね テーブルにインポートするとたまに失敗する変なゴミデータが入ったエクセルファイルをVBAでテーブルに登録しようとしてます。1レコード100フィールドほどあるもので、addnewで登録すると100件で20秒ほど掛かってしまいます。 Insertでも23秒でした。 全部で10万件あるのですが、高速登録する方法ないでしょうか? >>543 配列で受けると速くなるかもしれない dim ary as variant ary = Range("A1").CurrentRegion.value ' 1オリジンの2次元配列 ゴミは数式やエラー値が混ざってるんだろうから配列にした段階で適当に変換する dim row, col for row = lbound(ary(), 1) to ubound(ary(), 1) for col= lbound(ary(), 2) to ubound(ary(), 2) if ゴミ?(ary(row, col)) then ary(row, col) = ゴミ処理(ary(row, col)) next next この後でテーブル登録する >>543 パフォーマンス重視ならレコードセットやExcelオブジェクトは扱わない方が良いですよ 1.インポート定義でインポート 2.リンクテーブルを作って追加クエリ 3.SQL の IN 句使って INSERT 4.OLE DB の Jet か ACE で接続して INSERT などなど... ゴミが混ざるならゴミを許容する作業テーブルにインポートしてから後始末をするとか 処理の仕方も色々あると思います、頑張ってください 書き忘れ インポート定義は文字列切り詰めなどが起きるかもしれないので 使うなら想定しておいた方が良いです レコード長とかPCのスペックとかもわからんが コードでもっと早くできる余地がいっぱいある気がするぞ というか、純粋な追加で時間かかってるのか? エラーチェックに時間かかってるんじゃないのか access2013の質問がしたいのですがここでは不可でしょうか?探してもスレが見つからなかったので誘導していただけないでしょうか? access 2013での質問です。 テーブルAの構成要素は【id(オートナンバー)、写真(添付ファイルで複数値を持つフィールド)】となっております。 この状態で、テーブルAの任意のIDに写真が入っているか否かを確認したいと考えております。 今のところ dim RS As DAO.Recordset2 set RS = CurrentDb.OpenRecordset( すみません、途切れました set RS = CurrentDb.OpenRecordset("テーブルA") With RS .FindFirst "id = ○" End With で任意のIDに移動できるのですが、そこから写真フィールドにデータが入っているか否かをどのように確認したら良いかが分かりません。 一応複数値を持つフィールドということから Dim RS_写真 As DAO.Recordset2 Set RS_写真 = RS.Fields("写真").Value と代入し、 If RS_写真.Fields("FileName") = "" Then MsgBox "hoge" End If というように、if分を使ってみたのですが、上手く行きません。 お忙しいところ恐縮ですが、アドバイスを戴けると幸いです。 添付ファイルで複数値を持つフィールド ってのがよくわからん そのフィールドのデータ型と 実際に内容をセットしてるコード出してみ >>554 お返事ありがとうございます。 TABLEAのフィールド"写真"にデータをセットするのはフォーム上で行っております。 MsgBox TypeName(.Fields("写真")) で確認をしてみたところ、 Field2 オブジェクト (DAO) ttps://msdn.microsoft.com/ja-jp/library/office/ff194326.aspx と返ってきました。 これで伝わりますでしょうか? テーブルAのあるレコードでは【写真】に外部からデータが入っていて,違うレコードでは入っていないから,それを確認したいということ? RS_写真のeofとbofを調べれば良いだけだと思う. ttps://msdn.microsoft.com/ja-jp/library/office/ff194326.aspx ここにサンプルが有るから頑張って >>555 そのテーブルをデザインビューで開いたときに、そのフィールのデータ型は何になってる? フォームでセットとは具体的にどうやってるんだ? > If RS_写真.Fields("FileName") = "" Then FileData? データが入ってたらFileNameとは何を指すのだ フィールドに複数データが入るんだけど、ファイル名とファイル本体がセットになって入るイメージなんじゃないかな。 >>553 は配列のような捉え方で書いてるんだと思う。 フィールドがnullなのかを見ればいいんだろうけど、ファイル名を指定してそのファイル本体の有無を見たいのかな。 でもそれだとファイル名のみがあってファイル本体がないってことがあり得ることが前提になると思うんだけど。 添付ファイル型なら RS_写真のEOFと(MoveLastしてから)RecordCountみれば、添付されてるファイルの件数はわかる 皆様、お返事ありがとうございます。 当該フィールドは「添付ファイル」型です。 「添付ファイル」型の写真フィールドは、下位フィールド?として写真.FileData / 写真.FileName / 写真.FileTypeを持っているため、写真.FileNameの有無でNULLか否かを確認しようとしていました。 >>557 さんと >>563 さんのお陰でNULLか否かはRS_写真のEOFを見れば良いだけと気づき、 何とかやりたい操作ができそうです。 この度はご指摘戴き、誠にありがとうございました。 Access2010のVBAの動作にて質問です。 現在クエリのデータをCSV形式にて出力をするために DoCmd.TransferText acExportDelim, , 途中で切れてしまったので再度質問させていただきます。 Access2010のVBAの動作にて質問です。 現在クエリのデータをCSV形式にて出力をするために DoCmd.TransferText acExportDelim, ,"クエリ名","出力先\ファイル名.csv" と言う文を使っているのですが、クエリの行が複数の場合は1行ごとに出力をしたいのですがどうすればよろしいのでしょうか。 >>566 連続出力するなら レコードセット開いてレコード毎に書き出しループ 連続出力しないなら フォーム上の値を参照するパラメータクエリ作って DoCmd.TransferTextで書き出し ACCESS VBAでoracleのデータを読み書きする場合は リンクテーブルを作ってやるのが普通でしょうか? それともリンクせずに直接ORACLEにアクセスするのがよいでしょうか? べつにSQL ServerでもORACLEでも同じだとおもうけど ケースバイケースとしか言えん リンク使わないなら別にAccessじゃなくても良いよね、って回答はダメ? ハマってしまいました、cell とoffsetとloopの関係が解明できません。 エクセルデータから一行ずつhtmlファイルを作成するということをしたいです。 minitemplatorを使っています。 試しに3行でつくってみるとファイル名は変わるのですが、 set変数の箇所が一行目のままかわりません。 ↓こんなVBAにしてあります Private Const START_CELL = すみません Private Const START_CELL = "T3" Public Sub PushButton() ' Dim Cell As Range Dim Temp As MiniTemplator Set Temp = New MiniTemplator 'テンプレートファイルを読み込みます。 Temp.ReadTemplateFromFile ThisWorkbook.Path & "\h00_0.html" 'セルのスタート位置を設定します。 Set Cell = Range(START_CELL) '現在アクティブになっているシートの最終行まで以下を繰り返します。 Do While Cell.Row <= ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row Temp.SetVariable "TITLE", Cell.Offset(0, 1).Value Temp.SetVariable "CHAPTER", Cell.Offset(0, 2).Value Temp.SetVariable "PREVCHAPTER", Cell.Offset(0, 3).Value Temp.SetVariable "PREVPAGE", Cell.Offset(0, 4).Value Temp.SetVariable "INDEX", Cell.Offset(0, 5).Value Temp.SetVariable "NEXTPAGE", Cell.Offset(0, 6).Value Temp.SetVariable "NEXTCHAPTER", Cell.Offset(0, 7).Value Temp.AddBlock "htmls" Temp.GenerateOutputToFile ThisWorkbook.Path & "\" & Cell & ".html" Set Cell = Cell.Offset(1, 0) Loop End Sub 申し訳ない!accessの方に書き込んでしまいました、excelの方へ移動いたしますorz >>570 メインのDBはSQLServerやACCDBだけど、特定のデータだけ 別DBのORACLEからとって来たいなんて要件だったりしたら ORACLEにリンクテーブル作るほどでは無かったりするかもしれんだろ >>576 何が言いたいのかわからん リンクテーブルかそれ以外でのアクセスかって質問に対して ACCCESSならリンクテーブル一択だろ、見たいな事を言うから そうじゃない状況もあるだろって言ってるんだが >>577 質問者はOracleをAccessから操作する場合はどちらかを聞いている訳で その状況ならリンクで良いんじゃね、と答えただけ そこにお宅が勘違いして質問にないSQL Server絡めて否定してきたから ちゃんと質問内容見ろよ、と返しただけ Accessでエクセルファイル読もうと思ってExcelオブジェクトを作成した時、 既にエクセルを立ち上げているとマクロの挙動がおかしくなったり、 あるいは後からエクセルを立ち上げようとするとマクロが終了するまで画面が白いままなのですが、 これを避けてAccess側のみで扱えるエクセルオブジェクトを作ったり、あるいはエクセルと併用したりという事は出来ないでしょうか? スプレッドシートのインポートは暗号化の影響で上手くいかないので、エクセルオブジェクトを通す必要があります。 つか普通にやればそうなってたと思ったけど CreateObjectって、インスタンスあったらそれ掴んで返すのか? vbaでも知りたいのですが、accessで列見出しを行見出しにするには、どんなコードを書けばいいでしょうか?クロス集計ではできませんでした。 >>585 行列入替えがしたいっての?それ、データベースのルールに反してる わけだが。 クロス集計クエリの場合にはデータ元がきちんとクロス集計できる形に なっていれば、できないということはない。 金はあるけど時間がない 経験値100倍くらいになる課金ないんか ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる