Vba MS access检查列值并更改另一列

Vba MS access检查列值并更改另一列,vba,ms-access,Vba,Ms Access,我有一个ms access数据库,其中有一些是/否列,我想检查并设置第三列的值。声明应该类似于以下内容 if !col1 && !col2: col3 = no else: col3= yes 我一直在搜索,但并不真正了解vba,也找不到我需要的。。主要是对我无法解决的其他问题的一部分回答。目前正在尝试在“模块”部分创建它,对吗?最好是在这些列更改时自动执行,或者可能只运行一次并执行所有行。请帮助我走上正确的道路,非常感谢您的帮助 以下是我要做的: 1

我有一个ms access数据库,其中有一些是/否列,我想检查并设置第三列的值。声明应该类似于以下内容

if !col1 && !col2:
         col3 = no
else:
    col3= yes

我一直在搜索,但并不真正了解vba,也找不到我需要的。。主要是对我无法解决的其他问题的一部分回答。目前正在尝试在“模块”部分创建它,对吗?最好是在这些列更改时自动执行,或者可能只运行一次并执行所有行。请帮助我走上正确的道路,非常感谢您的帮助

以下是我要做的:

1-创建表单并在其上至少添加一个命令按钮。将其命名为cmdMyButton或cmdanythingatyouwant(cmd是Microsoft示例中用于命令按钮的前缀)

2-在设计视图中,双击命令按钮以弹出代码窗口


3-在onClick()函数中,编写代码,打开表的记录集,循环记录和每行,验证这两列的值,并根据需要进行更新。(查看DAO.recordset的文档)

以下是我要做的:

1-创建表单并在其上至少添加一个命令按钮。将其命名为cmdMyButton或cmdanythingatyouwant(cmd是Microsoft示例中用于命令按钮的前缀)

2-在设计视图中,双击命令按钮以弹出代码窗口


3-在onClick()函数中,编写代码,打开表的记录集,循环记录和每行,验证这两列的值,并根据需要进行更新。(查看DAO.recordset的文档)

假设您有一个名为
Table1
的访问表,其中包含一些访问字段:

以下Access SQL语句将根据
col1
col2
的值,为
Table1
中的每一行更新
col3
的值:

UPDATE Table1
SET col3 = NOT col1 AND NOT col2
有多种方法可以利用此SQL语句:

  • 您可以将其粘贴到SQL视图中的查询设计器中,并通过Access UI执行它

  • 您可以将其作为Access宏的一部分运行

  • 您可以使用ADO或DAO在VBA中执行它

  • 您可以使用
    DoCmd.RunSQL
    方法在VBA中执行它

  • 您可以使用另一种支持自动化的编程语言代替VBA


假设您有一个名为
Table1
的访问表,其中包含一些访问字段:

以下Access SQL语句将根据
col1
col2
的值,为
Table1
中的每一行更新
col3
的值:

UPDATE Table1
SET col3 = NOT col1 AND NOT col2
有多种方法可以利用此SQL语句:

  • 您可以将其粘贴到SQL视图中的查询设计器中,并通过Access UI执行它

  • 您可以将其作为Access宏的一部分运行

  • 您可以使用ADO或DAO在VBA中执行它

  • 您可以使用
    DoCmd.RunSQL
    方法在VBA中执行它

  • 您可以使用另一种支持自动化的编程语言代替VBA


我只需要在DB表中的计算列上创建它。请参见下面的屏幕截图:

请注意,在属性中,我设置了一个公式,以根据前两列获得所需的结果。“结果类型”设置为是/否,以模拟是/否字段。唯一的区别是,第三列将显示-1(真)或0(假)。但是,当在表单上显示此信息时,您可以让它以复选框的方式显示信息。计算字段也是理想的,因为它仅在更新目标记录时更新第三列,而不更新整个表,如果表大小开始容纳超过100k条记录,则非常有用

如果需要VBA代码,则需要触发器。我假设它是表单上的一个按钮,如果不是,您可以随时更改下面的代码以匹配您希望触发它的事件。下面的代码也是一个可以调用/用于任何触发器的模块。代码还假设您有一个主键

Public Sub UpdateThirdColumn(ByVal RecordPK As String) 'RecordPK is a passed variable
                                                       'that is the primary key identifier to find the
                                                       'record in the table
'Set variavble name for SQL statement, gives you one place to update instead of hunting through code
Dim strSQL                          As String

'Creates the SQL string in the variable assigned
strSQL = "UPDATE {YourTableNameHere} " & _
         "SET {YourThirdFieldNAmeHere} = True " & _
         "WHERE ((({YourFirstFieldNAmeHere}) = True AND ({YourSecondFieldNAmeHere}) = True AND ({YourPrimaryKeyFieldHere}) ='" & RecordPK & "'));"
'Executes the SQL statement, dbFailOnError will fail if problem exists in SQL statement
CurrentDb.Execute strSQL, dbFailOnError
End Sub

'Use this code if you have a button to trigger event
Private Sub YourButton_Click()
Call UpdateThirdColumn(Me.YourPrimaryKeyControlName)
End Sub

'Use the bottom 2 codes if you want the update for each check box to be checked and update
Private Sub FirstFieldName_AfterUpdate()
Call UpdateThirdColumn(Me.YourPrimaryKeyControlName)
End Sub

Private Sub SecondFieldName_AfterUpdate()
Call UpdateThirdColumn(Me.YourPrimaryKeyControlName)
End Sub

如果您需要更多帮助或解释,请告诉我,我很乐意提供帮助。

我将在DB表中的计算列上创建此项。请参见下面的屏幕截图:

请注意,在属性中,我设置了一个公式,以根据前两列获得所需的结果。“结果类型”设置为是/否,以模拟是/否字段。唯一的区别是,第三列将显示-1(真)或0(假)。但是,当在表单上显示此信息时,您可以让它以复选框的方式显示信息。计算字段也是理想的,因为它仅在更新目标记录时更新第三列,而不更新整个表,如果表大小开始容纳超过100k条记录,则非常有用

如果需要VBA代码,则需要触发器。我假设它是表单上的一个按钮,如果不是,您可以随时更改下面的代码以匹配您希望触发它的事件。下面的代码也是一个可以调用/用于任何触发器的模块。代码还假设您有一个主键

Public Sub UpdateThirdColumn(ByVal RecordPK As String) 'RecordPK is a passed variable
                                                       'that is the primary key identifier to find the
                                                       'record in the table
'Set variavble name for SQL statement, gives you one place to update instead of hunting through code
Dim strSQL                          As String

'Creates the SQL string in the variable assigned
strSQL = "UPDATE {YourTableNameHere} " & _
         "SET {YourThirdFieldNAmeHere} = True " & _
         "WHERE ((({YourFirstFieldNAmeHere}) = True AND ({YourSecondFieldNAmeHere}) = True AND ({YourPrimaryKeyFieldHere}) ='" & RecordPK & "'));"
'Executes the SQL statement, dbFailOnError will fail if problem exists in SQL statement
CurrentDb.Execute strSQL, dbFailOnError
End Sub

'Use this code if you have a button to trigger event
Private Sub YourButton_Click()
Call UpdateThirdColumn(Me.YourPrimaryKeyControlName)
End Sub

'Use the bottom 2 codes if you want the update for each check box to be checked and update
Private Sub FirstFieldName_AfterUpdate()
Call UpdateThirdColumn(Me.YourPrimaryKeyControlName)
End Sub

Private Sub SecondFieldName_AfterUpdate()
Call UpdateThirdColumn(Me.YourPrimaryKeyControlName)
End Sub

如果您需要更多帮助或解释,请告诉我,我很乐意提供帮助。

我不想更改任何内容,我只想根据其他列更新值。我甚至有它的sql代码,当然不能像预期的那样工作。这样的pita.Im是从内存中写的,但它必须是这样的:Dim RS as DAO.recorset SET RS=DAO.openRecordSet(“您的表名”)!如果rs.fields(“col1”)=真,rs.fields(“col2”)=真,那么rs.fields(“col3”)=真结束如果循环rs.update rs.close我不想更改任何内容,我只想根据另一列更新一个值。我甚至有它的sql代码,当然没有