アクセス2000で売上の管理をしています。
「管理番号」を使って伝票の処理をしているのですが、
フォームに新規に伝票を入力するとき、自動的に番号を付けたいんです。
できたら、フォーム上に「伝票新規」のボタンを作って、そのボタンを押したら
テキストボックスに番号を表示させるようにしたいのですが、
どうしたらよいのかわからないんです!

どなたか教えていただけませんか?
よろしくお願いします。

A 回答 (2件)

自分の書きこみへの追加なのですが、最大値+1だとテーブルが大きくなった時に余計な処理で時間がかかります。


これが嫌な場合は、採番テーブルというのをつくって、ここに管理番号の最新値を記録しておき、伝票を新たに作る時は採番テーブルから番号を取得し、採番テーブルの管理番号を+1した値に更新する、という方法もあります。
    • good
    • 0
この回答へのお礼

採番テーブルを作りました。なんとか、うまくいきそうです。
どうもありがとうございました!
お礼が遅くなってしまって申し訳ありませんでした。

お礼日時:2002/04/08 12:10

管理番号フィールドをオートナンバー型にするのが定石だと思います。


そうではなく「伝票新規」のボタンを押してから、番号が表示されるようにする必要があるのでしょうか?その場合はクエリーを使って既存の管理番号の最大値を求めて、これに1加えた値をテキストボックスに表示させたらどうでしょうか。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます!
オートナンバーですが、うまく使えなかったんです。
説明不足でした。作っているものは下記のようなものです。

一度新規でフォームに内容を入力し、登録してから
管理番号で内容を呼び出して、一部修正を加えたりしながら
見積書・納品書・請求書を作っていくようにしているんです。

こういうことをしているからなのかはわからないんですが、
うまくいかなかったんです。
だから、他の方法ってあるのかなぁと思って質問させていただいたんです。

そうですね、最大値+1とすれば、自動的に番号が付けられますよね!
ありがとうございます。

お礼日時:2002/03/26 17:49

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

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

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イベントが発...続きを読む

Qひとつつのテーブルから二つのフォームを作成しました。そのフォームを連結させるにはどうしたらよいか教えてください。

既存のフォームは項目が多く一目でどれがどこにあるかわかりにくいので、使用していない項目は隠して欲しい、隠した項目もいざ必要となった時には見れるようにして欲しいと言われました。
そこで私は、使用してない項目は別のフォーム(以降:隠れフォームと記述)にして、既存のフォームにコマンドボタンを設けて、クリックすればたどり着けるようにしました。
ところが、隠れフォームへのコマンドボタンを押すと表示されるデータは既存フォームに表示されているデータであって欲しいのですが、隠れフォームのデータは一番最初のデータのままです。
既存フォームと隠れフォームを一緒に移動させる方法はないのでしょうか?
隠れフォームのテーブルは既存フォームと同じです。
隠したい項目だけを選んでクエリを作成してそこから隠れフォームを作成しました。
ツールボックスのサブフォームは使っていません。
どのような方法をとるとよいでしょうか?
どなたかお知恵を貸してくださるようお願いいたします。

Aベストアンサー

そのテーブルに、主キー(もしくは重複なしのインデックスつきの)フィールドはありますか?
もしあるのでしたら、

> 隠したい項目だけを選んでクエリを作成してそこから隠れフォームを作成しました。

とのことなので、そのクエリに、「既存フォームで現在表示中のレコード」に絞り込む条件を
追加してやるのが一番簡単だと思います。


1)隠れフォームのレコードソースにしているクエリをデザインビューで開く
2)主キー(または重複なしのインデックスつきの)フィールドがまだ追加されていない場合は
 それをドラッグ&ドロップなどで追加
3)上記フィールドの『抽出条件:』欄に、以下のような式を入力
 ・既存フォームの名前が「フォーム1」、上記フィールドが「ID」の場合:
  [Forms]![フォーム1]![ID]
 ・既存フォームがサブフォームを持ち、データ表示をそのサブフォームで行っている場合:
  (メインフォームが「フォーム1」、サブフォームコントロール(→「ソースオブジェクト」として
  指定しているフォーム名ではないので注意)が「サブ1」、上記フィールドが「ID」として)
  [Forms]![フォーム1]![サブ1]![ID]
4)クエリを保存して閉じる

・・・以上です。

なお、フォーム1が開いていない状態でこの隠れフォームを開くと、「[Forms]![フォーム1]![ID]」
(または「[Forms]![フォーム1]![サブ1]![ID]」)の入力を求めるパラメータダイアログが表示される
ようになります。

  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

※蛇足※
Husky2007さんの後者案を、375kさんのフォームに現状のまま適用した場合、「現在レコード
ソースに設定済のクエリ」がいったん読み込まれた後に、再度SQL文がレコードソースとして
設定されることになるように思います。

もしそちらを採用されるのでしたら、隠れフォームのレコードソースは削除した上で、

Private Sub Form_Open(Cancel As Integer)
  If Len(Me.OpenArgs & "") = 0 Then
    Me.RecordSource = "クエリ1"
  Else
    Me.RecordSource = Me.OpenArgs
  End If
End Sub

とされるのがよいのではないでしょうか。(現在のレコードソースが「クエリ1」だったとして)

そのテーブルに、主キー(もしくは重複なしのインデックスつきの)フィールドはありますか?
もしあるのでしたら、

> 隠したい項目だけを選んでクエリを作成してそこから隠れフォームを作成しました。

とのことなので、そのクエリに、「既存フォームで現在表示中のレコード」に絞り込む条件を
追加してやるのが一番簡単だと思います。


1)隠れフォームのレコードソースにしているクエリをデザインビューで開く
2)主キー(または重複なしのインデックスつきの)フィールドがまだ追加されていない場合は
 ...続きを読む

Qボタンを押したら別ファイルから検索するマクロ

以下のパターンでマクロを組みたいです。

<例>
A列  B列   C列
日付  商品名  値段     検索ボタン
                <平均の値段>

上記のA~Cの条件で検索ボタンを押したら別ファイルの
データベースから値段の平均値を割り出し検索ボタンの下部に
平均の値段が表示される。
但し、別ファイルにはA,B,C列以外の項目もあります。

自分はマクロの初心者でどのように組めば良いか分かりません。
宜しくお願い致します。

Aベストアンサー

横から失礼します。
>>初心者でどのように・・
>質問の中に初心者と唱えれば、そのままコピーすれば動くプログラムを回答者が書いてくれることを期待するという質問が多いが、安易過ぎる。
>本質問は初心者にはできない、VBAでは上級の問題です。とりあえずあきらめてください。
”初心者”と言うのがどの位のレベルまでを差しているのか不明ですが、
例えば免許証のように期間があって、VBAを初めて1年未満と言うのなら、
基礎から応用に入った位でも出来そうに思います。
(と言うか、今の自分はその位のレベルでしかありません。
 それでも、何となく思いつくところはありますが、ANo.1さんの
 御意見もありますので、回答としては提示しません。)

質問者さんがやりたい事を箇条書きにしてみて、それを行なうには
何が必要なのかを調べていってみては如何ですか?
不明な点は参考書やサイト検索等、または質問をする際にももっと具体的な
内容を提示できるかと。
頑張って下さい。

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


人気Q&Aランキング

おすすめ情報