• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

SQL VBA statement met dynamische variabelen

Status
Niet open voor verdere reacties.

nasdreas

Gebruiker
Lid geworden
19 mei 2016
Berichten
21
Beste mensen,

De laatste tijd ben ik aan het stoeien met SQL statements in een vba code. Nu zou ik graag meer variabelen willen definieren en die verwerken in de SQL statement zodat er op meerdere waarden gezocht kan worden. De eerste twee punten zijn al gelukt namelijk: het zoeken op een auto naam (AUTO) middels de textbox ('var') en het wel of niet zoeken op exacte waarde (cbExact). Dit werkt prima.
Ik zou echter een combobox willen toevoegen (wat al gelukt is). De combobox bevat een keuzelijst (Auto, klant). Ik probeer een methode te vinden waarmee ik WHERE [AUTO] kan vervangen door de gekozen waarde via de combobox. Ik zou var2 kunnen definieren welke de uitkomst van de combobox bevat (auto of klant):
Code:
dim var2
var2 = Me.combobox2.value
SQL = "SELECT * FROM TABLEXXX WHERE '" & var2 & "'" = '" & var & "'"

En bij het bovenstaande (Vanaf SQL) loopt het dus spaak. Ik de AUTO vervangen door var2 wat ik volgens op een verkeerde manier doe.
Kan iemand mij uitleggen hoe ik dit juist verander en ook aangeven waarom het op de voorgestelde manier moet? Op die manier kan ik er namelijk van leren.

Code tot nu toe (Die werkt)

Code:
Sub ImportFromAccess()
 
Dim cnn     As ADODB.Connection
Dim rs      As ADODB.Recordset
Dim dbPath  As String
Dim SQL     As String
Dim i       As Integer
Dim var
 
'Error behandelaar
On Error GoTo errHandler:
 
Application.ScreenUpdating = False
 
On Error Resume Next
Worksheets("Import").Range("DataAccess").ClearContents
 
'Waar staat de database?
dbPath = "P:XXXXXXXX"

'De zoekwaarde die een gebruiker in kan typen in een textbox 
var = Me.txtSearchString
 
Set cnn = New ADODB.Connection 'Nieuwe connectie
 
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbPath
 
If cbExact = True Then
SQL = "SELECT * FROM TABLEXXX WHERE AUTO = '" & var & "'"
Else
SQL = "SELECT * FROM RTABLEXXX WHERE AUTO LIKE '" & var & "%" & "'"
End If
 

Set rs = New ADODB.Recordset 
rs.Open SQL, cnn
 
If rs.EOF And rs.BOF Then
    rs.Close
    cnn.Close
   Set rs = Nothing
    Set cnn = Nothing
 
    Application.ScreenUpdating = True
    MsgBox "There are no records in the recordset!", vbCritical, "No Records"
    Me.lstDataFromAccess.RowSource = ""
    Exit Sub
End If

Worksheets("Import").Range("A2").CopyFromRecordset rs
 
'Sluiten
rs.Close
cnn.Close
'Geheugen wissen
Set rs = Nothing
Set cnn = Nothing
 
'Scherm weer aan
Application.ScreenUpdating = True
 
Me.lstDataFromAccess.RowSource = "DataAccess"
 
On Error GoTo 0
Exit Sub
errHandler:
 
Set rs = Nothing
Set cnn = Nothing
MsgBox "Error " & Err.Number & " (" & Err.Description & ") during import"
 
End Sub
 
Veldnamen staan nooit tussen quootjes, zoals je in de harde variant ook kunt zien. Dus waarom zet je de variabele wél tussen quoots? Overigens zie ik de charme niet van 2 meter code, als het ook met één meter kan :)

Code:
Sub ImportFromAccess()
 
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim dbPath As String, SQL As String, sEx As String, var As String
Dim i As Integer
 
    'Error behandelaar
    On Error GoTo Stoppen:
 
    Application.ScreenUpdating = False
    Worksheets("Import").Range("DataAccess").ClearContents
    dbPath = "P:XXXXXXXX"                 'Waar staat de database?
    var = Me.txtSearchString              'De zoekwaarde die een gebruiker in kan typen in een textbox
    Set cnn = New ADODB.Connection        'Nieuwe connectie
    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbPath
    If cbExact = True Then sEx = " = " Else: sEx = " LIKE "
    SQL = "SELECT * FROM TABLEXXX WHERE " & Me.ComboBox2.Value & sEx & """" & var & """"
    Set rs = New ADODB.Recordset
    rs.Open SQL, cnn
    If rs.EOF And rs.BOF Then
        rs.Close
        cnn.Close
        MsgBox "There are no records in the recordset!", vbCritical, "No Records"
        Me.lstDataFromAccess.RowSource = ""
        GoTo Stoppen
    End If
    Worksheets("Import").Range("A2").CopyFromRecordset rs
    rs.Close        'Sluiten
    cnn.Close
    Me.lstDataFromAccess.RowSource = "DataAccess"

Stoppen:
    'Geheugen wissen en Scherm weer aan
    Application.ScreenUpdating = True
    Set rs = Nothing
    Set cnn = Nothing
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") during import"
 
End Sub
 
Bij sommige SQL dialecten moeten strings tussen apostrofjes:

Code:
SQL = "SELECT * FROM TABLEXXX WHERE " & Me.ComboBox2.Value & sEx & "'" & var & "'"
 
@Octa

Geldt ook voor decimeters:

Code:
Sub M_snb()
  Sheets("Import").Cells(1).CurrentRegion.ClearContents
    
  With CreateObject("ADODB.recordset")
    .Open "SELECT * FROM Q_test where '" & combobox2 & IIf(cbExact, "' =", "' Like ") & var, "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=G:\Access\fiets.mdb"
    Sheets("import").Cells(1).CopyFromRecordset .DataSource
  End With
End Sub
 
Iedereen bedankt het werkt. Ik heb de code van Octa gebruikt!

Nog 1 laatste vraagje; stel er wordt niks ingevoerd in de textbox en de combobox hoe zorg ik ervoor dat dan alles geïmporteerd wordt?


Bedankt voor de moeite zover !
 
Laatst bewerkt:
Zo iets:

Vervang:

Code:
SQL = "SELECT * FROM TABLEXXX WHERE " & Me.ComboBox2.Value & sEx & """" & var & """"

door:

Code:
If Me.ComboBox2.ListIndex = -1 Then
    SQL = "SELECT * FROM TABLEXXX"
Else
    SQL = "SELECT * FROM TABLEXXX WHERE " & Me.ComboBox2.Value & sEx & """" & var & """"
End If
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan