Access2000で、あるイベントに参加した人のデータベースを作りました。

検索用フォームで「氏名」と「生年月日」で検索し、その人の情報を別の
フォームで見ることができるようになっています。

該当者がいない場合は、新しいレコードにそのデータを追加します。

検索結果を表示するフォームに個人情報を表示・書き込みできる画面を開く
ためのボタンがあるのですが、このボタンをクリックした時に、常に新規
レコードで開きたいのですが、コードはどのように記述すればよろしいの
でしょうか?

ちなみに、いまは下記のようなコードになっています。

「新規登録ボタン」は個人情報を表示・書き込みできる画面を開くためのボタン
「応募者」は個人情報を表示・書き込みできるフォーム
です。

Private Sub 新規登録ボタン_Click()
On Error GoTo Err_新規登録ボタン_Click

Dim stDocName As String
Dim stLinkCriteria As String

stDocName = "応募者"
DoCmd.OpenForm stDocName, , , stLinkCriteria

Exit_新規登録ボタン_Click:
Exit Sub

Err_新規登録ボタン_Click:
MsgBox Err.Description
Resume Exit_新規登録ボタン_Click

End Sub

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

A 回答 (2件)

DoCmd.OpenForm stDocName, , , stLinkCriteria



DoCmd.OpenForm stDocName, , , stLinkCriteria, acFormAdd

で解決しませんか。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
チャレンジしてみます。

お礼日時:2001/11/30 15:41

DoCmd.OpenForm stDocName, , , stLinkCriteria,acFormAdd


として下さい。新規入力画面で開きます。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2001/11/30 15:25

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

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

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...続きを読む

QAccess2003でフォームにあるコマンドボタンで更にフォームを開く

Access2003でフォームにあるコマンドボタンで更にフォームを開くときのVBA記述で困っています。


Access2003で社員情報管理のデータベースを作成中です。
社員の情報を入力するにあたり、【基本情報】と【詳細情報】とでフォームを分けてあり、【詳細情報】を入力したい場合は、"基本情報フォーム"にあるコマンドボタンをクリックして"詳細情報フォーム"を開くようになっています。

この際、"基本情報フォーム"で開いている社員の【社員番号】を"詳細情報フォーム"の【社員番号】欄にも自動的に表示させるため、以下のようなVBAを記述しました。

Private Sub コマンドボタン_Click()

DoCmd.OpenForm "詳細情報フォーム"

Forms![詳細情報フォーム![社員番号].DefaultValue = Me![社員番号]

End Sub

【社員番号】は7ケタの半角英数で、社員によって、数字だけの場合と、英数混じっている場合とがあります(データ型はテキスト型にしてあります)。

困っているのは、

1.上記を実行した際に、数字だけの社員番号は問題ないのですが、英数混じりの場合だと"社員番号"テキストボックスが「#Name?」という表示になってしまう

2."基本情報フォーム"のコマンドボタンをクリックして新規の"詳細情報フォーム"を開き(社員番号のみが反映され、他の項目は空欄の状態)、詳細情報を入力→保存したあと、別の社員番号で"基本情報フォーム"を開き、コマンドボタンで"詳細情報フォーム"を開くと、前に入力した社員の情報が出てきてしまう。
(つまり、"詳細情報フォーム"のもととなるテーブルに、1行でもレコードがあると、それが出てきてしまう。)

【詳細情報】は、
1.データを入力する社員としない社員とがいる
2.新規でレコードを作成する場合と、既存のレコードを上書きする場合とがある

ので、もととなる"詳細情報テーブル"にその【社員番号の】レコードがなければ新規入力画面を、レコードがあればそのレコードを呼び出す形にしたいのですが、英数混じりの表示の件も含め、どうすれば、正しく表示されるか教えていただきたいです。
ぜひぜひよろしくお願いします。

Access2003でフォームにあるコマンドボタンで更にフォームを開くときのVBA記述で困っています。


Access2003で社員情報管理のデータベースを作成中です。
社員の情報を入力するにあたり、【基本情報】と【詳細情報】とでフォームを分けてあり、【詳細情報】を入力したい場合は、"基本情報フォーム"にあるコマンドボタンをクリックして"詳細情報フォーム"を開くようになっています。

この際、"基本情報フォーム"で開いている社員の【社員番号】を"詳細情報フォーム"の【社員番号】欄にも自動的に表示させるため、...続きを読む

Aベストアンサー

> "詳細情報フォーム"のもととなるテーブルに、1行でも
> レコードがあると、それが出てきてしまう。

これに関しては、
 a)詳細情報フォームのレコードソースに使用している
  テーブルから、基本情報フォームのデータを絞り込み
  条件とするクエリを作成し、これを詳細情報フォーム
  のレコードソースにする
 b)詳細情報フォームを開くときに、基本情報フォームの
  データでフィルタを掛ける
の、おおまかに2種類の対処方法があります。

使い勝手などからすると「a」の方がよいのですが(→「b」
の方法だと、右クリックメニューなどでフィルタを解除すると
現状と同じになってしまう)、現状からの改変が少ない分、
わかりやすいと思われる、「b」の方法を以下に提示します:
(英数混じりの場合への対処も組み込み済みです)

Private Sub コマンドボタン_Click()

  '変数の宣言
  Dim strCode As String

  '『社員番号』を「"」(ダブルクォート)で囲んだ形で記録
  '(→既定値やフィルタ条件に文字列を指定するには必須)
  strCode = Chr(34) & Me![社員番号] & Chr(34)

  '社員番号をフィルタ条件として指定して詳細情報を表示
  '(詳細情報未登録の社員の場合は、空のレコードが表示されます)
  DoCmd.OpenForm "詳細情報フォーム", , , "社員番号=" & strCode

  '既定値(DefaultValue)を設定
  '(既定値への代入なら、入力済みのデータは変更されません)
  Forms![詳細情報フォーム]![社員番号].DefaultValue = strCode

End Sub


・・・以上です。
コード中のコメントにも書きましたが、文字列を既定値やフィルタ
条件に使用する場合は、ダブルクォート(場合によってはシングル
クォート)を括ってやる必要がある、ということです。
(そうしないと、社員番号が「ABC123」の場合、その文字列では
 なく「ABC123」というフィールドやコントロールの値が参照されます
 (→そして該当するものがないので「#Name?」エラーが発生、と))

なお、日付/時刻型のデータを扱い場合は、今度は「#」で値を
括ってやる必要があります(「#2010/05/06#」など)ので、併せて
今後の参考まで。

> "詳細情報フォーム"のもととなるテーブルに、1行でも
> レコードがあると、それが出てきてしまう。

これに関しては、
 a)詳細情報フォームのレコードソースに使用している
  テーブルから、基本情報フォームのデータを絞り込み
  条件とするクエリを作成し、これを詳細情報フォーム
  のレコードソースにする
 b)詳細情報フォームを開くときに、基本情報フォームの
  データでフィルタを掛ける
の、おおまかに2種類の対処方法があります。

使い勝手などからすると「a」の方がよいのですが(→「b」
の...続きを読む

Qシートのボタンからフォーム出した場合、チェックボタンの動作がうまくいきません

フォーム上の2つのチェックボタンをトグルさせたいのですが、シート上に設定したコマンドボタンからフォームを表示させると、トグルがうまくいきません。
尚、メニューからフォームを表示させた場合、正しく動作します。
回避させる手段はあるでしょうか?
これはエクセルの仕様なのでしょうか?
Excel2003です(英語版)。英語版Windows7Proです。

フォームのVBA
Private Sub UserForm_Initialize()
  CheckBox1.Value = True
  CheckBox2.Value = False
End Sub
Private Sub CheckBox1_Click()
  CheckBox1.Value = True
  CheckBox2.Value = False
End Sub
Private Sub CheckBox2_Click()
  CheckBox2.Value = True
  CheckBox1.Value = False
End Sub

シートのVBA
Private Sub CommandButton4_Click()
  sb_UserForm1Show
End Sub

標準モジュール
Sub sb_MenuCreate()
  sb_MenuDelete
  Dim myMnu As Object
  Dim Cap_P As String
  Cap_P = "Prototype"
  Set myMnu = CommandBars("Worksheet menu bar").Controls.Add(Type:=msoControlPopup, Before:=3)
  With myMnu
    .Caption = Cap_P
  End With
  sb_Menu01 Cap_P, "Delete This Menu", "sb_MenuDelete"
  sb_Menu01 Cap_P, "RecoverTest", "RecoverTest"
  sb_Menu01 Cap_P, "Clear DataBase", "sb_ClearDatabaseConf"
  sb_Menu01 Cap_P, "Show All Data", "sb_ShowAllData"
  sb_Menu01 Cap_P, "Remove Autofilter", "sb_RemoveAutofilter"
  sb_Menu01 Cap_P, "Add Autofilter", "sb_AddAutofilter"
  sb_Menu01 Cap_P, "Remove Sub Total", "sb_RemoveSubtotal"
  sb_Menu01 Cap_P, "Add Sub Total", "sb_AddSubtotal"
  sb_Menu01 Cap_P, "Load Form", "sb_UserForm1Show"
  sb_Menu01 Cap_P, "Import to FishDataBase", "sb_Main01"
End Sub

Sub sb_Menu01(Cont_P As String, Cap_P As String, On_Act As String)
'Menu Create submodule
  With CommandBars("Worksheet menu bar").Controls(Cont_P)
    .Controls.Add(Type:=msoControlButton, Before:=1).Caption = Cap_P
    .Controls(Cap_P).OnAction = On_Act
  End With
End Sub

Sub sb_UserForm1Show()
  UserForm1.Show
End Sub

フォーム上の2つのチェックボタンをトグルさせたいのですが、シート上に設定したコマンドボタンからフォームを表示させると、トグルがうまくいきません。
尚、メニューからフォームを表示させた場合、正しく動作します。
回避させる手段はあるでしょうか?
これはエクセルの仕様なのでしょうか?
Excel2003です(英語版)。英語版Windows7Proです。

フォームのVBA
Private Sub UserForm_Initialize()
  CheckBox1.Value = True
  CheckBox2.Value = False
End Sub
Private Sub CheckBox1_Click()...続きを読む

Aベストアンサー

そのような処理に適したオプションボタンがあるにも拘らず
なぜ、チェックボックスを使うのか、ん? という感じではありますが、、、

ま、それは置いといて。。。。

提示のコードではCheckBoxのClickイベントが発生し続けるので
質問の動作は当たり前の動作になります。


 Private Sub UserForm_Initialize()
   CheckBox1.Value = True  ●CheckBox1のClickイベント発生

 Private Sub CheckBox1_Click()
   CheckBox1.Value = True  ●CheckBox1のClickイベント発生


▼~▲のClickイベントが発生し続けるのでストップしているように見えるわけです。

これは、CheckBox1,2のClickイベントの最初に、
MsgBox "box1"など入れてみれば確認できますね。

で、CheckBoxのClickイベントを止めてやればいいわけですが、
UserFormには、Application.EnableEventsなどのメソッドがないので
普通はフラグを使ったりしますが、
今回の場合は、Changeイベントの性質を利用してもできます。

●Changeイベントを使う方法
'--------------------------------------------
Private Sub UserForm_Initialize()
   CheckBox1.Value = True
End Sub
'-------------------------------
Private Sub CheckBox1_Change()
   CheckBox2.Value = Not CheckBox1.Value
End Sub
'-------------------------------
Private Sub CheckBox2_Change()
   CheckBox1.Value = Not CheckBox2.Value
End Sub
'---------------------------------------------

UserForm_Initializeでチェックするのは、CheckBox1だけで十分だと思います。

 
●また、フラグを使う方法は、Clickイベントの部分で
  If Flag = True Then Exit Sub
などとしてClickイベントの処理をジャンプする方法です。
これはご自分で考えてみてください。


最初でも言いましたが、
今回のような処理は、オプションボタンを使うべきかと。
ま、いろいろ理由はあるのでしょうが。。。
以上です。

そのような処理に適したオプションボタンがあるにも拘らず
なぜ、チェックボックスを使うのか、ん? という感じではありますが、、、

ま、それは置いといて。。。。

提示のコードではCheckBoxのClickイベントが発生し続けるので
質問の動作は当たり前の動作になります。


 Private Sub UserForm_Initialize()
   CheckBox1.Value = True  ●CheckBox1のClickイベント発生

 Private Sub CheckBox1_Click()
   CheckBox1.Value = True  ●CheckBox1のClickイベント発生


▼~▲のClickイベントが発...続きを読む

QAccess2000 単票フォーム上のボタンを押すと、同じIDを持つフォームが開くよういしたい

Accessの初心者です。
本当に超がつく初心者ですので、解説もしてくださるととても嬉しいです。
宜しくお願いします。



請求書番号連番を取得するフォーム(テーブルも)があります。
請求書番号は特殊な為、現時点ではじか打ちで作成しています。
それとは別に、顧客ごとに請求データを入力するフォーム(テーブルも)があります。
その二つは、請求書番号でひもづけています。



<請求書番号連番取得フォーム/帳票>
・請求書番号
・請求日
・顧客ID

<請求データの入力フォーム_A社/単票> ※これがB社、C社と複数存在します。
・顧客ID
・請求書番号
・商品CD


<請求書番号連番取得フォーム/帳票>上にボタンをつくり、そのボタンを押すと、
同じ顧客IDを持つ<請求データの入力フォーム/単票>が開けたらな・・・と思っているのですが、
わかりますでしょうか・・・・。

どうか、宜しくお願い致します。



<請求書番号連番取得フォーム/帳票>
_________________________________________________________________
請求書番号|請求日 |顧客ID| 
_________________________________________________________________
09BB87ZZ1|2009/04/01|0001 |■(ボタン)
--------------------------------------------
09BS87AA2|2009/04/10|0003 |■(ボタン)
--------------------------------------------

↑この1行目の■(ボタン)を押すと、顧客ID「0001」の請求書番号「09BB87ZZ1」の単票フォームが開き、
(請求書番号欄に「09BB87ZZ1」が入っている。)
2行目の■(ボタン)を押すと、顧客ID「0003」のフォームを開く・・・というような動きです。


説明が下手で申しわけありません。
お願いします。

Accessの初心者です。
本当に超がつく初心者ですので、解説もしてくださるととても嬉しいです。
宜しくお願いします。



請求書番号連番を取得するフォーム(テーブルも)があります。
請求書番号は特殊な為、現時点ではじか打ちで作成しています。
それとは別に、顧客ごとに請求データを入力するフォーム(テーブルも)があります。
その二つは、請求書番号でひもづけています。



<請求書番号連番取得フォーム/帳票>
・請求書番号
・請求日
・顧客ID

<請求データの入力フォーム_A社/単票>...続きを読む

Aベストアンサー

#2です。

意味合いが違ってましたね。

「顧客ID」に対応した「フォーム名」情報がテーブルで作られているとします。
もしくは、「顧客ID」と A社、B社、C社 などが紐付けされ、その社ごとに「フォーム名」情報が得られるとすると

ボタンがクリックされた時の処理例)

Private Sub ボタン_Click()
  Dim sForm As String
  Dim sWhere As String
  Dim sArg As String

  sWhere = "請求書番号='" & Me.請求書番号 & "'"
  sArg = "'" & Me.請求書番号 & "'"
  sForm = DLookup("フォーム名","テーブル名/クエリ名","顧客ID='" & Me.顧客ID & "'")
  DoCmd.OpenForm sForm, , , sWhere, , , sArg
End Sub


呼ばれた各「請求データの入力フォーム」での処理

Private Sub Form_Open(Cancel As Integer)
  If (Me.Recordset.RecordCount = 0) Then
    Me.請求書番号.DefaultValue = Me.OpenArgs
    DoCmd.GoToRecord , , acNewRec
'☆    Me.ラベル1.Caption = "新規"
'☆  Else
'☆    Me.ラベル1.Caption = "既存"
  End If
End Sub


※「顧客ID」に対応した「フォーム名」情報ではなく、「会社名」なり「会社ID」が得られるのであれば以下のような感じかと
(会社IDが得られるとした場合)

Private Sub ボタン_Click()
  Dim sForm As String
  Dim sWhere As String
  Dim sArg As String

  sWhere = "請求書番号='" & Me.請求書番号 & "'"
  sArg = "'" & Me.請求書番号 & "'"
  Select Case DLookup("会社ID","テーブル名","顧客ID='" & Me.顧客ID & "'")
    Case 1
        sForm = "請求データの入力フォームA"
    Case 2
        sForm = "請求データの入力フォームB"
    Case 3
        sForm = "請求データの入力フォームC"
    Case Else
        sForm = "請求データの入力フォームETC"
  End Select
  DoCmd.OpenForm sForm, , , sWhere, , , sArg
End Sub

#2です。

意味合いが違ってましたね。

「顧客ID」に対応した「フォーム名」情報がテーブルで作られているとします。
もしくは、「顧客ID」と A社、B社、C社 などが紐付けされ、その社ごとに「フォーム名」情報が得られるとすると

ボタンがクリックされた時の処理例)

Private Sub ボタン_Click()
  Dim sForm As String
  Dim sWhere As String
  Dim sArg As String

  sWhere = "請求書番号='" & Me.請求書番号 & "'"
  sArg = "'" & Me.請求書番号 & "'"
  sForm = DLookup(...続きを読む

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...続きを読む


人気Q&Aランキング

おすすめ情報