2016-05-15 3 views
0

Ich habe eine Tabelle in Access mit einigen Kombinationsfeldfeldern (Kombinationsfeld als Zeilenquelle). Jedes Kombinationsfeld hat 2 Spalten (die erste ist ein Integer-Typ und die zweite ist ein Texttyp). Was für den Benutzer sichtbar ist, ist die zweite Spalte. Die erste ist die gebundene Spalte.So speichern Sie Daten über VBA in einem Kombinationsfeld Vermeiden von "Data Type Conversion Error"?

Wenn ich die Tabelle öffne und den Text einfüge, der sich auf die Liste bezieht, verursacht das keinen Fehler. Was ich tun möchte, ist, das Kombinationsfeld über VBA, aber mit Text statt Ganzzahl zu füllen.

In der ersten Combobox sind beispielsweise 2 Optionen für den Benutzer sichtbar: "C" und "V". "C" in der gebundenen Spalte ist 1 und "V" ist 2. Ich muss das Zeichen an das Kombinationsfeld senden und speichern. Wenn ich versuche, den Text einzugeben, tritt "Datentyp-Konvertierungsfehler" auf. Was kann ich in diesem Fall tun?

Vielen Dank im Voraus.

Code:

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

Können Sie uns den Code, den Sie verwenden? – INOPIAE

+0

@INOPIAE Ich habe versucht, den gleichen Text in einer separaten Tabelle zu schreiben und hatte das gleiche Problem. Access erlaubt nicht das Schreiben von Text, sondern nur die äquivalente Ganzzahl aus der gebundenen Spalte. z.B. anstelle von "C", schreiben Sie 1. was passiert ist, dass diese Daten aus Excel-Tabelle stammt, kann ich nicht nach der entsprechenden Ganzzahl suchen. – MyThorRJ

+0

Wo verwenden Sie die Combobox? In einem Formular auf einem Arbeitsblatt? Wenn Sie über gebundene Spalte sprechen, wie bevölkern Sie die Combobox? – INOPIAE

Antwort

0

Öffnen Sie die Tabelle, auf die Sie versuchen, die Daten zu schreiben und mit dem ComboBox Nachschlag auf dem Gebiet suchen. Was ist der Datentyp?

Ich kann fast garantieren, dass es ein Number ->Long Integer ist.

Das Problem, das Sie in Laufen sind, ist, dass die ComboBox macht es aussehen wie Sie einen String-Wert sind zu speichern, aber es ist wirklich den ganzzahligen Wert in Spalte 1 der ComboBox zu speichern, sondern die Menschen lesbare Zeichenfolge anzeigt Wert in Spalte 2.

Was Sie tun müssen, ist die Ganzzahl-Werte nachschlagen. Wenn die Recordsource der ComboBox an eine andere Tabelle gebunden ist, ist das sehr einfach. Wenn es ein value list ist, ist das ein bisschen ärgerlicher, aber immer noch völlig machbar.

Hier ist ein Beispiel:

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

Hallo @ C. Weiß. Ich habe mir den vorgeschlagenen Code angeschaut und sehe, dass er das Problem leider nicht lösen wird. bitte, sehen Sie, warum und sagen Sie mir, wenn Sie zustimmen: 1 - es muss ein generischer Code (wiederverwendbar) sein. 2 - Meine Tabelle hat (und hat normalerweise) mehr als ein Kombinationsfeld. 3 - Meine Tabelle enthält nicht verknüpfte Felder zusammen mit Kombinationsfeldern (z. B. Preis, Datum usw.). 4 - Ich muss alle Zellen in der Tabelle speichern, auch diejenigen mit wiederholten Daten. "Wenn simpleLookup.exists (cellValue) dann" erlaubt mir nicht, dies zu tun. Ich danke Ihnen für Ihr Engagement. – MyThorRJ

+0

Mein Ziel ist es, einen Bereich in Excel-Tabelle direkt in eine Access-Tabelle zu kopieren. Der Bereich enthält die gleichen Spalten mit demselben Datentyp, trotz der Kombinationsfeldfelder, bei denen es sich, wie Sie vermutet haben, um einen Integer-Zahlentyp handelt, der sich von den Bereichsfeldern des Texttyps unterscheidet. Mein Code funktioniert dafür ziemlich gut. Der einzige Thrus auf meiner Seite ist die Tatsache, dass Access nicht erlaubt, Textdaten direkt in Comboboxfelder einzufügen. – MyThorRJ

+0

Ich habe versucht, die Lösung zu vermeiden, die ich schließlich genommen habe: Löschen der Ganzzahl-Typ-Felder in jeder Quellentabelle und Festlegen der Texttyp-Felder als Primärschlüssel. daher kann ich den Text aus Excel-Zellen direkt in die Tabellenfelder einfügen, da sie denselben Datentyp haben. Kombinationsfeldfelder in der Tabelle bleiben jedoch nicht mehr als Integer-Datentyp. keine Änderung im Code, es funktioniert wie ein Charme! – MyThorRJ

Verwandte Themen