• ベストアンサー

ACCESSマクロ、Me![氏名] その他について

ACCESSの勉強をしています。temp = Me![氏名] その他がわかっていません。 わかりやすく教えていただけますか? (1)下記のマクロにて、temp=Me![氏名]ではOK,    temp=DataTable![氏名]、temp=DataTable!氏名、temp=DataTable.氏名ではNG    この理由? (2)下記のマクロにて、DoCmd.GoToControl "氏名"のラインが無くても正常に動きます。    これの理由? 基本情報:  テーブル名:「データテーブル」--フィールド「氏名」,「通番」を持つ  フォーム名:「DataTable」--「データテーブル」をソースとし、フィールド「氏名」,「通番」を持つ。  フォーム上のボタン名:「実行」(on click)          Private Sub 実行_Click() DoCmd.GoToRecord acForm, "DataTable", acFirst Do While [NewRecord] = False DoCmd.GoToControl "氏名" '----このラインがなくても正常に動く temp = Me![氏名] ' temp = DataTable![氏名]----これではうまく行かない ' temp = DataTable!氏名 -----これでもうまく行かない ' temp = DataTable.氏名 -----これでもうまく行かない 'うまく行くとは、tempにきちんとデータが取りこまれる。うまく行かないとは、 Object Requiredとしかられます。 Me![通番] = 1 DoCmd.GoToControl "氏名" '----このラインがなくても正常に動く DoCmd.GoToRecord acForm, "DataTable", acNext Loop (マクロで何をやろうとしているかは意味がありませんので、無視してください) End Sub よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.1

Rich53さんとともに、No.1575853で回答した者です。 (1)下記のマクロにて、 オブジェクト名を指定する場合(→「DataTable![氏名]」の場合)は、それがどの種類のオブジェクトであるかを明示する必要があります。 「DataTable!氏名」を「Forms!DataTable!氏名」と指定してやれば、問題は解消すると思います。 なお、Meを使用した場合は、そのイベントが起動したオブジェクト上で、指定されたコントロールを探すため、FormsやReportsといった指定は不要(無用)になります。また、その方が処理も速くなるそうです。 詳しくはヘルプを参照下さい。私のはその「うろ覚えの受け売り」なので(汗) (2)下記のマクロにて、 特にコントロール移動を指定しない場合は、「タブストップ」がTrueに設定されたコントロールのうち、最も「タブ移動順」が早いものがフォーカスを受け取ります。 指定しなかったからと言って、エラーにはなりません。 但し、続く操作が、「貼付(Paste)」など、フォーカスを受けたコントロールに対してのものだった場合などは、話がかわります。 私がNo.1575853で出した例の場合も、サブフォームでレコード移動をさせるために、そのサブフォーム内のコントロールに移動させてから、オブジェクト指定なしでGoToRecordを実行させています。 (これは、私がサブフォームのレコード移動の方法を、他に知らないためです(汗))

noname#95859
質問者

お礼

ありがとうございます。理解が進みました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.2

(1) Meプロパティは、そのコードを実行しているオブジェクトを参照します。 例えば、   Forms![フォーム名] と同意です。 フォームを参照する場合はFormsオブジェクト、レポートを参照する場合はReportsオブジェクトの指定が必要です。 (2) コードの実行に影響を与えないためです。 DoCmd.GoToControl "氏名"ではなく Me![氏名].SetFocusを使用しましょう。 (ヘルプではSetFocusの使用を勧めています。)

noname#95859
質問者

お礼

ありがとうございます。理解が進みました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ACCESSでのマクロ、ソート、縦方法の移動の仕方

    質問No.1575853をベースとする更なる質問です。 ボタンを押すことで、  -テーブルをフィールド「氏名」+「データ」でソートする  -下記のマクロの考え方を使ってフィールド「通番」に番号を入れる。 問題:1.マクロでのソートの仕方がわかりません    2.縦方向に移動する方法がわかりません。      レコードを次に移動するのは、レコード番号をインクリメントすることであって      ソートされたレコードを縦方向にで移動するではない様です(?) 基礎情報  テーブル名:「データテーブル」--フィールド「氏名」,「データ」,「通番」 フォーム名:「DataTable2」--フィールド「氏名」,「データ」,「通番」  ボタン名 :「実行」(On click) Private Sub 実行_Click() DoCmd.GoToRecord acForm, "DataTable2", acFirst MyCount = 0 temp = "" Do While [NewRecord] = False If temp <> Me![氏名] Then MyCount = 1 Else MyCount = MyCount + 1 End If Me![通番] = MyCount DoCmd.GoToRecord acForm, "DataTable2", acNext Loop End Sub 下記にテーブルの内容を示します。 実行前は、本当は、ID順に並んでいると思いますが・・ 実行前--- ID 氏名 データ 通番 1 あ 1111 3 あ 3333 6 あ 6666 7 あ 7777 2 い 2222 5 い 5555 4 う 4444 8 う 8888 実行後--- フィールド「通番」に番号が入っている ID 氏名 データ 通番 1 あ 1111 1 3 あ 3333 2 6 あ 6666 3 7 あ 7777 4 2 い 2222 1 5 い 5555 2 4 う 4444 1 8 う 8888 2 よろしくお願い致します。

  • サブフォームの新規レコードに移動したい アクセス

    親フォームのコマンドボタンをクリックしたら 親フォームにはまっているサブフォームの新規レコードに移動したいのですが、 うまくできません。 サブフォームのオブジェクト名は、"F_SubForm"です。 サブフォームはデータシートビューです。 VBAコードは Private Sub cmd_test_Click() DoCmd.SelectObject acForm, "F_SubForm" DoCmd.GoToRecord , , acNewRec End Sub です。 上記コードを実行すると DoCmd.SelectObject acForm, "F_SubForm" の部分で、 「実行時エラー 2489  オブジェクトが開いていません。」 となります。 だからと言って、 DoCmd.GoToRecord , , acNewRec だと、何も起こりません。(新規レコードに移動しません) 解決方法をご教授ください。

  • Accessのマクロ

    Access2002で、「氏名(テーブル名:name)」と「日付<○月○日~○月○日>(テーブル名:date)」でレポート内容が検索できるのを作っています。 フォームに 氏名一覧、日付入力、検索ボタン、最新データの取り込みボタン を作っています。 「検索」の方は出来たのですが、「最新データ取り込み」をしようとすると、 『テーブル'name'は現在ほかのユーザまたはプロセスで使用されているので、ロックできませんでした』というエラーメッセージがでてきます。 「最新データ取り込み」ボタンに対してのマクロのアクションは、 オブジェクトの削除…テーブル/report テキスト変換…reportインポート定義 オブジェクトの削除…テーブル/name クエリを開く…name作成(テーブル作成クエリ) としています。 (「マクロの実行」で指定) フォームに表示されている氏名(name)を削除しようとしているために、このようなエラーメッセージが出ているのかとも思っていますが…。 フォームを閉じずに、「最新データ取り込み」ができないものでしょうか? ご教示の程、よろしくお願いします。

  • トグルスイッチをVBAでコントロール

    マイクロソフトアクセス2000で作成しています。 メインフォームとサブフォームを使っています。 メインフォームにあるトグルスイッチを押した時に、サブフォームの最新レコードに移動したいと 考えています。 ボタンを押したときに、VBAの命令は動くのですがトグルスイッチが押した状態になりません。 VBAで押した状態にしようとしても命令言語がわかりません。 ご教授をお願い致します。 Me.トグルスイッチ1=true <- ここが動きません。 DoCmd.GoToControl "サブフォーム名" DoCmd.GoToRecord , , acNewRec

  • Accessでレコードの複製

    Access2010を使用して入力フォームを作成しています。 メインフォームとサブフォームにそれぞれ顧客情報を表示させていて、 「複製」ボタンを押すと、 メインフォーム、サブフォームのレコードがコピーされるようにしています。 メインフォームの元テーブルはJIK サブフォームの元テーブルはREN です。 JIKおよびRENテーブルはほかからリンクさせているのですが、 これで「複製」ボタンを押すと、 "実行時エラー '3022': インデックス、主キー、またはリレーションシップで重複する値が生成されるためテーブルに要求した変更でした成功しました。フィールドまたは重複データが含まれている、インデックスを削除するフィールド内のデータを変更または重複するエントリを許可して、やり直してのインデックスを再定義します。このエラーは、レポートやレポートの生成に変更を保存するときに発生します。 が出てしまいます。 テーブルをインポートすると正常に動作します。 テーブルをリンクさせる場合、レコードの複製は不可能なのでしょうか? VBAは以下のように記述してみました。 Private Sub コマンド10_Click() On Error GoTo Err_コマンド10_Click Dim Result As Integer Result = MsgBox("このデータを複製しますか?", vbYesNo + vbDefaultButton2 + vbQuestion, "データの複製確認") If Result = vbYes Then Me!txtCopy事件ID = Me!事件ID Dim stDocName As String DoCmd.RunCommand acCmdSelectRecord 'カレントレコードの選択 DoCmd.RunCommand acCmdCopy '選択レコードのコピー DoCmd.GoToRecord , , acNewRec '新規レコードに移動 DoEvents ' (必要に応じて) DoCmd.RunCommand acCmdPasteAppend 'コピーレコードの追加貼り付け DoCmd.SetWarnings False ' システムメッセージ非表示 stDocName = "追加クエリ" DoCmd.OpenQuery stDocName, acNormal, acEdit DoCmd.SetWarnings True ' システムメッセージ表示 ' サブフォーム再クエリ Me!SREN.Requery ' 追加したレコードに移動 DoCmd.GoToRecord , , acLast Me.リスト31.Value = Me.リスト31.ItemData(0) MsgBox ("データを複製しました") Exit_コマンド10_Click: Exit Sub Err_コマンド10_Click: MsgBox Err.Description Resume Exit_コマンド10_Click Else MsgBox "データの複製をキャンセルしました" End If End Sub 追加クエリは以下のように作成してみました。 【追加クエリ】 INSERT INTO REN ( 事件ID, 氏名, フリガナ, ・・・ ) SELECT [Forms]![MAIN]![事件ID] AS 式1, REN.氏名, REN.[フリガナ], REN.報告書, ・・・ FROM REN WHERE (((REN.事件ID)=[Forms]![MAIN]![txtCopy事件ID]));

  • アクセス フォームをリクエリしたい

    フォームAを閉じて、フォームBのテーブルに基づいたデータをリクエリ(更新)したいのですが DoCmd.Close acForm, "フォームA" DoCmd.Requery "フォームB" 実行時エラー2109 「カレントレコードには、フォームBという名前のフィールドはありません。」となってしまいます。 フィールド名ではなくフォームB全体を更新したいのですが、どうすればいいでしょうか? フォームBは開いている状態です。

  • access の 最終レコードの判定はどう記述しますか

    月間スケジュールテーブルを新規生成するルーチンです 月初~月末まで各日にちの曜日を[曜日TMP]に求めてこのルーチンに入ります ("マスタFORM"には週間計画のテーブルのフィールドを設定したフォームです。 (週間計画:月曜日の○○時~◎◎時に○○の作業) Private Sub 分析RTN() DoCmd.GoToRecord acForm, "マスタFORM", acFirst Do While Not EOF(1) ‘ここでエラーが発生します If 曜日No. = 曜日TMP Then 追加RTN ’レコードの追加ルーチンです End If DoCmd.GoToRecord acDataForm, "マスタFORM", acNext Loop End Sub 他にお気づきの点はご指導ください

  • Accessで、DoCmd.FindRecordがオートナンバーを間違える

    Access2003 XPです。 タイトルを短くと思ったら変な文章になってしまいました。 内容は、サブフォームにデータシートで表示させているデータがありまして、ダブルクリックされた行のデータを別フォームに単票フォームで表示させています。 データベースにはオートナンバーを設けてあり、ダブルクリックされた行のオートナンバーを取得して、 単票フォーム表示のフォームのオートナンバーのフィールドを指定して、 DoCmd.FindRecordで開くようにしています。  ↓ソース '単票フォーム画面(Mainフォーム)を開く DoCmd.SelectObject acForm, "Main" '表示するレコードを指定 DoCmd.GoToControl "txtNo" ←オートナンバーが連結されている DoCmd.FindRecord intNo, acAnywhere ←IntNoが取得した番号 オートナンバーの取得はうまく出来ています。 が、単票フォームを開くと違うデータが開くので 何番を開いているのか調べてみたら 3を指定 → 213を表示 7を指定 → 217を表示 81を指定 → 281を表示 100を指定→ 100を表示 ちなみにデータは294件あります。3桁なら良いのですが 桁数が少ないと、1の桁、10の桁だけ変更されるようで…。 DoCmd.FindRecord intNo, acAnywhere の前にIntNoに0を渡してから取得したオートナンバーを渡してもだめでした。 で、テーブルにてオートナンバーの列を一旦削除して再度設けてふりなおしたら1桁だけのデータも全てちゃんと表示されるようになりました。 データ更新をしていると何らかのきっかけで又だめになるようです。 きっかけは分かりません;; この現象は何なのか、解決法が分かる方いらっしゃいましたらお願いします。

  • GoToRecord の使い方

    単票フォームにテーブル1のフィールド1が紐付いてテキストボックス(フィールド1)があり、 もう一つテキストボックス(txt移動用)を作り、 その値のレコードに移動するようにしたいのですが、 Private Sub txt移動用_AfterUpdate() DoCmd.GoToRecord acDataForm, Me, acGoTo, Me.txt移動用.Value End Sub とすると、 "実行時エラー2498 指定した式は、 いずれか の引数とデータ型が対応していません。” となってしまいます。 DoCmd.GoToRecord acDataForm, Me, acGoTo, CLng(Me.txt移動用.Value) にしても同じでした。 フィールド1には数値が入っていて、データ型も数値です。 どこを修正すればいいか教えてください。 (添付画像は、現在1レコード目で、2レコード目に移動しようとしているとこです)

  • ACCESSのMVBかな?

    ACCESSの検索した結果をテーブルのところに転記する方法はありますか? 例)入力フォームで顧客が多い為「あ」と押してあ行の顧客(顧客情報はID・顧客名など)を検索して別のフォームを開き そこに転記というコマンドのボタンを押すと元の入力フォームに顧客IDが入力される なんてMVBのプログラム教えてもらえませんか? 現状最後の転記だけ出来てません  Option Compare Database Option Explicit Private Sub コマンド7_Click() If kdck = 1 Then Forms![借用入力F]![顧客ID] = Me![顧客ID] DoCmd.Close DoCmd.Close DoCmd.GoToControl "運転者名" End If End Sub Private Sub 閉じる_Click() DoCmd.Close End Sub とあるところから参考でコピーしたMVBのプログラムですがまったく初心者で理解できていません。 どなたか助けてください。

専門家に質問してみよう