• ベストアンサー

アクセス2000VBAのエラー

以前も質問させていただきました。 If文でエラー回避でしようとして Cancel = True という構文を使っているのですが、近頃この文が 「変数の定義がされていません」というエラーになります。 なんでエラーがでるのかわかりません。 書くと必ずといって良いほどエラーになります。 原因はなんなのでしょうか? このごろは、エラーでつかえないのでundoを使用しています。undoとcancelの違いもできればご教授ください。

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

  • ベストアンサー
  • keikan
  • ベストアンサー率42% (75/176)
回答No.3

コードウインドウが選択された状態でメニューの[表示]-[デバッグウインドウ]にあります。 変数や式のウォッチを表示したり、 コマンドを入力して実行させたり確認したりできる物です。 またコンパイルはデバッグですべてのモジュールをコンパイルして保存を1度は実行しておいてください。 VBAにおいて通常コードを入力して実行すると、 事前にコンパイルされていなければその都度実行時にコンパイルされ実行されます。(インタープリター呼ばれるところ)実行をスムーズに行うために事前コンパイルを上記方法で行っています。 この時点でエラーが起こるのかどうか確認してください。 また、Cancelはイベントプロシージャーの引数として各関数で宣言されているものですので、関数の引数にCancel が定義されていなければ使えません。 BeforUpdateにはありますが、AfterUpdateにはなかったと思います。利用されるイベントを確認してください。

asuka546
質問者

お礼

いろいろいじっているうちに、イベントで()内にCancel As Integerと書かれているものしか、cancelが実行できないのに気が付きました。 いろいろご回答いただきありがとうございます。 デバッグウィンドウなのですが、私は2000を使っているのでイミディエイトウィンドウのことのようです。 コンパイルは活用していたのですが。 ウォッチやイミディエイトは活用したことがありませんでした。今後、勉強して活用しようと思います。 本当に、ありがとうございました。

その他の回答 (2)

回答No.2

> Private Sub ○○_AfterUpdate() 上記のイベントは更新後処理ですので、 CancelではなくUndo(処理の取り消し)になります。 Private Sub ○○_BeforeUpdate(Cancel As Integer) のような、更新前処理のイベントであれば、 Cancel(処理の中止)を行なえます。

asuka546
質問者

お礼

ご回答いただきありがとうございます。 cancelに付いては、どうにかいじっているうちに使えるイベントとそうでないイベントあることに気が付きました。 undoとcancelの違いについてご教授ありがとうございます。 すごくわかりやすかったです。

  • keikan
  • ベストアンサー率42% (75/176)
回答No.1

コンパイルし直してみてください。 あとはデバッグウインドウでCancel(+Enterキー)と入力してみてください。 回避できるかもしれません。

asuka546
質問者

補足

すいません。デバッグウィンドウとはなんでしょうか? ちなみにコンパイルの時点でエラーメッセージが出ます。 実行してデバッグを出すと、最初の Private Sub ○○_AfterUpdate() の部分が黄色くなりました。

関連するQ&A

  • InputBox キャンセルボタンが押された時の処理

    こんばんは。 Sub test() Dim タイトル As String タイトル = InputBox("タイトルを入力してください。") If Cancel = True Then Exit Sub ’次のコード・・・ ’次のコード・・・ End Sub このコードを実行した時に 下記のダイアログが出てきて 右のキャンセルボタンを押すと、 「If Cancel = True Then Exit Sub」 でsubステートメントを抜けたいのですが 「Cancel」の部分が 「変数が定義されていません」とエラーになってしまいます。 Dim Cancel As Boolean を追加してキャンセルボタンを押しても TrueではなくFalseになってしまいます。 回避方法を教えてください。 よろしくお願いします。

  • エクセル VBA について

    エクセルで、 ダブルクリックしたら"*"を表示したい範囲に【入力】という名前をつけ、 ダブルクリックしたら9つ左のセルの内容を表示したい範囲に【金額】という名前をつけ、 二つの構文?をVisual Basicに作成したんですが、エラーが出てしまいます。 ひとつずつだと上手くいくのですが、なぜでしょうか? わかる方教えてください。 あと申し訳ないのですが、VBAはまったくわからないため、ネット上で構文をコピーして貼り付けました。 そんな者でもわかる修正の説明をお願いいたします。 以下が作成し、エラーとなってしまう構文です。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const RangeName As String = "金額" If Target.Value = "" Then Target.Value = Target.Offset(0, -9).Value Cancel = True End If End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const RangeName As String = "入力" If Not Intersect(Range(RangeName), Target) Is Nothing Then Cancel = True If Target = "*" Then Target = "" Else Target = "*" End If End If End Sub

  • 空白ならば vba エラーになる IsNull

    If IsNull(Forms("フォーム").Cntrols("年度別").Value) = True Then End If このコードは何がおかしいですか? 実行時エラー2465になってしまいます。 コントロールが空白なら文字を入れて、空白じゃないなら mystr = Forms("フォーム").Cntrols("年度別").Value のようにして、コントロールの値を変数に格納したいのですが、 エラーになる原因がわかりません。

  • Access2016 構文エラー

    お世話になります。 Access2003から2016へDB変更(MDB→ACCDB)をしたのですが、構文エラーになります。 2003の時には、エラーなど出ませんでしたが、エラー修正箇所を見ても、エラー該当が無いかと考えております。 どなたか、情報下さると有難く思います。 Private Sub ページヘッダー_Print(Cancel As Integer, PrintCount As Integer) Me.Section(acPageHeader).Visible = (Me!txtCnt <> 1) On Error GoTo err_shori '頁のカウント If preNo <> 得意先CD Or intP = Pkei Then intP = 0 intP = intP + 1 txt頁 = "P. " & intP '明細30行で1頁 Dim rst As Recordset, strSQL As String If intP < 2 Then txt前回請求額.Visible = True txt入金額.Visible = True txt繰越金額.Visible = True txt税抜.Visible = True txt消費税.Visible = True txt税込.Visible = True txt今回請求額.Visible = True '請求金額等の取得 Q請求金額一覧より Set rst = db.OpenRecordset("Q請求金額一覧") rst.FindFirst "得意先CD='" & 得意先CD & _ "' and 締切日 = #" & Format(締切日, "yyyy/mm/dd") & "#" If Cur_ing 得意先CD & _ rst("最大化表示",m)  どうも、「Private Sub ページヘッダー_Print(Cancel As Integer, PrintCount As Integer) 」と、最後の 「 If Cur_ing 得意先CD & _」 「 rst("最大化表示",m)」にて、構文エラーになるようです。

  • 関数の引数に未定義の変数を渡すとエラーが出る

    自作の関数で、issetとemptyを一緒に判定する関数を作っているのですがエラーが出ます。 ある変数が「未定義」または「null」または「""(空白)」の場合はnullである、という関数を作りたいです。 ------------------------------------------ function is_null_ex($value){  if (!isset($value)) {return true;}               // 未定義かnullの場合、trueを返す  else if (strlen(strval($value)) === 0) {return true;}   // 空白の場合はtrueを返す  else {return false;}                      // $valueに値が入っている場合はfalseを返す } is_null_ex($val); ------------------------------------------ 上記の関数で$valueが未定義の場合にfuncを使うと、次のようなエラーが出ます。 Notice: Undefined variable: val つまり、未定義の変数を引数に渡すとエラーが出ます。 「未定義なら関数に渡さなければ?」と思うかもしれませんが、そもそもこの関数は「未定義」または「null」または「""(空白)」を判定したい関数なのです。 この場合、どうすれば良いのでしょうか? エラーは出ますが上記の関数で「if (!isset($value)) {return true;}」の部分できちんと判定はされています。 PHP5.3系で運用しています。 ぞうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • Access 97 VBAについて

    Access VBAについて教えてください。 初心者ですが、レポートに表示されるテキストボックスの”項目名”と”内容”プロパティーに重複データ非表示にしています。そして、非表示となった部分に”〃”を表示するため別のテキストボックス、”隠しオブジェクト1”及び”隠しオブジェクト2”を配置しています。???にどんな記述が必要かわかりません。”項目名”だけであれば問題なく表示されるのですが”内容”についても同様に処理したいのです。 どうぞ宜しくお願いいたします。 Option Compare Database Option Explicit '値を保持するために外側に変数を定義します。 Dim varA As Variant --------------------------------------------------- Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)   If Me.項目名 = varA Then    Me.隠しオブジェクト1.Visible = True Else Me.隠しオブジェクト1.Visible = False End If varA = Me.項目名 ???? If Me.内容 = varA Then Me.隠しオブジェクト2.Visible = True Else Me.隠しオブジェクト2.Visible = False End If varA = Me.内容 End Sub

  • access vbaのコンパイルエラーについて

    お世話になります。 vbaは超初心者なので、説明が良くないかもしれませんがご容赦ください。 フォーム上のレコード数を一件に制限する必要があり、下記サイトを参考に作成中のデータベースに構文をあてはめてみました。 http://hatenachips.blog34.fc2.com/blog-entry-189.html サブフォーム移動時のプロシージャは、 Public Sub Form_Current() Me.AllowAdditions = Me.Recordset.RecordCount < 1 End Sub メインフォーム移動時の動作として、対象のサブフォーム名を入れて下記のような構文を 作りました。 Private Sub Form_Current() Me.新規入力 サブフォーム.Form.Form_Current End Sub ところが、「コンパイルエラー 変数が定義されていません」となってしまいました。 サブフォームコントロール名はデザインビューのプロパティで、タブの「すべて」の名前の欄にあるものだと思っているのですが、もしかしてこれが違っているのでしょうか? エラーの意味がよくわからず、困り果てています。 どなたかお力をお貸しください。 よろしくお願いします。

  • エラー VBA

    BVAを練習中です。 SubまたはFunctionが定義されていません という表示が出ますが、調べても何が原因か 分かりませんでした。 最初の行に「Sub 〇〇()」という一文もつけましたし 次に何か足りない、ということでしょうか。 Sumを使ったものを作りたいのですが、そのエラーが 出たときにSumの部分が青く反転しています。

  • ACCESS重複のチェック

    ACCESSで重複チェックをしたいと思います。 現在は電話番号テーブルだけしかありません。 電話番号のテーブルを主キーを使って重複している場合エラーメッセージを出すというものです。保存ボタンもありません。 Private Sub text電話番号_BeforeUpdate(Cancel As Integer) If IsNumeric(text電話番号) = False Then '数字チェック。 MsgBox "電話番号は数字で入力して下さい。", vbCritical Cancel = True ' 処理を取り消します。 Me.Undo End If Dim strmsg As String strmsg = "重複しています" If Not IsNull(DLookup("[電話番号]", "ダブリチェックテーブル", "[電話番号] = [text電話番号]")) Then MsgBox strmsg, 16, "ダブリチェック" Cancel = True '処理を取り消します。 Me.Undo '元に戻します。 Else Cancel = False '処理を続行します。 End If End Sub これに、企業名と出発日という項目を増やしたいと思います。 ですが、何万とある電話番号を一気に入力して調べているので、一回一回企業名と出発日を入れていると生産性が落ちます。 ですので、企業名と出発日は最初の入力だけで次のレコードに移動してを継続させたいのです。そして電話番号以外にカーソルを行かないようにしたいです。 何か良い方法があればご教授お願いします。 ちなみにいろいろ自分なりに試したのですが、重複してエラーを出した場合に企業名にカーソルが飛んだししてうまくいきませんでした。

  • ACCESS2010 実行時エラー 2766

    ACCESS2010に関しての質問です。 マクロ中にIF文で分岐を設定しています。それ自体は正常に認識されますが、そのIF文中に更にもう一つのIF文を設定すると、 実行時エラー '2766': このオブジェクトには、オートメーション オブジェクト'|'は含まれません。 というメッセージが表示されます。 構文上に誤りはないのですが、解決策が見つかりません。 どなたか教えていただけませんか? ちなみに、最初のIF文ではform上の値を判断しており、次のIF文ではテーブル上の値を判断しています。 どうかよろしくお願いします。

専門家に質問してみよう