- ベストアンサー
アクセス2013の値集合ソース内の検索か抜き出し
- アクセス2013のフォームのコンボボックスの『値集合ソース』内に書かれたSQLコードの検索か抜き出しはできませんか。
- アクセス2013でゴリゴリに作られた画面があります。そこで使われているテーブルを検索して影響範囲の調査をしたいのですが、検索しても『値集合ソース』内に書かれたSQLコードにはヒットしてくれません。
- どの画面とどの画面のどこでそのテーブルが使用されているのかが知りたいですが、コンボボックスとその『値集合ソース』を多用しているために困っています。『値集合ソース』内に書かれたSQLコード内のテーブルを検索する方法か、フォームに書かれた『値集合ソース』のコードをテキストで抜き出す方法はありませんか。
- みんなの回答 (14)
- 専門家の回答
質問者が選んだベストアンサー
> でも、途中で切れている感じがしました。 > イミディエイトウインドウの表示限界行数を超えたのかな? だと思いますので、テキストファイルに書き出すようにしました。 現在のファイルと同じフォルダにRowSource.txtというファイルで書き出します。 フォルダやファイル名を変更したい場合 mPath = Application.CurrentProject.Path & "\" & "RowSource.txt" を適当に変更してください。 また、 DoCmd.OpenForm MFormName, acDesign ', , , , acHidden の ', , , , acHidden を有効にするとフォームは非表示で実行されますのでチカチカはなくなります。 ただエラーで止まったら再起動しないと開いているフォームが閉じられない感じがしました。 また 全てのコンボで指定テーブル名存在の有無にかかわらずRowSourceを出したい場合は If InStr(ctl.RowSource, TbName) > 0 Then RSStr = RSStr & MForm.Name & " : " & ctl.Name & vbCrLf & ctl.RowSource & vbCrLf End If のIF文を外して RSStr = RSStr & MForm.Name & " : " & ctl.Name & vbCrLf & ctl.RowSource & vbCrLf にしてください。 Sub test3() Dim frm As AccessObject Dim cp As Object Dim ctl As Control Dim MForm As Form Dim MFormName As String, TbName As String Dim RSStr As String, mPath As String Dim FileNum As Integer TbName = "テーブル1" Set cp = Application.CurrentProject For Each frm In cp.AllForms MFormName = frm.Name DoCmd.OpenForm MFormName, acDesign ', , , , acHidden DoEvents Set MForm = Forms(MFormName) For Each ctl In MForm.Controls With ctl If .ControlType = acComboBox Then If InStr(ctl.RowSource, TbName) > 0 Then RSStr = RSStr & MForm.Name & " : " & ctl.Name & vbCrLf & ctl.RowSource & vbCrLf End If End If End With Next ctl Set MForm = Nothing DoCmd.Close acForm, MFormName Next frm mPath = Application.CurrentProject.Path & "\" & "RowSource.txt" FileNum = FreeFile Open mPath For Output As #FileNum Print #FileNum, RSStr Close #FileNum Set cp = Nothing End Sub
その他の回答 (13)
- chayamati
- ベストアンサー率41% (260/624)
>内容的にはAのようですね。 A:GUI的な操作で一つ一つ見るしかない ★そうですね、GUI:マウス操作で観る事になります。 テーブル、クエリ、フォーム、レポートのデザインビューの プロパティーのデータタグのレコードソースに記述されています クエリ、フォーム、レポートの数だけ確認することになります ------------------------------------------------------------------------------------------------- ★ステイホームでデスクワークが多くなり、 添付のような見積システムを構築しました。 ここでお伝えしたい事 1.テーブル設計:M=マスタテーブル、 T=トランザクションテーブル、P=部品テーブル、S=サブテーブル 1-1.テーブル名のネーミング 1-2.フィールド名のネーミング 1-3.ルックアップによるコンボボックッス作成 2.クエリの作成 3.フォームの作成:メインフォームとサブフォーム 4.レポート作成:残計算 ※これでは一方的な回答になって、このコーナーの狙いから 著しく外れたものになります。 また、的も絞りにくく、次回の新規の質問には具体的なもので、 出来れば画像の添付があれば回答者としては大変助かります。
お礼
ありがとうございます。
- kkkkkm
- ベストアンサー率66% (1742/2617)
No11の補足です。 ひとつのフォームで結果が得られた場合 No2の「質問者からのお礼」に記載しているコードの以下の部分を変更して DoCmd.OpenForm MFormName, , , , , acHidden DoEvents ↓ DoCmd.OpenForm MFormName, acDesign DoEvents デザインモードで次々と開いていくという手もあります。
お礼
ありがとうございます。 > デザインモードで次々と開いていくという手もあります。 やり方はわかりませんでしたが、それ思っていました。 画面を開いてしまうとトリガーも動くし、 ゴリゴリに作り込まれているのでメニューから順に開かないと不具合が生じます。 デザインモードなら実害がなさそうです。 Sub test() Dim frm As AccessObject Dim cp As Object Dim ctl As Control Dim MForm As Form Dim MFormName As String, TbName As String TbName = "テーブル名" Set cp = Application.CurrentProject For Each frm In cp.AllForms MFormName = frm.Name DoCmd.OpenForm MFormName, acDesign DoEvents Set MForm = Forms(MFormName) For Each ctl In MForm.Controls With ctl If .ControlType = acComboBox Then If InStr(ctl.RowSource, TbName) > 0 Then Debug.Print MForm.Name; " : "; ctl.Name Debug.Print ctl.RowSource End If End If End With Next ctl Set MForm = Nothing DoCmd.Close acForm, MFormName Next frm Set frm = Nothing End Sub 画面が何十もあるので、ひたすらチカチカと画面を開いては閉じで壊れるのでは?と心配になりましたが、待てばちゃんと結果が返ってきました。 とりあえず、これで解決したのだろうと思います。 Sub test2() Dim frm As AccessObject Dim cp As Object Dim ctl As Control Dim MForm As Form Dim MFormName As String, TbName As String TbName = "テーブル名" Set cp = Application.CurrentProject For Each frm In cp.AllForms MFormName = frm.Name DoCmd.OpenForm MFormName, acDesign DoEvents Set MForm = Forms(MFormName) For Each ctl In MForm.Controls With ctl If .ControlType = acComboBox Then Debug.Print MForm.Name; " : "; ctl.Name Debug.Print ctl.RowSource End If End With Next ctl Set MForm = Nothing DoCmd.Close acForm, MFormName Next frm Set frm = Nothing End Sub こっちバージョンも試してみました。 これでコードが抜き出せますね。 でも、途中で切れている感じがしました。 イミディエイトウインドウの表示限界行数を超えたのかな?
- kkkkkm
- ベストアンサー率66% (1742/2617)
> しかし、どこかに何かがアウトプットされるわけでもなく、ウエイトしてすぐに元に戻るだけです。 下にあるイミディエイトというウィンドウに何か表示されると思います(イミディエイトが無ければメニューの表示でイミディエイトウインドウを選択)結果が表示されないのでしたらそのフォームには RowSourceプロパティに TbName = "テーブル1" で設定したテーブル名が記載されてないという事になります。 If InStr(ctl.RowSource, TbName) > 0 Then Debug.Print MForm.Name; " : "; ctl.Name Debug.Print ctl.RowSource End If を Debug.Print MForm.Name; " : "; ctl.Name Debug.Print ctl.RowSource にして全てのコンボボックスのRowSourceプロパティを表示したらどうなるでしょう。
お礼
ありがとうございます。 イミディエイトというウィンドウがオフになっていました。 オンにすれば出ています。
- chayamati
- ベストアンサー率41% (260/624)
こんばんは 「テーブル名がコーディングのどこにもない」 あなたが検索で確認済ですね A:GUI的な操作で一つ一つ見るしかない フォームのプロパティーで確認出来ます B:検索方法がある 「A:」のフォームのプロパティーのデータタグのレコードソース行で確認できる>>添付図左参照 C:エクスポートでテキスト化できる 「テーブル名がコーディングのどこにもない」のため無理 D:その他 フォームのデザイン内でクエリビルダーで内部的にクエリを作成したとき>>添付図右
お礼
ありがとうございます。 A:GUI的な操作で一つ一つ見るしかない B:検索方法がある C:エクスポートでテキスト化できる D:その他 質問はAからDのうちどれですか?というものでしたが、 内容的にはAのようですね。
- chayamati
- ベストアンサー率41% (260/624)
失礼ながら話が噛み合ってないようなので、捕捉します Excelと違って、Accessはテーブル、クエリ、フォーム、レポート、モジュールと機能別に5つのグループに分割されています。 ・テーブル:情報を記録するAccessの基本部分 顧客テーブルと見積テーブルのようにテーブルとテーブルを関連付け を定義します、これをリレーションシップと呼びます 添付画像参照 (リレーションシップは1対∞参照整合でなければとトラブルの元) 顧客テーブル内の顧客名は重複なしでなければなりません 見積テーブル内の顧客名は重複あり ・クエリ:レコードソースをテーブルとして、選択項目(フィールド) 抽出条件 顧客テーブルと見積テーブルをリレーションでつないで一つの レコードとする事が出来る ・フォーム:レコードソースをテーブルまたはクエリとして、 レコード入力画面、確認画面の作成 コーディングはこのフォームのデザインビューで記述します 従って、SQL文があるとしたらここかレポート内で記述します。 ・レポート:レコードソースをテーブルまたはクエリとして 報告書の印刷します ここではグループの合計、改ページ等はコーディングでなく パラメータの設定だけで処理出来ます ・モジュール:ユーザ独自に作成してユーザの 全てのAccessの関数ですが、自分は使った事がありません ------------------------------------------------------------------------------------------- ・テーブル、フォーム、クエリ内のコンポボックスは コーディンではなくそれぞれのプロパティー内で パラメータ設定でします SQL文はおろかVBAもなくてもフォーム作成できます >アクセス2013でゴリゴリに作られた画面があります。 自分も使い始めのころゴリゴリから始めました。 クエリは簡単ですね、ゴリゴリのため無駄なクエリの数が増えて 往生しました 今はクエリを使わずオブジェクト内でクエリを作成しています >【データベースツール】→【Visual Basic】→【編集】→【検索】 ではなく 【画面左端のナビゲーションウィンドウ内のフォーム名右クリック】 →【デザインビュー】→【プロパティーシート】→【データタブ】 これでレコードソースの行にテーブル名又はクエリ名が表示されます ------------------------------------------------------------------------------ 質問に1度だけJPEG画像が添付できます Windows アクセサリー内にsnniping toolというアプリがあります これはデスクトップ上の一部分をコピーしてJPEGファイル作成できます
お礼
ありがとうございます。 >失礼ながら話が噛み合ってないようなので、捕捉します 噛み合ってないのではなく、当方はAccessの事をよく知らないのです。 また、Accessの事を1から100まで網羅的に覚える気もありません。 状況としては、 素人がゴリゴリに作ったAccessファイルがあり、 それを直して欲しいと言われているのですが、 Accessの事をよく知らないので困っています。 Visual Basicとか、DBMS(oracleやSqlServerやPostgreSQL)は分かるので、なんとかなるかと思いましたが、GUIベースでしか触れないところが多くてすごく面倒だという印象です。 フォームが大量にあり、そのフォーム上に複数のコンボボックスがありという状態で、一部のテーブルレイアウトを変更するのですが、そのテーブルがどこで使用されているのかが知りたいのです。 質問としては GUI的な操作で一つ一つ見るしかないのか、 検索したりエクスポートでテキスト化できないのか、 という事です。 A:GUI的な操作で一つ一つ見るしかない B:検索方法がある C:エクスポートでテキスト化できる D:その他 シンプルに上記A~Dならどれですか?
- chayamati
- ベストアンサー率41% (260/624)
AccessVBAは次の形式です Private Sub オブジェクト名_イベント() 命令文 End Sub また「仕訳帳生成RTN」のように一連の命令文一纏めにするサブルーチン Private Sub サブルーチン名() 命令文 End Sub ------------------------------------------- 回答№7のPrivate Sub 仕訳帳生成RTN()内の「です」は除去して下さい
お礼
ありがとうございます
- chayamati
- ベストアンサー率41% (260/624)
回答№3です >キー? 失礼しました。キーワドの事です。 >Accessのコード内に調べたいテーブルが何箇所登場するかということです。 この場合「テーブル名」がキーワードです >Accessのコード内に コーディンは添付のような画面で記述します プルダウンが左右に1つづつあり 左側オブジェクト名でボックス名等で 右側がオブジェクトの動作(クリック、ダブルクリック) 下の空白にコーディングを記述します ------------------------------- Private Sub 仕訳帳印刷_Click() DoCmd.Maximize 開始日 = 月初日: 終了日 = 基準日 仕訳帳生成RTN DoCmd.OpenReport "仕訳帳", acViewPreview End Sub '----------------------------------------------------------------------------------------------- Private Sub 仕訳帳生成RTN() DoCmd.SetWarnings False DoCmd.RunSQL ("Delete From 仕訳帳") '借方 DoCmd.SetWarnings False DoCmd.RunSQL ("Insert Into 仕訳帳(伝票№,仕訳日,適用,科目ID,借方,仕訳明細ID) " _ です & " Select 伝票№,仕訳日,目的 & "" "" & IIF(借方適用 = 貸方適用,借方適用,借方適用 & "" "" & 貸方適用) " _ & " ,借方科目ID,借方,仕訳明細.ID From 仕訳伝票 Inner Join 仕訳明細 On 仕訳伝票.ID = 仕訳明細.仕訳伝票ID " _ & " where (仕訳日 Between 開始日 and 終了日) and (借方<>0);") '貸方 DoCmd.RunSQL ("Insert Into 仕訳帳(伝票№,仕訳日,適用,科目ID,貸方,仕訳明細ID) " _ & " Select 伝票№,仕訳日,目的 & "" "" & IIF(借方適用 = 貸方適用,借方適用,借方適用 & "" "" & 貸方適用) " _ & " ,貸方科目ID,貸方,仕訳明細.ID From 仕訳伝票 Inner Join 仕訳明細 On 仕訳伝票.ID = 仕訳明細.仕訳伝票ID " _ & " where (仕訳日 >= 開始日) and (仕訳日 <= 終了日) and (貸方<>0);") End Sub >【データベースツール】→【リレーションシップ】の中はカラです。 空白部分を右クリックしてください テーブルの表示、すべてのリレーションシップの表示の選択窓で 「すべてのリレーションシップの表示」 次に「テーブルの表示」で残りのテーブルを表示してください --------------------------------------------------- DoCmd.RunSQL でSQL擬きの記述ができますが DELET(削除)、INSERT(追加)、UPDATE(更新)の3つだけですが >【データベースツール】→【Visual Basic】→【編集】→【検索】 で検索する文字列にそのテーブル名を入れ、カレントプロジェクトなどに対して検索しています。 【検索】の窓で〇カレントプロジェクトと検索範囲を拡げて下さい
お礼
ありがとうございます
- kkkkkm
- ベストアンサー率66% (1742/2617)
また フォーム名を実際のどれかのフォーム名にしてその一個だけで実施してみてエラーになるようだとこのアプローチは駄目ですね。 Sub testOne() Dim ctl As Control Dim MForm As Form Dim MFormName As String, TbName As String TbName = "テーブル1" MFormName = "フォーム名" DoCmd.OpenForm MFormName, , , , , acHidden DoEvents Set MForm = Forms(MFormName) For Each ctl In MForm.Controls With ctl If .ControlType = acComboBox Then If InStr(ctl.RowSource, TbName) > 0 Then Debug.Print MForm.Name; " : "; ctl.Name Debug.Print ctl.RowSource End If End If End With Next ctl Set MForm = Nothing End Sub
お礼
ありがとうございます。 コレはエラーにはなりませんでした。 しかし、どこかに何かがアウトプットされるわけでもなく、ウエイトしてすぐに元に戻るだけです。
- kkkkkm
- ベストアンサー率66% (1742/2617)
訂正です 手動で全てのフォームを開けるのでしたら ↓ 手動で全てのフォームを開けるのでしたら、先に全てのフォームを開いておいて
お礼
ありがとうございます。 フォームが何十とあるので、それはキツイですね。 そもそもそういう事をしたくないから何かいい方法が無いかを探しているわけです。
- kkkkkm
- ベストアンサー率66% (1742/2617)
> 下記のように変えてみましたが、状況下わらずでした。 手動で全てのフォームを開けるのでしたら DoCmd.OpenForm MFormName, , , , , acHidden DoEvents と 最後の方にある DoCmd.Close acForm, MFormName この部分を外して実行してみたらどうでしょう。
お礼
ありがとうございます。 どうやらアクセスはソースコードの管理ができるものが実装されていなさそうですので、ご教授頂いている様に中プログラミングを組み込むしかなさそうですね。 プログラムの埋め込みによる方法に取り組んでみようとしていますが、コレをはずして実行しても上手くいきませんでした。
- 1
- 2
お礼
ありがとうございます。 外部ファイルに出せばよいだけでしたね。 Accessにはガッカリしましたが、対案として一通り解決しました。 丁寧に教えていただきありがとうございました。