访问VBA:如何模拟用户的行添加

时间:2014-03-05 14:17:56

标签: ms-access row ms-access-2010 add simulation

我在数据表视图中有一个表单。我希望vba模拟相同的步骤,就好像用户向表单添加了一个新的寄存器(行)。用户添加新寄存器的步骤如下:

  1. 点击最后​​一个(空)行的字段(左侧带有星号的行)。
  2. 输入一些字符。重要提示:此步骤将左侧星号转换为笔,并在正在编辑的行下方显示一个新行(带星号)。
  3. 点击其他行以保存新行。
  4. 我试图将这些步骤翻译成vba:

    1

        If Not my_form.NewRecord Then
            RunCommand acCmdRecordsGoToNew
        End If
    

    2

        my_form.field_1 = value_1
        my_form.field_2 = value_2
        ...
    

    3

        my_form.Requery
    

    结果是:

    1. 选择了上一个(新)行。没关系。

    2. 将值添加到字段中,但星号不会转换为笔,并且不会添加新行(带星号)。坏了!

    3. 行被重新排序,因此新行(刚输入值的行)不会显示为最后一行。坏了!

    4. 我希望新行(带有值)显示为最后一行(就在带有星号的空行之前),就像用户输入了值一样。换句话说,我想完全模拟用户添加新行。


      更新:我发现了原因:如果我们首先为复选框指定一个值(在为文本框指定值之前),则不会显示新行:

      If Not my_form.NewRecord Then           ' go to new (empty) row (if not already on it)
          RunCommand acCmdRecordsGoToNew
      End If
      
      my_form.my_checkbox.Value = 1           ' if we first assign a value to a checkbox, then no new row appears under our row
      my_form.my_textbox_1 = "aa"             ' no new row appears
      my_form.my_textbox_2 = "bb"             ' no new row appears
      ...
      

      但是,如果我们首先为文本框分配值,则会出现一个新行:

      If Not my_form.NewRecord Then           ' go to new (empty) row (if not already on it)
          RunCommand acCmdRecordsGoToNew
      End If
      
      my_form.my_textbox_1 = "aa"             ' if we first assign a value to a textbox, then a new row appears under our row
      my_form.my_checkbox.Value = 1    
      my_form.my_textbox_2 = "bb"
      ...
      

      难以置信,但确实如此。

1 个答案:

答案 0 :(得分:0)

您使用的是什么版本的MS Access?这看起来很古老。这对我有用:

Dim frm As Form
Set frm = Forms!aForm

DoCmd.GoToRecord , , acNewRec
frm.aControl = ""

当然,这取决于您运行代码的位置,如果它在表单中,Me就可以了。