2016-05-15 52 views
0

我有一个表中的Access与一些组合框字段(组合框作为行源)。每个组合框有2列(第一个是整数类型,第二个是文本类型)。第二栏是用户可见的内容。第一个是绑定列。如何通过VBA将数据保存到组合框避免“数据类型转换错误”?

如果我打开表格并键入与列表相关的文本,它不会导致任何错误。我想要做的是通过VBA填充组合框,但使用文本而不是整数。

例如,在第一个组合框中,用户可以看到2个选项:“C”和“V”。绑定列中的“C”是1,“V”是2.我需要将字符发送到组合框并保存。当我尝试输入文本时,会发生“数据类型转换错误”。在这种情况下我能做什么?

在此先感谢。

代码:

Public Sub SalvarAreaRangeNoBD(registro As DAO.Recordset, areaRange As Range) 
    Dim totalLin, l As Integer 
    Dim totalCol, c As Integer 
    Dim deletar As Boolean 

    totalLin = areaRange.Rows.Count 
    totalCol = areaRange.Columns.Count 
    deletar = True 

    Call mdlUtil.LimparRegistro(registro) 
    registro.AddNew 

    For l = 1 To totalLin 
     For c = 1 To totalCol 
      If ((areaRange.Cells(l, c) & "") = "") Then 
       registro.Fields(c - 1).Value = Empty 
      Else 
       registro.Fields(c - 1).Value = areaRange.Cells(l, c) 

       If (deletar <> False) Then 
        deletar = False 
       End If 
      End If 
     Next c 

     If (deletar) Then 
      registro.CancelUpdate 
     Else 
      registro.Update 
     End If 

     registro.AddNew 
     deletar = True 
    Next l 
End Sub 
+0

你能不能给我们您所使用的代码? – INOPIAE

+0

@INOPIAE我尝试在单独的表格中编写相同的文本,并遇到同样的问题。访问不允许写入文本,而只允许绑定列中的等效整数。例如。而不是“C”,写1.发生的是,这些数据来自Excel电子表格,我无法搜索相应的整数。 – MyThorRJ

+0

你在哪里使用组合框?在表单上,​​在工作表上?如果你谈论绑定列,你如何填充组合框? – INOPIAE

回答

0

打开表到你试图写入数据,并期待在现场与ComboBox查找。什么是数据类型?

我几乎可以保证它是一个NumberLong Integer

你遇到的问题是,组合框使它看起来就像你存储的字符串值,但它真的存储在ComboBox的第1列的整数值,但显示人类可读的字符串值在第2列。

你需要做的是查找整数值。如果ComboBox的记录源绑定到另一个表,那就太容易了。如果它是value list,那有点烦人,但仍然完全可行。

下面是一个例子:

Public Sub SalvarAreaRangeNoBD(registro As DAO.Recordset, areaRange As Range) 
    Dim totalLin, l As Integer 
    Dim totalCol, c As Integer 
    Dim cellValue as Variant 

    'New code. Be sure to add a reference to Microsoft Scripting Runtime: 
    Dim simpleLookup as Scripting.Dictionary 

    set simpleLookup=getLookup("LookupTableName","DisplayFieldName","NumberFieldName") 

    totalLin = areaRange.Rows.Count 
    totalCol = areaRange.Columns.Count 

    Call mdlUtil.LimparRegistro(registro) 
    registro.AddNew 

    For l = 1 To totalLin 
    For c = 1 To totalCol 
     cellValue=areaRange.Cells(l, c) 
     'If ((cellValue & "") = "") Then 
     ' 'Do nothing 
     'Else 
     If simpleLookup.exists (cellValue) then 
      'Only add the row to the recordset if you're actually going to use it. 
      registro.AddNew 
      registro.Fields(c - 1).Value = simpleLookup(cellValue) 
      registro.Update 
     Else 
      'Do nothing 
     End If 
     'End If 
    Next c 
    Next l 
End Sub 

Public Function getLookup(tableName as String, displayField as String, recordField as String) as Scripting.Dictionary 
    dim rs as DAO.Recordset 
    Set getLookup = new Scripting.Dictionary 
    Set rs = CurrentDB.OpenRecordset(tableName) 
    With rs 
    Do Until .eof 
     getLookup.Add .fields(displayField).value, .fields(recordField) 
     .MoveNext 
    Loop 
    End With 
End Function 
+0

hi @C。白色。我看了一下你的代码,我发现它不会解决问题,不幸的是。请查看原因并告诉我是否同意: 1 - 它必须是通用代码(可重复使用)。 2 - 我的表可能(通常有)多一个组合框字段。 3 - 我的表格包含非链接字段以及组合框字段(例如价格,日期等)。 4 - 我需要将所有单元格保存到表格中,即使是重复数据的单元格也是如此。 “如果simpleLookup.exists(cellValue),那么”不允许我这样做。 我感谢你的承诺。 – MyThorRJ

+0

我的目标是将Excel电子表格中的范围复制到Access表格中。尽管组合框字段与文本类型的范围字段不同,但该范围具有相同的列,并且数据类型相同。我的代码对此很好。仅在我身边的三个事实是Access不允许将文本数据直接粘贴到组合框字段中。 – MyThorRJ

+0

我试图避免我最终采用的解决方案:删除每个源表中的整数类型字段,并将文本类型字段设置为主键。所以我可以将Excel单元格中的文本粘贴到表格字段中,因为它们具有相同的数据类型。表中的组合框字段将保留,但不再是整数数据类型。代码没有改变,它的功能就像一个魅力! – MyThorRJ

相关问题