• ベストアンサー

磁気カードの入力

access2000にてフォームを作成してそのテキストボックスにて磁気カードを入力し、別のテキストボックス(2)にカードのデータの16桁目から7文字のみをテキストボックス(2)に表示入力する方法があったら教えてください。excel ではmid()関数のようなものです

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

  • ベストアンサー
回答No.7

こんにちは。 >座席(バーコード)は読み込ませると >sql文のところで構文エラーとなってしまいました。 rst.Open "select * from 座席 where 座席コード ='" & Me.入力用テキストボックス & "'", _ のところでしょうか? 以下をご確認ください。 ”座席”テーブルの”座席コードフィールド”の型は、テキスト型ですか? テキスト型でない場合(数値型)の場合には、 フィールドをテキスト型に変更するか、フィールドの型を変更できない場合には、 上のコードを次のように変える必要があります。 rst.Open "select * from 座席 where 座席コード =" & Me.入力用テキストボックス, _ 以上ご参考になれば幸いです。m(__)m

Hugh
質問者

お礼

大変お世話になりありがとうございました 一応ご協力いただいたおかげで形になりました 本当にどうもありがとうございました。

その他の回答 (6)

回答No.6

こんにちは。 >サンプルを元に試してみましたが、保存処理のsub >の下から7行目のrst![座席コード]= Me.座席コード >をさしてコンパイルエラーになってしましました。 念のため下から7行目の rst![座席コード]= Me.座席コード を コメントブロック化してコンパイルエラーとなるかご確認ください。 コメントブロック化するには、 先頭に'(半角クォーテイションマーク)を入力 または、書式ツールバーのコメントブロックボタンをクリックするとできます。 コメントブロック化して他に問題無いときは、コメントブロック化を解除して 再度コンパイルしてみてください。 コメントブロック化を解除するには、 先頭の'を削除するか、または 書式ツールバーのコメントブロック解除ボタンをクリックするとできます。 コンパイルするには 【デバッグ】メニュー~”***のコンパイル”です。 エラー要因として考えられることを揚げておきます。 テーブル”総合”には、フィールド”座席コード”が入っていますか? または”座席コード”が”座席コ-ド”(ーのつもりが-)とかになっていた なんてことはありませんか? 以上ご参考になれば幸いです。m(__)m

Hugh
質問者

補足

shadowMoonさん いつもありがとうございます。 下記のようにコードを書き換えてみましたが、 うまくいきません。 磁気カードはうまくデータを取り出せるのですが、 座席(バーコード)は読み込ませると sql文のところで構文エラーとなってしまいました。 バーコードは別のテキストボックスに読みこませたほうがいいのでしょうか? もうお手上げです。 何かアドバイスをお願いします。 Private Sub 入力用テキストボックス_AfterUpdate() If IsNull(Me.学生番号) Then 磁気カードデータセット処理 ElseIf IsNull(Me.座席番号) Then バーコードデータセット処理 Else 保存処理 End If End Sub Public Sub 磁気カードデータセット処理() Dim rst As New ADODB.Recordset Dim txt磁気カード As Variant txt磁気カード = Mid(Me!入力用テキストボックス, 16, 7) Set rst = New ADODB.Recordset rst.Open "gakuseitbl1", _ CurrentProject.Connection, adOpenKeyset, adLockOptimistic rst.Filter = "学生番号= " & "'" & txt磁気カード & "'" If rst.EOF Then MsgBox ("該当するユーザー情報はありません。") Me.入力用テキストボックス = "" Else 'Me.磁気カード = rst![磁気カード] Me.学生番号 = rst![学生番号] Me.氏名 = rst![氏名] Me.開始時間 = Now() Me.入力用テキストボックス = "" End If rst.Close Set rst = Nothing 入力用テキストボックス.SetFocus End Sub Public Sub バーコードデータセット処理() Dim rst As New ADODB.Recordset Set rst = New ADODB.Recordset rst.Open "select * from 座席 where 座席コード ='" & Me.入力用テキストボックス & "'", _ CurrentProject.Connection, adOpenKeyset, adLockOptimistic If rst.EOF Then MsgBox ("座席情報はありません。") Me.入力用テキストボックス = "" Else Me.座席コード = rst![座席コード] Me.座席番号 = rst![座席番号] 'Me.終了時間 = Now() Me.入力用テキストボックス = "" End If rst.Close Set rst = Nothing End Sub Public Sub 保存処理() If MsgBox("保存しますか?", vbYesNo) = vbYes Then Dim rst As New ADODB.Recordset Set rst = New ADODB.Recordset rst.Open "総合", _ CurrentProject.Connection, adOpenKeyset, adLockOptimistic rst.AddNew rst![日付] = Date rst![磁気カード] = Me.磁気カード rst![学生番号] = Me.学生番号 rst![氏名] = Me.氏名 rst![開始時間] = Me.開始時間 rst![終了時間] = Me.終了時間 rst![座席コード] = Me.座席コード rst![座席番号] = Me.座席番号 rst.Update rst.Close Set rst = Nothing End If End Sub

回答No.5

またまたご無沙汰してすいません。 テーブルA(テーブル名は、”ユーザーテーブル”としておきます。) ID(オートナンバー型) 磁気カード抽出情報(テキスト型) ユーザーID(テキスト型) ユーザー名(テキスト型) テーブルB(テーブル名は、”座席テーブル”としておきます。) ID(オートナンバー型) 座席ID(テキスト型) 座席番号(テキスト型) 保存テーブル(テーブル名は、”保存テーブル”としておきます。) ID(オートナンバー型) 日付(日付/時刻型) 磁気カード抽出情報(テキスト型) ユーザーID(テキスト型) ユーザー名(テキスト型) 受付時間(日付/時刻型) 終了時間(日付/時刻型) 座席ID(テキスト型) 座席番号(テキスト型) フォーム(入力用フォーム)があって、その中に下記テキストボックスがある。 入力用テキストボックス(レコードソースは空白、タブストップは”はい”) 磁気カード抽出情報(レコードソースは空白、タブストップは”いいえ”) ユーザーID(レコードソースは空白、タブストップは”いいえ”) ユーザー名(レコードソースは空白、タブストップは”いいえ”) 受付時間(レコードソースは空白、タブストップは”いいえ”) 終了時間(レコードソースは空白、タブストップは”いいえ”) 座席ID(レコードソースは空白、タブストップは”いいえ”) 座席番号(レコードソースは空白、タブストップは”いいえ”) 下記が入力用フォームのコード(サンプルコードです。) Private Sub 入力用テキストボックス_AfterUpdate() If IsNull(Me.磁気カード抽出情報) Then 磁気カードデータセット処理 ElseIf IsNull(Me.ユーザーID) Then バーコードデータセット処理 Else 保存処理 End If End Sub Public Sub 磁気カードデータセット処理() Dim rst As New ADODB.Recordset Dim txt磁気カード抽出情報 As Variant txt磁気カード抽出情報 = Mid(Me!入力用テキストボックス, 16, 7) Set rst = New ADODB.Recordset rst.Open "ユーザーテーブル", _ CurrentProject.Connection, adOpenKeyset, adLockOptimistic rst.Filter = "磁気カード抽出情報=" & "'" & txt磁気カード抽出情報 & "'" If rst.EOF Then MsgBox ("該当するユーザー情報はありません。") Me.入力用テキストボックス = "" Else Me.磁気カード抽出情報 = rst![磁気カード抽出情報] Me.ユーザーID = rst![ユーザーID] Me.ユーザー名 = rst![ユーザー名] Me.受付時間 = Now() Me.入力用テキストボックス = "" End If rst.Close Set rst = Nothing End Sub Public Sub バーコードデータセット処理() Dim rst As New ADODB.Recordset Set rst = New ADODB.Recordset rst.Open "select * from 座席テーブル where 座席ID='" & Me.入力用テキストボックス & "'", _ CurrentProject.Connection, adOpenKeyset, adLockOptimistic If rst.EOF Then MsgBox ("座席情報はありません。") Me.入力用テキストボックス = "" Else Me.座席ID = rst![座席ID] Me.座席番号 = rst![座席番号] Me.終了時間 = Now() Me.入力用テキストボックス = "" End If rst.Close Set rst = Nothing End Sub Public Sub 保存処理() If MsgBox("保存しますか?", vbYesNo) = vbYes Then Dim rst As New ADODB.Recordset Set rst = New ADODB.Recordset rst.Open "保存テーブル", _ CurrentProject.Connection, adOpenKeyset, adLockOptimistic rst.AddNew rst![日付] = Date rst![磁気カード抽出情報] = Me.磁気カード抽出情報 rst![ユーザーID] = Me.ユーザーID rst![ユーザー名] = Me.ユーザー名 rst![受付時間] = Me.受付時間 rst![終了時間] = Me.終了時間 rst![座席ID] = Me.座席ID rst![座席番号] = Me.座席番号 rst.Update rst.Close Set rst = Nothing End If End Sub 【解説】 1)今回テーブルに接続する方法としてADO(ActiveX Data Object)という方法で おこなっていますが、Access97とかでしたらDAO(Database Access Object) で行う方法もあります。(Access2000からはADOが標準みたいですので、 DAOはつかいませんでした。) 2)テーブルにアクセスして抽出する方法は、 テーブルを開いてフィルタを使う方法(上記磁気カードデータセット処理) SQLで抽出する方法(上記バーコードデータセット処理) があり、どちらでもかまいません。 3)実際は保存するときに既に同じ情報があるかチェックしたりする必要がありますが今回は割愛しました。 4)処理後 Me.入力用テキストボックス.SetFocus で、フォーカスを移すことを 考えていましたが、うまくいかなかったため、入力用テキストボックス以外のテキストボックスのタブストップを”いいえ”とすることで代替させてもらいました。 5) 今回は、入力用テキストボックスの更新後処理で動かしていますが、 別にボタンを追加して、そのボタンをクリックしたときに処理が動くようにしてもいいかもしれません。 6)フォームは、保存テーブルを元にウイザードで作成するほうが簡単です。 7)今回フォームは非連結としました。(一時テーブルは割愛させていただきました。) あと不明な点があれば、補足してください。 (新しく質問を起こしたほうが他の方の回答をすばやくもらえる可能性が高い ですね。) 当方 最近公私ともに忙しく回答が送れたことをお詫びいたします。m(__)m

Hugh
質問者

補足

どうもご丁寧な回答ありがとうございます。 サンプルを元に試してみましたが、保存処理のsub の下から7行目のrst![座席コード]= Me.座席コード をさしてコンパイルエラーになってしましました。 下記のコードは入力用テキストボックスの更新後処理でイベントをかけています。 尚、保存用テーブル=総合 ユーザーID=学生番号 ユーザー名=氏名 座席ID=座席コード 磁気カード抽出情報=磁気カード に変更しています。 何が原因かわからず困ってます。 何かお気づきの点があればご指摘願います Private Sub 入力用テキストボックス_AfterUpdate() If IsNull(Me.磁気カード) Then 磁気カードデータセット処理 Else 保存処理 End If End Sub Public Sub 磁気カードデータセット処理() Dim rst As New ADODB.Recordset Dim txt磁気カード As Variant txt磁気カード = Mid(Me!入力用テキストボックス, 16, 7) Set rst = New ADODB.Recordset rst.Open "gakuseitbl1", _ CurrentProject.Connection, adOpenKeyset, adLockOptimistic rst.Filter = "磁気カード=" & "'" & txt磁気カード & "'" If rst.EOF Then MsgBox ("該当するユーザー情報はありません。") Me.入力用テキストボックス = "" Else Me.磁気カード = rst![磁気カード] Me.学生番号 = rst![学生番号] Me.氏名 = rst![氏名] Me.受付時間 = Now() Me.入力用テキストボックス = "" End If rst.Close Set rst = Nothing End Sub Public Sub バーコードデータセット処理() Dim rst As New ADODB.Recordset Set rst = New ADODB.Recordset rst.Open "select * from 座席データ1 where 座席コード = '" & _ Me.入力テキストボックス & "'", CurrentProject.Connection, adOpenKeyset, adlockpotimistic If rst.EOF Then MsgBox ("座席情報がありません。") Me.入力用テキストボックス = "" Else Me.座席コード = rst![座席コード] Me.座席番号 = rst![座席番号] Me.終了時間 = Now() Me.入力用テキストボックス = "" End If rst.Close Set rst = Nothing End Sub Public Sub 保存処理() If MsgBox("保存しますか?", vbYesNo) = vbYes Then Dim rst As New ADODB.Recordset Set rst = New ADODB.Recordset rst.Open "総合", _ CurrentProject.Connection, adOpenKeyset, adLockOptimistic rst.AddNew rst![日付] = Date rst![磁気カード] = Me.磁気カード rst![学生番号] = Me.学生番号 rst![氏名] = Me.氏名 rst![受付時間] = Me.受付時間 rst![終了時間] = Me.終了時間 rst![座席コード] = Me.座席コード rst![座席番号] = Me.座席番号 rst.Update Set rst = Nothing End If End Sub

回答No.4

ご無沙汰してすみませんでした。m(__)m 下記補足願います。 テーブルAのフィールドは、どういう構成になっていますか? テーブルBのフィールドは、どういう構成になっていますか? 保存用テーブルのフィールドは、どういう構成になっていますか? 例えばテーブルAは、 フィールド名 ID(オートナンバー型) 磁気カードコード(テキスト型) 磁気カード内容(テキスト型) とかしているんでしょうか? また、これと最初のご質問の カードのデータの16桁目から7文字のみのみをテキストボックス(2)に表示入力する方法 とのつながりはどうなっているんでしょうか? ひょっとすると、テーブルAの構成は ID(オートナンバー型) 磁気カード抽出コード(テキスト型)(カードのデータの16桁目から7文字に該当するデータ) 磁気カード内容(テキスト型) というようにしてあり、 テキストボックス1で入力したデータの16桁目から7文字に一致する磁気カード抽出コードをテーブルAから探し出して、それに該当する磁気カード内容を テキストボックス2に表示したい というような内容でしょうか? テーブルの構成によっては、処理が異なりますので補足のほどよろしく御願いします。m(__)m

Hugh
質問者

補足

お返事ありがとうございます。私のつたない説明でご理解いただき大変恐縮しております。 テーブルAは、 フィールド名 ID(オートナンバー型) 磁気カードコード(テキスト型) 磁気カード内容(テキスト型) -- ユーザーID そのとおりです。 ひょっとすると、テーブルAの構成は ID(オートナンバー型) 磁気カード抽出コード(テキスト型)(カードのデータの16桁目から7文字に該当するデータ) 磁気カード内容(テキスト型) というようにしてあり、 テキストボックス1で入力したデータの16桁目から7文字に一致する磁気カード抽出コードをテーブルAから探し出して、それに該当する磁気カード内容を テキストボックス2に表示したい まさにそのとおりです。 テーブルBの構成は受付のための座席データのテーブルで フィールド名は ID(オートナンバー) 座席ID(テキスト型)--バーコードの読み込む情報 座席番号(テキスト型)--座席番号(例 A-1) 座席IDで読み込ませた情報を座席番号をテーブルBから探し出しテキストボックス3に表示すると言った内容です 保存テーブルは ID(オートナンバー) 日付 磁気カード抽出情報 ユーザーID ユーザー名 受付時間 終了時間 座席ID 座席番号 です。私は初心者なのでどのような構成にしたらよいかわからず、なんとなくこんな感じで構成しました。 何かよいアイデアがあればアドバイスお願い致します。

回答No.3

補足を見てあれあれ???自分の思い描いていたものと違っており、今一テーブルA,Bとメインテーブルの関係が分かりにくく思いました。(自分の理解不足ですね。すみません。) 以下のような解釈でよろしいでしょうか? 【テーブル、フォームの概略仕様】 テーブルには一時作業用のテーブルと、保存用のテーブルがある。 一時作業用のテーブルには、カードリーダからのデータ読み取り後の抜き出し後のフィールド(列)A,Bがある。 一時テーブルは作業中断後再開するために設けている。 (なお新規入力しかなければ、一時テーブルは不要ですね。) 保存用のテーブル(メインテーブル)にも同じくフィールドA,Bがある。 (後で整理しやすいようにキー番号も必要ですけど・・・) 作業用の単票形式のフォームは、一時作業用テーブルと連結されており、 テキストボックス1は、カードリーダからの直接入力用(非連結) テキストボックス2は、フィールド2がコントロールソース テキストボックス3は、フィールド3がコントロールソース となっている。 【作業のイメージ】以下(VBA)は自動処理、(人)は、人間が行う操作です。 (1)作業用のフォームを開いたときにテキストボックス2(フィールド2)にデータが入っていればそのまま表示(作業再開)。そうでなければ(新規入力とみなし)作業用テーブルをクリアして、フォーカスをテキストボックス1にする。(VBA) (なお新規入力しかなければ、一時テーブルは不要ですね。) (2)磁気カードを読み込む。(多分ピッという音が出て?、キーボードとおなじでしょうからテキストボックス1に磁気カードのデータが入るんでしょうね。)(人) (3)Enterキーを押す。(人) (4)テキストボックス更新時のイベントでフィールドAにMid関数後のデータを入れ テキストボックス1をクリアし、テキストボックス1にフォーカスを移す。(VBA) (5)磁気カードを読み込む。(人) (6)Enterキーを押す。(人) (7)テキストボックス更新時のイベントでテキストボックス1にデータがあれば、フィールドBにデータを入れ、一時テーブルのデータ(フィールドA,B)を保存用のテーブルの新規レコードに書き込む。さらにテキストボックス1,2,3をクリアし、テキストボックス1にフォーカスを移し、次の入力に備える。(VBA) こんなイメージでよければサンプルコードを提示させていただきます。m(__)m

Hugh
質問者

補足

ありがとうございます。 私の希望はそのような感じです。 ただ、 1)テキストボックス1には磁気カードを読み込ませたあと 2)テキストボックス2に別のテーブルAからデータを引っ張り表示。 3)その処理が終わったらテキストボックス1の表示をクリア 4)テキストボックス1にフォーカス 5)次にバーコードでテキストボックス1に再度入力 6)その内容のデータはテーブルBから引っ張ってテキストボックス3に入力  7)テキストボックス1の表示をクリア (追加の要望) テキストボックス1に磁気カードで入力したらテキストボックス4で現在の時間を表示したいです。 画面上には  テキストボックス1- 空欄 テキストボックス2- 磁気カードの情報は表示 テキストボックス3- バーコードの情報が表示 テキストボックス4- 時間が表示 が表示されて 確認して保存用テーブルに保存 といった流れなんですが、できますでしょうか? 磁気カードとバーコードの読み込ませるテキストボックスが同じだと難しい場合は別のテキストボックス1a とかで別々に読ませてもかまいません。 こんな貧素説明で恐縮ですがお助けください。 お願い致します。

回答No.2

VBAで処理させましょう。 テキストボックス1にフォーカスがあるときにEnterキーを押すと磁気カードのデータが読み込まれるのでしょうか? そうであれば、テキストボックス1の更新後イベントで、 1)テキストボックス1のデータをMid関数で求めた文字をテキストボックス2に入力 2)テキストボックス1のデータをクリア 3)テキストボックス1にフォーカスを移す ことで実現できます。 また、補足にありますように既にテキストボックス2に入力されていればテキストボックス3に入力したければ 1)の処理を テキストボックス2にデータがはいっているかチェックし、 テキストボックス2にデータがはいっていなければ、テキストボックス1のデータをMid関数で求めた文字をテキストボックス2に入力 そうでなければテキストボックス1のデータをMid関数で求めた文字をテキストボックス3に入力 とすればよろしいかと思います。 あるいはEnterキーで読み込み後、ボタン操作でテキストボックス2,3への入力操作を行いたいとか、途中確認メッセージを出したいとかであれば、多少処理方法が変わるかとおもいますので、よろしければ補足願います。もしわかりにくければサンプルコードを提示させていただいてもかまいません。 (上記説明でご理解していただければ、補足不要です。) ご参考になれば幸いです。m(__)m

Hugh
質問者

補足

アドバイスありがとうございます。私の実現たいものを簡単に説明します。 まずテーブルがメインのテーブル テーブルA、テーブルBとあります。 1)フォームの中に入力用のテキストボックス1に磁気カードで読ませる。読ませたデータをテーブルAから引っ張っ テキストボックス2に入力 2)テキストボックス1のデータをクリア、テキストボックス2の入力はそのまま 3)同じくテキストボックス1に今度はバーコードリーダーで読ませる。データはテーブルBから引っ張ってくる バーコードのデータはテーブルBのフィールド1なので入力するにはフィールド1からフィールド2に変換してテキストボックス3に入力 それらの入力された内容すべてをメインのテーブルに保存 以上が大まかな希望ないようです。 もし説明不足等あればご指摘願います。

回答No.1

こんにちは。 単に表示するだけでいいのなら、 テキストボックス(2)を右クリックして【プロパティ】を選択して【すべて】のタブにある「コントロールソース」の右欄に =Mid([テキストボックス(1)],16,7) と入力するだけです。 ご参考になれば幸いです。m(__)m

Hugh
質問者

補足

回答ありがとうございます。 テキストボックス1に読み込ませて、テキストボックス 2に表示、入力した後にテキストボックス1の表示をなくして別のバーコードをまたテキストボックス1で読みバーコードの入力をテキストボックス3に入力したいのですが、 そんな方法ってありますか?

関連するQ&A