Private Sub cmd次_Click()

On Error GoTo Err
DoCmd.GoToRecord , , acNext
Exit_Click:
Exit Sub

Err:
MsgBox "この先にレコードがなくなると、ここをつうかするのだろうか。"
Resume Exit_Click


End Sub


一連の流れについて,ご解説ください。よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

詳しくは、DoCmd.GoToRecord・・・の行にブレークポイント(F9)を仕掛けてコードを実行し、止まった位置から1行ずつ実行(F8)させると分かります。





*****エラー処理の色々************
Sub cmd次_Click()
 MsgBox "1"
 On Error Resume Next '以後エラーが起きても無視する
 DoCmd.GoToRecord , , acNext
 If Err <> 0 Then 'エラーが起きていれば
  MsgBox "2"
 End If
 On Error GoTo 0 '以後エラーが起きたら、エラーになる
 MsgBox "3"
End Sub

'DoCmd.GoToRecord・・・でエラーなら1,2,3、エラーでなければ1,3

*****************
Sub cmd次_Click()
 MsgBox "1"
 On Error GoTo ErrTrap 'エラーが起きた時点でErrTrapにジャンプ
 DoCmd.GoToRecord , , acNext
 MsgBox "2"
 MsgBox "3"

Exit_Click:
 MsgBox "4"
Exit Sub
ErrTrap:
 MsgBox "5"
 Resume 'エラーをクリアして、再トライ
End Sub
'エラー時は、1,5,5,5,5・・・(次レコードに移動できるようになるまで、繰り返し) 、非エラー時は1,2,3,4
*******************
Sub cmd次_Click()
 MsgBox "1"
 On Error GoTo ErrTrap 'エラーが起きた時点でErrTrapにジャンプ
 DoCmd.GoToRecord , , acNext
 MsgBox "2"
 MsgBox "3"

Exit_Click:
 MsgBox "4"
Exit Sub
ErrTrap:
 MsgBox "5"
 Resume Next'エラーをクリアして、エラーの次の行にジャンプ
End Sub
'エラー時は、1,5,2,3,4 、非エラー時は1,2,3,4
*******************
Sub cmd次_Click()
 MsgBox "1"
 On Error GoTo ErrTrap 'エラーが起きた時点でErrTrapにジャンプ
 DoCmd.GoToRecord , , acNext
 MsgBox "2"
 MsgBox "3"

Exit_Click:
 MsgBox "4"
Exit Sub
ErrTrap:
 MsgBox "5"
 Resume Exit_Click 'エラーをクリアして、Exit_Clickにジャンプ
End Sub
'エラー時は、1,5,4 、非エラー時は1,2,3,4
*******************
    • good
    • 0

On Error GoTo ラベルは


それ以降の処理でエラーが発生したときにラベルにジャンプします。

次の行が繰り返し文ですが、処理中にエラーが発生したときは繰り返しを中止してErrへジャンプしてエラーメッセージを表示してEnd Subで終了します。

エラーが無ければ条件まで繰り返し処理を行いExit Subで終了します。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QADOでRecordsetオブジェクトをレコードソースに設定したい

Access2000を使っています。リンクテーブルを使わずに、ODBCで繋いだDBのテーブルをフォームのレコードソースにセットしたいのですが、可能でしょうか。

宜しくお願いします。

Private Sub FormNoKansu()
Dim cn as New ADODB.Connection
Dim rs as New ADODB.Recordset
Dim strSql as String

'ODBCでサーバーに接続
cn.ConnectionString = "ODBCでMySQLに..."
...
strSql = "SELECT * FROM ..."
rs.Open strSql, cn

'ここに[rs]を入れられたらと思っています
Me.Recordset = ""

End Sub

Aベストアンサー

Set rs = New ADODB.Recordset
rs.Open strSql, cn, adOpenKeyset, adLockReadOnly

'フォームへ抽出レコードセット セット
Set Forms!["このモジュールを実行しているフォーム名"].Form.Recordset = rs

これでは如何でしょうか?

QVBA Private Sub Worksheet_Calculate()

「ユーザー定義関数」で計算されるセルがセルB2にある場合、シートモジュールの
Private Sub Worksheet_Calculate()で、他の再計算は無視し、そのユーザー定義関数が計算されたことを判断するためにはどのような記述をすればいいのでしょうか?

Aベストアンサー

こんにちは。

大分梃子摺っていらっしゃいますね。
今回のコードでシート名の変更を捕らえたければ
Calculateイベントではなく
ユーザー定義関数そのものでやったらどうですか。

間違いなくする為に、新しいブックで以下のコードをテストしてください。


簡単の為に、"sheet1"だけの変更に対応。

---------------------------------------------
(標準モジュール)


Public OldName As String 'パブリック変数


Function Sheetname(ByVal Target As Range) As String

 Application.Volatile
 Sheetname = Target.Parent.Name

 If OldName = "" Then
   OldName = Sheetname
 End If

 If OldName <> Sheetname Then
  MsgBox OldName & "が " & Sheetname & " に変更されました"
  OldName = Sheetname
  End If

End Function
---------------------------------------------

コードを書いたあと、Sheet1のA1に、=sheetname(A1) を入れておく


ようは、以前のシート名を保持しておき
ユーザー定義関数が再計算されるとき比較するだけです。

もちろん、Calculateイベントで同様のことをしてもOKですよね。

何回も言うようですが、このサンプルは、ユーザー定義関数の入っている、シート1つだけに対応です。

全てのシートに対応したい場合は、ちょっと考えてみてください。
以上です。
 

こんにちは。

大分梃子摺っていらっしゃいますね。
今回のコードでシート名の変更を捕らえたければ
Calculateイベントではなく
ユーザー定義関数そのものでやったらどうですか。

間違いなくする為に、新しいブックで以下のコードをテストしてください。


簡単の為に、"sheet1"だけの変更に対応。

---------------------------------------------
(標準モジュール)


Public OldName As String 'パブリック変数


Function Sheetname(ByVal Target As Range) As String

 Application...続きを読む

QDocmd.Findrecordで空白の検索方法

 フォームのレコードで空白レコードを検索したいのですが、Docmd.Findrecord null としたらうまくいきませんでした。どうしたら検索できるのでしょうか?

Aベストアンサー

Findrecordの第1引数FindWhatには値しか指定できません
(nullは値じゃありません)
DAOのFindFirstなら式が使用出来ますよ

Private prst As DAO.Recordset
Private Sub コマンド24_Click()
Set prst = Me.Recordset
prst.FindFirst "フィールド名 is null"
End Sub

QVBAで指定したパスが存在しなければ、アラートを表示させずにExit Subの処理をしたい

Sub s()
Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate ("X:")
End Sub

上記のVBAを実行するとXドライブがなければ
「'file:///X:' が見つかりません。パスまたはインターネットアドレスが正しいかどうかを確認してください。」と表示されます。
指定したパスが存在しなければ、このメッセージを表示させずにExit Subの処理をするようにするにはどうすればよいのでしょうか?

使用OS:Windows XP
使用ソフト:Microsoft Excel 2003

ご存知の方がおられましたらご回答をよろしくお願いします。

Aベストアンサー

こんばんは。
インターネット共用となると、以下のコードでは中途半端になりますが、以下のように区分けは出来ます。


'---------------------------
  Dim fso As Object
  Dim objIE As Object
  Dim flg As Boolean
  Const mDrive As String = "C:"
  If InStr(1, mDrive, "HTTP://", vbTextCompare) = 0 Then
    Set fso = CreateObject("Scripting.FileSystemObject")
    flg = fso.DriveExists(mDrive)
    If flg Then
      Set objIE = CreateObject("InternetExplorer.Application")
      objIE.Navigate mDrive
    End If
    Set fso = Nothing
    Set objIE = Nothing
  End If
'---------------------------

こんばんは。
インターネット共用となると、以下のコードでは中途半端になりますが、以下のように区分けは出来ます。


'---------------------------
  Dim fso As Object
  Dim objIE As Object
  Dim flg As Boolean
  Const mDrive As String = "C:"
  If InStr(1, mDrive, "HTTP://", vbTextCompare) = 0 Then
    Set fso = CreateObject("Scripting.FileSystemObject")
    flg = fso.DriveExists(mDrive)
    If flg Then
      Set objIE = CreateObject("Inte...続きを読む

QRecordCount(ADO)が変わる?ADP+SQLServer

ACCESS2000(ADP)+SQLServerにて作成したものですが、
あるクライアント(1台)だけRecordCountがおかしいのです。

<フォームAのボタンクリック時の処理>
DoCmd.OpenForm "フォームB", , , , , , Me!コード

<フォームBの読み込み時の処理>
Dim rs AS ADODB.Recordset

Set rs = Me.RecordsetClone
rs.Find "コード=" & Me.OpenArgs, 0, adSearchForward

If not rs.EOF then
Me.Bookmark = rs.Bookmark
End if

問題のないクライアント(他の2台)では、
フォームBにてOpenArgに指定したコードが検索され,
該当のレコードが表示されます。

問題のクライアントでは、
「一部」のレコードを指定した場合にレコードが検索されず、
最初のレコードが表示されました。

原因を調べているうちに分かったことは、
Set rs = Me.RecordsetClone
で取得したレコードセットがあるタイミングでは、
一部かけた状態になっているということです。

その際に使用した方法は、
Set rs = Me.RecordsetClone
rs.MoveLast
MsgBox rs.RecordCount
MsgBox rs.RecordCount

としてレコードの件数を調べて判明しました。
MsgBox rs.RecordCountが2つあるのは記述ミスではありません。

該当のテーブル(レコード)は757件ありますが、
問題のないクライアントでは2回ともに757を返します。

問題のクライアントでは、
1回目のRecordCountは500
2回目のRecordCountは757を返してきます。

しかも、何回も実行していると
1回目が400、450、500とランダムで変化します。
(500が2回続いたりするときもあります)

以上のことから、考えられる原因は何かありますでしょうか。
よろしくお願いいたします。

ACCESS2000(ADP)+SQLServerにて作成したものですが、
あるクライアント(1台)だけRecordCountがおかしいのです。

<フォームAのボタンクリック時の処理>
DoCmd.OpenForm "フォームB", , , , , , Me!コード

<フォームBの読み込み時の処理>
Dim rs AS ADODB.Recordset

Set rs = Me.RecordsetClone
rs.Find "コード=" & Me.OpenArgs, 0, adSearchForward

If not rs.EOF then
Me.Bookmark = rs.Bookmark
End if

問題のないクライアント(他の2台)では、
フォームBにてOpenArgに指定し...続きを読む

Aベストアンサー

>結局、そのクライアントではSet rs = Me.RecordsetCloneをしている時点で、Cloneを取得しようとしているRecordset自体が全て読み込まれていない状態だったのではないかと思います。

通常は
Forms!フォームB.RecordsetClone.MoveLast
MsgBox "レコード数は、" _
& Forms!フォームB.RecordsetClone.RecordCount _
& "です。", vbInformation, "レコード数"
でカウント出来ますからね。
:位置付けをサポートしていない場合すべてのレコードを取得して数えなければ正確なRecordCount値がわからない。
フォームのレコードソースじゃ全て読込済みでなければカウント出来ないですよね。
1回目のRecordCountは読込途中なのでその時によってランダムなカウント。2回目のRecordCountは最後まで読込んだカウントという事で解決して良かったです。

QGoToRecord の使い方

単票フォームにテーブル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レコード目に移動しようとしているとこです)

Aベストアンサー

> DoCmd.GoToRecord acDataForm, Me, acGoTo, Me.txt移動用.Value

GoToRecord のところをクリックしてF1キーを押してください。
GoToRecord メソッドのヘルプが開きます。

そこの説明で 第2引数の説明は下記のようになっています。

引数 objecttype で選択した種類のオブジェクトの有効な名前を文字列式で指定します。


ですので、ANo.1 の回答のように直接名前を指定してればいいことが分かります。
あるいは、

DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, Me.txt移動用.Value

とすればいいです。こちらだと、何かの都合でフォーム名を変更してもコードを変更する必要はありません。

あるいは、ヘルプの下記の部分に着目すれば、

引数 objecttype および objectname を指定しないと、objecttype に定数 acActiveDataObject (既定値) が使われ、アクティブ オブジェクトと見なされます。


DoCmd.GoToRecord , , acGoTo, Me.txt移動用.Value

と省略してもいいことが分かります。

ヘルプは十分に活用しましょう。

> VBAでmeは使わない方が良いようですね!

VBAでこそMeを使うべきです。それ以外の場面ではつかえません。

> DoCmd.GoToRecord acDataForm, Me, acGoTo, Me.txt移動用.Value

GoToRecord のところをクリックしてF1キーを押してください。
GoToRecord メソッドのヘルプが開きます。

そこの説明で 第2引数の説明は下記のようになっています。

引数 objecttype で選択した種類のオブジェクトの有効な名前を文字列式で指定します。


ですので、ANo.1 の回答のように直接名前を指定してればいいことが分かります。
あるいは、

DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, Me.txt移動用.Value

とすればいいです。こち...続きを読む

QADODBのRecordset.Deleteのエラーについて誰か助けてください!!

データベースはAccess2000 プロバイダはJet4.0です。

(1)まずレコードがない状態でレコードを追加します。
(2)そのまま削除ボタンを押します。
(3)エラーが発生します。
「行が見つからなかったため更新できません。列の値は最後に読み込
  まれた後で変更された可能性があります。」
(4)終了し起動します。
(5)なぜかレコードが1件あります。(削除が失敗?)
(6)削除します。メッセージボックスがでて削除成功します。
 このときレコードはありません。(データグリッド上)
(7)レコードを追加します。成功します。
(8)削除するとデータグリッド上ではレコードがあるのに
 メッセージボックスが出て追加を促してきます。
(9)追加して削除するとまたメッセージボックスが出てきます。
 このときデータグリッド上のレコードは増えています。
 (8)~(9)が繰り返しおきます。

その後vbを終了させてAccessで内容を確認するとレコードが増えていますが、
顧客IDフィールドの増加処理がされていなくすべて1になっています。

Update,Addnew,Deleteメソッドの理解が不十分なのか、カーソルの位置
の理解不足なのかわかりません。
どなたか手を貸してください。

Private Sub cmdDelete_Click()

If Rs.RecordCount = 0 Then
MsgBox "レコードがありません。追加してください。", vbOKOnly
Exit Sub
End If

Rs.Delete

If Rs.RecordCount = 0 Then
MsgBox "レコードがありません。追加してください。", vbOKOnly
Exit Sub
End If

Rs.MoveNext
If Rs.EOF Then
Rs.MoveLast
End If

End Sub

Private Sub cmdNew_Click()

Rs.AddNew "顧客ID", "増加する処理済"

End Sub

Private Sub cmdUpdate_Click()

Rs.Update

End Sub

データベースはAccess2000 プロバイダはJet4.0です。

(1)まずレコードがない状態でレコードを追加します。
(2)そのまま削除ボタンを押します。
(3)エラーが発生します。
「行が見つからなかったため更新できません。列の値は最後に読み込
  まれた後で変更された可能性があります。」
(4)終了し起動します。
(5)なぜかレコードが1件あります。(削除が失敗?)
(6)削除します。メッセージボックスがでて削除成功します。
 このときレコードはありません。(データグリッド上)
(7)レコードを追加...続きを読む

Aベストアンサー

再びmaruru01です。

>Requeryメソッドを実行しないとなぜエラーが出るのでしょうか?
質問欄のコードから察すると、フォームのLoadイベントなどでレコードセットをOpenしておいて、そのままOpenしっぱなしで、終了直前とかにCloseしているようですが、これだと、追加や削除の変更が、Openしているレコードセットに反映されません。
通常は、
Rs.Open
・・・追加や削除処理・・・
Rs.Close
という風に、1つの処理ごとにレコードセットをOpenしなおします。
Requeryメソッドは、Closeして元の条件のままOpenするという動作ですので、これを入れるとOpenし直すことになり、変更が反映されるわけです。

>あるtextbox
>に何も入力しなかった場合は更新が成功するのですが、ある文字列を
>入力後、その文字列すべてを削除した場合、「長さ0の文字列を格納する
>ことはできません。」といったようなエラーが出るのですが、これは
>どうすればいいのでしょうか?
何も入力していない状態では、連結したフィールドに"Null"を格納し、いったん何かを入力して削除すると、長さ0の文字列""を格納します。
長さ0の文字列(空文字列)とNull値は違う扱いになります。
エラーを回避するには、そのテキストボックスに連結したフィールドのプロパティの、[空文字列の許可]を"はい"にします。

再びmaruru01です。

>Requeryメソッドを実行しないとなぜエラーが出るのでしょうか?
質問欄のコードから察すると、フォームのLoadイベントなどでレコードセットをOpenしておいて、そのままOpenしっぱなしで、終了直前とかにCloseしているようですが、これだと、追加や削除の変更が、Openしているレコードセットに反映されません。
通常は、
Rs.Open
・・・追加や削除処理・・・
Rs.Close
という風に、1つの処理ごとにレコードセットをOpenしなおします。
Requeryメソッドは、Closeして元の条件のままO...続きを読む

Qaccess レコードソースを選択し、DoCmd.OpenFormする方法

Select Caseのフレームで、レコードソース(クエリ)を選択し、
そのソースを基にDoCmd.OpenFormする方法がわかりません。
よろしくお願いします。
----------------------------------------------------
Dim strSource As String
Dim Q1, Q2 As String
Dim stDocName As String
Dim フォーム1 As Form
stDocName = "フォーム1"
Q1 = "クエリ1"
Q2 = "クエリ2"

Select Case フレーム1
Case 1
strSource = Q1
Case 2
strSource = Q2
End Select

'stDocName.RecordSource = strSource '-----この文はこの位置でよいのでしょうか?
DoCmd.OpenForm stDocName, acFormDS
----------------------------------------------------
クエリ1,クエリ2は基になるテーブルが違いますが、フィールドは同一にしてあります。
ですのでフォーム1には、対応するテキストボックスは用意してあります。

Select Caseのフレームで、レコードソース(クエリ)を選択し、
そのソースを基にDoCmd.OpenFormする方法がわかりません。
よろしくお願いします。
----------------------------------------------------
Dim strSource As String
Dim Q1, Q2 As String
Dim stDocName As String
Dim フォーム1 As Form
stDocName = "フォーム1"
Q1 = "クエリ1"
Q2 = "クエリ2"

Select Case フレーム1
Case 1
strSource = Q1
Case 2
strSource = Q2
End Select

'stDocName.RecordSo...続きを読む

Aベストアンサー

<1>

Private Sub コマンド0_Click()
  DoCmd.OpenForm "フォーム1", acFormDS
  Forms("フォーム1").RecordSource = "クエリ" & Me.フレーム1
End Sub

<2>

Private Sub コマンド1_Click()
  DoCmd.OpenForm "フォーム1", acFormDS, , , , , "クエリ" & Me.フレーム1
End Sub

' ------------------------------------------
' [フォーム1] ロード時にレコードソース設定
' ------------------------------------------
Private Sub Form_Load()
  If Len(Me.OpenArgs & "") > 0 Then
    Me.RecordSource = Me.OpenArgs
  End If
End Sub

まあ、好き好きでしょうが<2>がOKのバージョンであれば<2>がお勧めです。

<補足>

ただ、WhereCondition を使うのが一般的かと思います。
全く異なるクエリであれば、それぞれに対応したフォームを用意した方がシンプルでは・・・。

<1>

Private Sub コマンド0_Click()
  DoCmd.OpenForm "フォーム1", acFormDS
  Forms("フォーム1").RecordSource = "クエリ" & Me.フレーム1
End Sub

<2>

Private Sub コマンド1_Click()
  DoCmd.OpenForm "フォーム1", acFormDS, , , , , "クエリ" & Me.フレーム1
End Sub

' ------------------------------------------
' [フォーム1] ロード時にレコードソース設定
' ------------------------------------------
Private Sub Form_Load()
  If Len(Me.OpenArgs & "") > ...続きを読む

Q"reached gold record status"の意味

"reached gold record status"の意味

米国のミュージシャンについての紹介文に、"reached gold record status"という記述があります。ゴールドレコード賞についてだと思いますが、これは実際に受賞したという解釈でよいのでしょうか。それとも、そのくらいのレコード売上を記録したという意味なのでしょうか。お教えいただければ幸いです。よろしくお願いします。

Aベストアンサー

その方面の知識がないので憶測ですが、私は質問者さまがあげられた後者の方だと思います。
あくまでもその status (状態)に reach (達した)ということではないのかと考えます。
また、50万枚以上の売り上げがあれば Gold Record で、100万枚以上になると Platinum Record、そして1,000万枚を超えると Diamond Record となるそうです。

参考URL:http://www.essortment.com/all/whatisgoldrec_rixf.htm

QAccessでOn Error GoTo Errorを記載する場所について

エラートラップを記載しようと思ったのですが、エラートラップはどういう場所に書くべきでしょうか?
例えば、下記のような場合にもエラートラップは書くべきでしょうか?

Private Sub txt_Enter()
test = 1
End Sub

エラートラップを書くべき箇所の基準みたいな物があればご教示いただければと思います。
よろしくお願いします。

Aベストアンサー

私の場合、On Error Goto の書く基準は以下です。
・リソース関連の操作を行う場合に記述します。
(ハード的な条件は、ソフトでは予測できない為です)
・On Error Goto 発生時に処理すべき事がある場合
(ファイルのClose、recordesetのCloseなどがある場合)
・エラーメッセージを独自に表示したい場合
・Accessの特定のエラーを無視したい場合
(たとえば、フォーカスのあるコントロールをEnabled=false する場合など、Errの値を識別しResume Nextするなどしています。)


上記、一例ですが On Error Gotoを記述すべきか否かを判断しています。


人気Q&Aランキング

おすすめ情報