ACCESSでNumLockがONの時データが反映されない問題

このQ&Aのポイント
  • ACCESS2010でNumLockがONの時、取得したデータが反映されません。他のPCでは同様の問題は発生せず、1台だけ起きています。原因を探そうとデバックモードで実行すると上記の不具合は発生せず、非常に困っています。
  • NumLockをOFFにした状態では正常に動作しています。
  • 不具合の起きているソースコードは以下の通りです。 If 商品コード <> 0 Then Forms!F仕入入力!SF仕入入力.Form!商品コード = 商品コード SendKeys "{Tab}" SendKeys "+{Tab}" SendKeys "{Tab}" End If OS:Windows7 32bit
回答を見る
  • ベストアンサー

ACCESSでNumLockがONの時データが反映

ACCESS2010でNumLockがONの時、取得したデータが反映されません。 他のPCでは同様の問題は発生せず、1台だけ起きています。 原因を探そうとデバックモードで実行すると上記の不具合は発生せず、非常に困っています。 ちなみに、NumLockをOFFにした状態は正常に動作しました。 以下が、不具合の起きているソースです。 If 商品コード <> 0 Then Forms!F仕入入力!SF仕入入力.Form!商品コード = 商品コード SendKeys "{Tab}" SendKeys "+{Tab}" SendKeys "{Tab}" End If OS:Windows7 32bit よろしくお願いします。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.1

> 他のPCでは同様の問題は発生せず、1台だけ起きています。 具体的な原因は残念ながら特定ができませんが、SendKeys ステートメントは動作の不安定要因になることが多いとされます ので、可能ならば他の手段を採られることをお勧めします。 例えば、提示されたコードを見ると、コントロールの移動をさせて いるように思われますので、それであれば、当該コントロールに SetFocusメソッドを使用する方法を採られてはいかがでしょうか。 「SF仕入入力」サブフォームの「商品コード」に移動する場合を 例にすると、以下のようになります:  Forms!F仕入入力!SF仕入入力.Form!商品コード.SetFocus または(省略可能なサブフォームの「Form」を省略して)  Forms!F仕入入力!SF仕入入力!商品コード.SetFocus または(当該コードを「F仕入入力」に記述している場合)  Me!SF仕入入力!商品コード.SetFocus または(当該コードを「SF仕入入力」に記述している場合)  Me!商品コード.SetFocus ・・・なのですが、「Tab」と「Shift+Tab」の反復、ですか(汗) もしもレコードの移動によって「レコードの保存」をさせることが 目的のようでしたら、「RunCommand acCmdSaveRecord」を 追記すればOkですので、併せて参考まで。 (注:当該フォーム(またはサブフォーム)内のコントロールが  フォーカスを持った状態(→SetFocusで対応可)で行う必要が  あります) If 商品コード <> 0 Then   Forms!F仕入入力!SF仕入入力!商品コード = 商品コード   Forms!F仕入入力!SF仕入入力!商品コード.SetFocus   RunCommand acCmdSaveRecord   Forms!F仕入入力!SF仕入入力.Form!商品名.SetFocus End If

tinyryu
質問者

お礼

回答ありがとうございます。 やはりSendkeysを使わないのがベストのようですね。 なんとか回避するような仕組みを作ってみます。

関連するQ&A

  • ACCESS 別フォームから別フォームの処理を

    ACCESSでメインフォームから別フォームを 【メインフォーム】 DoCmd.OpenForm "FM_商品検索", , , , , acWindowNormal 【商品検索フォーム】 検索画面でJANコードを選んだらJANコードをセットして、商品マスタの読込等の処理をしたい Forms!F_仕入!F_仕入sub.Form!JANコード = Me.JANコード ↑これは動く Forms!F_仕入!F_仕入sub.JANコード_BeforeUpdate ↑これがエラーになります 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」 でエラーになります。 Forms!F_仕入!F_仕入sub.JANコード_BeforeUpdate Public Sub JANコード_BeforeUpdate(Cancel As Integer) 何がおかしいのでしょうか? 宜しくお願いします

  • NumLockの制御について

    VB5.0(SP3)で次のプログラムを作成しました。 キーボードからNumLockキーを押して状態をOFFにすると、プログラム側(タイマー関数内)でその状態をチェックし、状態をONに戻します。 しかし、次の動作をした時に問題が発生しました。 但し、この問題は、OSがWindowsNT4.0(SP6)の端末で発生するのですが、Windows2000/XP では発生しませんでした。 起動したフォーム画面にフォーカスがある間は問題ないのですが、フォーカスを外した状態でNumLockキーを押して状態をOFFにすると、ON/OFFが繰り返されてしまいます。 この時に、マウスをフォーム画面の上に持ってくるとその繰返し処理が止まります。 もちろん再度 NumLockキーを押しても止まります。 OSの問題なのでしょうか?それともプログラムが悪いのでしょうか? 下記にそのプログラムを表記します。 <プログラム> フォーム(Form1)にタイマー(Timer1)を貼りつけただけです。 (Module1.bas) Option Explicit Public Const VK_NUMLOCK = &H90 Public Const KEYEVENTF_KEYUP = &H2 Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, _                        ByVal bScan As Byte, _                        ByVal dwFlags As Long, _                        ByVal dwExtraInfo As Long) (Form1.frm) Option Explicit Private Sub Form_Load()   Timer1.Interval = 100 End Sub Private Sub Timer1_Timer()   On Error Resume Next   If GetKeyState(VK_NUMLOCK) = 0 Then     keybd_event VK_NUMLOCK, 0, 0, 0     keybd_event VK_NUMLOCK, 0, KEYEVENTF_KEYUP, 0   End If End Sub

  • ACCESSの命令で

    iif(IsNull([Forms]![商品抽出]![商品コード入力]),True,[商品コード]=[Forms]![商品抽出]![商品コード入力]) この命令の意味をおしえてください

  • アクセス モジュールの意味

    下記はどうゆう意味なのですか?考えたのですが、よく分かりません。 private sub form open(cancel As Integer)・・・開いたとき ●If Forms!F_Main!検索条件 = 4 Then・・・???   これで分かりますか?? 宜しくお願いします。

  • タブキー押下時のイベントをひろいたい。

    テキストボックスにフォーカスがあり、TABキーが押された時のイベントをひろいたいのですが、KeyPressもKeyDownもイベントが発生しません。 (If KeyCode = vbKeyTab Then  MsgBox "タブキー" End If  If KeyAscii = vbKeyTab Then ~ のようなコードを記述してもメッセージが表示されない) ヘルプにはKeyDownでは発生しないという記述がありますが、KeyPressではイベントがひろえるようなことが書いてあるのにひろえないので困っています。 なにかよい方法はありませんでしょうか。 わかりにくい説明で申し訳ありませんが困ってます。 宜しくお願いします。

  • サブフォームのsetfocus

    ac2000/win2000 こんにちは。 以下のようにサブフォームのテキストボックスにsetfocusしようと思いコードを書きました。 Me.SF1.Form.コード.SetFocus Forms!コード更新F!SF1.Form!コード.SetFocus 2つ書いたんですが、2つともエラーはでないものの 移動することが出来ません。 どなたか宜しくお願いします。

  • アクセス2003 ルックアップについて

    下記のテーブルで次のようなことをしています。 <商品分類> ・商品ID(オートナンバー)・・・入力順に自動で入ってます。 ・コードA(数値型)・・・商品の種別を約10種類の番号で振り分けています。 ・コードB(数値型)・・・メーカーごとに分けられるように番号をつけています ・コードC(数値型)・・・コードA・Bが共通なもの同士を個別番号で分けています。 ・商品名(テキスト型)・・・商品名を入力しています。 ・商品コード(テキスト型)・・・仕入先からの伝票上のコードを入力しています。 ・備考(テキスト型)・・・商品名・商品コードだけでは分かりにくい時の補足を記入しています。 <仕入記録> ・仕入記録ID(オートナンバー)・・・入力順に自動で入ります。 ・仕入年月日(日付型)・・・仕入年月日を入れています。 ・仕入先(テキスト型)・・・仕入先を入力しています。 ・商品名(ルックアップ/テキスト型)・・・<商品分類>の商品名が表示されるようにしています。 ・数量(数値型)・・・商品の数量を入れています。 ・単価(通貨型)・・・商品の単価を入れています。  現在<商品分類>に約1000商品のデータを入れてあります。 ルックアップの表示はコードA・B・Cの昇順で表示し、選択後は商品名が表示されるようにしてあります。 (コードA~C・商品名・コードA~Cの7列で最初の3列の列幅を0cmにしてます) (1)この状態で<商品分類>の商品名やコードA~Cを書き換えた場合、仕入記録の商品名にはすべて反映されるのでしょうか? 特にコードCを変えた場合はどうなるんでしょうか? 例:コードA  コードB  コードC  商品名     10     5     1   大根              ↓    コードA  コードB  コードC  商品名      10     5     1  ニンジン    コードA  コードB  コードC  商品名      10     5     2    大根 上記のようにした場合、既に入力された<仕入記録>のデータの商品名大根はどうなるんでしょうか?  (2) <仕入記録>でクエリを作成し、商品ごとの仕入金額を出そうとしているんですが、(1)のようなデータの変更をした場合どのように反映されるんでしょうか? 書き方がややこしいと思いますが宜しくお願いします。

  • EXCELでいうシリアル値をACCESSで出したい

    質問タイトルの通りです。VBAでFORM中の2つの日付を比較し、処理を分岐させたいのです。 自分なりに作っては見たのですが、ちゃんと動きません。どこが悪いんでしょう。 ' Dim hiduke As Integer: hiduke = CInt(IsDate(Forms![F_売上伝票]![日付])) ' Dim open_date As Integer: open_date = CInt(CDate("#2003 / 5 / 5#")) ' If hiduke <= open_date Then '正しい日付が入っていない場合には、 ' Forms![F_売上伝票]![入力日] = Date ' MsgBox "OPEN前です", vbInformation ' End If

  • ACCESS2000でとっても困っています。履歴がたくさんとれてしまうのです。

    アクセス初心者です。とても困っています。 困っているのは、履歴は書き出すのですが、複数書き出してしまうということなのです。 詳しく申し上げますと、 フォーム「テレ_sb(table:テレ)」に変更があった場合に、履歴「SF_テレ履歴(table:テレ履歴)」を書き出すことを行っています。 顧客ID毎に履歴を取るようにしているのですが、「A」ユーザーに変更を行うと、「A」ユーザーの履歴を取ってくる。ここまでは良いのですが、フォームのテレ_sb(table:テレ)に情報が入っているもの全てについて履歴を取ってしまうのです。 つまり、table:テレ(フォーム:テレ_sb)に10ユーザーの情報が入っているとすると、「A」について変更を行うと、10ユーザー全ての履歴を取ってきてしまうのです。 <<フォーム>>メイン、テレ_sb(table:テレ)、SF_テレ履歴(table:テレ履歴)があります。 テレ_sb(table:テレ)のイベントプロシージャーには以下のように書いております。上記の点、防ぐ方法をどなたかご教授ください。よろしくお願い申し上げます。 Sub History_tel() Dim Ctr As Control Dim strSQL As String For Each Ctr In Me.Controls If ((Ctr.ControlType = acTextBox) Or (Ctr.ControlType = acComboBox)) Then If Ctr.OldValue <> Ctr.Value Then strSQL = "insert into テレ履歴 select * , '" & CurrentUser & "' as 更新者 FROM テレ '" & _ "where 顧客コード = " & Me.顧客コード DoCmd.SetWarnings False DoCmd.RunSQL strSQL DoCmd.SetWarnings True Exit Sub End If End If Next Ctr End Sub Private Sub Form_BeforeUpdate(Cancel As Integer) History_tel End Sub Private Sub Form_AfterUpdate() Forms("メイン").Form.SF_テレ履歴.Requery End Sub

  • access2000"社員管理システム"を利用しています。

    access2000"社員管理システム"を利用しています。 社員マスタサブフォームがあり、レコードソースは社員履歴QUE(社員履歴TBL、所属TBL)です。 社員コード 開始日 終了日 社内区分 所属コード 役職名 内線電話番号 呼出詳細 所属名 部署名 を入力していて、以下がコードです。 Sub Form_Load() On Error GoTo Form_Load_Err If ParentFormIsOpen() Then Forms![社員マスタFRM]!ToggleLink = True Form_Load_Exit: Exit Sub Form_Load_Err: MsgBox Error$ Resume Form_Load_Exit End Sub Sub Form_Unload(Cancel As Integer) On Error GoTo Form_Unload_Err If ParentFormIsOpen() Then Forms![社員マスタFRM]!ToggleLink = False Form_Unload_Exit: Exit Sub Form_Unload_Err: MsgBox Error$ Resume Form_Unload_Exit End Sub Private Function ParentFormIsOpen() ParentFormIsOpen = (SysCmd(acSysCmdGetObjectState, acForm, "社員マスタFRM") And acObjStateOpen) <> False End Function Private Sub 終了_Click() On Error GoTo Err_終了_Click DoCmd.Close Exit_終了_Click: Exit Sub Err_終了_Click: MsgBox Err.Description Resume Exit_終了_Click End Sub 終了日を入力したら次のレコードの開始日に終了日の翌日が自動的に入力されるようにしたいです。 宜しくお願いします!!