VBA MS Access使用Instr将列中的值与值进行比较

时间:2015-12-16 16:59:35

标签: vba ms-access-2010

我有一个Access数据库,其中包含一个主表和一个引用表。我试图根据表中的列是否包含数组中的值(从参考表中提取)来更改表中的列,因此逻辑是这样的

  • 比较数组的值以查看它是否包含在主表的列
  • 如果它包含在主表列中,请将组列更改为数组中的值

我有下面的代码,它只是将数组中的值与表进行比较并打印该值。我得到错误"类型不匹配"。有谁知道我如何比较记录?

document.getElementsByClassName('.option-dbclickable').ondblclick = function(){
   alert(this.parentNode.value);
};

2 个答案:

答案 0 :(得分:0)

您应该只使用更新查询即可完成此操作。

例如:
Main_Table包含以下字段:ID(AutoNum)和FieldToChange(文字)
ReferenceTable包含以下字段:ID(自动编号),ALookUpValue(文字),ChangeTo(文字)

如果ALookUpValue中的值显示在FieldToChange中的任何位置,则将字段值替换为ChangeTo中的whatevers。

因此,如果FieldToChange包含ABCDEFG,则ALookUpValue包含A,ChangeTo包含' blah blah'然后ABCDEFG会更新说“等等”#

UPDATE MainTable INNER JOIN ReferenceTable ON MainTable.FieldToChange LIKE '*' & ReferenceTable.ALookUpValue & '*'
SET MainTable.FieldToChange = ReferenceTable.ChangeTo

希望这是可以理解的 - 结束一天。 :)

编辑 - 测试数据库副本 - 它会更新值!

答案 1 :(得分:0)

有几件事:

  1. Instr()返回一个数字(特别是Long的变体类型),它是查找值的第一个位置。你将它与布尔值(T / F)进行比较。但在VBA中,这仍然是合法的,因为False是零值和真正的非零值。但是,建议永远不要依赖这些types的等效数值。
  2. 不应将括号括在整个记录集项目周围,而只应围绕字段名称:
  3. 检查数组项类型。如何声明和填充它可能会调用Type Mismatch错误。您不包括如何初始化和定义数组MyArray。根据您的需要,您需要StringVariant类型数组。
  4. 请尝试以下调整:

    Set rstTableName = CurrentDb.OpenRecordset("MAIN_TABLE")
    
    For Each vItem In MyArray
    
        Do While Not rstTableName.EOF
            If InStr(1, rstTableName![NAME], vItem) > 0 Then
                Debug.Print (rstTableName![NAME])
            End If
            rstTableName.MoveNext
        Loop
    
    Next vItem
    

    或者,使用Like运算符

    Set rstTableName = CurrentDb.OpenRecordset("MAIN_TABLE")
    
    For Each vItem In MyArray
    
        Do While Not rstTableName.EOF
            If rstTableName![NAME] Like "*" & vItem & "*" Then
                Debug.Print (rstTableName![NAME])
            End If
            rstTableName.MoveNext
        Loop
    
    Next vItem