I am trying to populate ADODB Recordset, from a user input in a MS-Access form.
The data type the field in Access table shortext.
The data I am trying to get from the form input is also a text.
queryString="select * From tableshoporder where shopordernumber=" & me.txtInputShoporder.Value
adodb.recordset.open queryString,currentdb.connection,adopendynamic,adlockoptimistic
The above query throws "type mismatch error".
Since you state
The data type of the field in the Access table is short text. The data I am trying to get from the form input is also text.
You'll need to supply the value surrounded by string delimiters, e.g. either using single quotes:
queryString="select * From tableshoporder where shopordernumber='" & me.txtInputShoporder.Value & "'"
Or double quotes:
queryString="select * From tableshoporder where shopordernumber=""" & me.txtInputShoporder.Value & """"
However, note that this will break if me.txtInputShoporder.Value itself contains string delimiters. To avoid this, you can either use Gustav's cSQL function, or use parameters.
I'm attempting to have a user search through a table in Microsoft Access 2010, but the SQL command isn't working. The command that loads and refreshes the table is this:
SELECT Equipment.equipmentID, Equipment.equipmentName, Equipment.model,
Equipment.make, Equipment.equipmentLocation FROM Equipment ORDER BY Equipment.equipmentName;
This works, but when I try to use a variable (or any normal criteria):
searchItem = Me.searchBox.Value
Me.List64.RowSource = "SELECT Equipment.equipmentID, Equipment.equipmentName,
Equipment.model, Equipment.make, Equipment.equipmentLocation FROM Equipment
WHERE Equipment.equipmentName LIKE '%searchItem%' ORDER BY Equipment.equipmentName;"
I've also tried something like "%10%" instead of the searchItem variable, but the command has the table come up blank with no errors. I suspect the problem is with the Equipment.eqiupmentName as the column name, but I can't quite figure out what's wrong here.
Here's a quick look at what the table looks like:
Try this:
Me.List64.RowSource = & _
"SELECT Equipment.equipmentID, Equipment.equipmentName," & _
" Equipment.model, Equipment.make, Equipment.equipmentLocation FROM Equipment" & _
" WHERE Equipment.equipmentName LIKE '*" & searchItem & "*'" & _
" ORDER BY Equipment.equipmentName;"
User rjt011000 has a valid solution, but I recommend using & for string concatenation in VBA (and Access). For an explanation of + and & see this thread.
Access will not recognize or substitute VBA variables inside an SQL statement. Furthermore, the LIKE operator is fed an SQL string value in this case (inside single quotes... which are inside the double quotes), so even if a VBA variable could be referenced directly inside SQL, Access does not interpret any such thing inside a string value.
Regarding the Access SQL LIKE operator, the multi-character matching pattern is * rather than %. Access also recognizes the operator ALIKE which does indeed honor the ANSI pattern %. See LIKE operator docs and this thread regarding ALIKE.
To be more thorough, the string delimiters and LIKE pattern-matching character should be escaped if you don't want the user inadvertently injecting invalid characters that cause errors in the SQL. Following is an example of escaping a couple of them. There are more elegant ways to handle this for all special characters, but the code and technique are beyond the scope of this answer.
...'" & Replace(Replace(searchItem, "*", "[*]"), "'", "''") & "'...
For the record, although Access SQL will not substitute a VBA variable, it will recognize and call a public VBA function. Normally such a public function must be defined in a normal module, but in context of a form's Record Source query, a form-module method can sometimes be called.
One last technique... It is possible to reference a form control's value directly in SQL. This can be very convenient and reduce extra code, but there are a couple caveats:
The form must of course be open, otherwise Access will interpret the reference as an unknown parameter and display a prompt. This will of course not be a problem if the SQL is always in context of the same form.
Access will sometimes automatically refresh the query when such a referenced control is changed, but it is not always guaranteed. The "timing" of automatic refreshes might not be immediately intuitive. You can call the Refresh method on the control or subform from various form events to force the query to refresh after the value is changed.
Notice that in the following example, the string concatenation is inside the VBA string, so that the concatenation actually happens in context of SQL and not beforehand like in the first code snippet. There is no problem with this, just something to consider since this entire answer revolves around proper string interpretation and concatenation.
But really, the same concern exists for un-escaped pattern-matching characters in the user text. Rather than making the SQL text long and ugly with calls to Replace(), instead create a custom function (e.g. EscapePattern()) that does this for any text and then wrap the control reference with that function. The example does this, although I don't include the code for the special function. Such a function could also be used in the first VBA code snippet to simplify building the SQL text.
Me.List64.RowSource = & _
"SELECT Equipment.equipmentID, Equipment.equipmentName," & _
" Equipment.model, Equipment.make, Equipment.equipmentLocation FROM Equipment" & _
" WHERE Equipment.equipmentName LIKE ('*' & EscapePattern(Forms![Form Name]![Control Name]) & '*')" & _
" ORDER BY Equipment.equipmentName;"
There is always more! Did you see the VBA line continuation in my example? It makes the SQL text much easier to view within VBA editor.
I suspect you are not setting your searchItem variable correctly in the SQL string. I am not too familiar with access string concatenation but try separate the searchItem out of the SQL string and then checking if your RowSource has the value you suspect.
Me.List64.RowSource = "SELECT Equipment.equipmentID, Equipment.equipmentName,
Equipment.model, Equipment.make, Equipment.equipmentLocation FROM Equipment
WHERE Equipment.equipmentName LIKE '%" + searchItem + "%' ORDER BY Equipment.equipmentName;"
The sheet name is DATA on excel, using F4 properties in VBA instead of sheet1 I have changed it to sData.
My aql query is not returning any result.I need to extract a column from the Data Sheet of the same workbook in VBA.
My code is :
Sql = "Select productNumber from [shtData$] where produvtDesc = "&pDes&" "
'pDesc is a string variable that stores description.
Is this how we put the sheet name in sql query? I tried [Data$] as well but it doesn't work.
Please help.
Since you didn't add any code concerning the i am assuming that you set up the connection correctly.
use the sheet name you see in excel, not the F4 code (name). Use it with a trailing $ and square brackets like you did
i assume pDes doesn't contain a string in quotes. So, add quotes around your where-criterium
look here on how to set up an ado connection to excel
alternatively, this example of an sql onto an Excel is working even if your actual ado connection refers to another database:
SELECT * FROM [data$A1:E1000] IN 'C:\path\MyFile.xlsx' [Excel 12.0;HDR=YES;IMEX=0]
Edit: For an xls you need different properties, as described in the link above.
i assume your file is called data.xls and that it contains a sheet that is called data
this works if stored in a string and then used as connection string:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\data.xls;
Extended Properties="Excel 8.0;HDR=YES";
and paired with this sql
Sql = "Select productNumber from [data$] where produvtDesc = '" & pDes & "'"
since you want to use a dynamic path try
myCon.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & filepath & "\data.xls;Extended Properties=""Excel 8.0;HDR=YES"";"
They key is to escape the double quotes " with a 2nd "
I think there is a typo on your pDesc variable. In the note you've called it 'pDesc' but in the SQL command string its called 'pDes'.
Also, Is it possible that you have whatever DBMS it is that you are using to be case sensitive when referring to table names (so should therefore be [DATA$])? I know most DBMS's default to case in-sensitive, but I believe it is possible to configure it to be case sensitive during the set up process...
im trying to record a macro. my formula in excel is:
=IF(AND(OR(B2={"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15 ","16 "}),OR(J2={"Q1","Q2","Q3","Q4"})),CONCATENATE(J2," ",IF(K2="p","pre",""),"-"," ",IF(A2="",0,A2)),"")
(this formula basically changes the names of my product according to quarter and type, while taking into consideration previous quarters )
note: once i record it. it looks like this in vba:
Selection.FormulaR1C1 = _
"=IF(AND(OR(RC[-6]={""1"",""2"",""3"",""4"",""5"",""6"",""7"",""8"",""9"",""10"",""11"",""12"",""13"",""14"",""15 "",""16 ""}),OR(RC[2]={""Q1"",""Q2"",""Q3"",""Q4""})),CONCATENATE(RC[2],"" "",IF(RC[3]=""p"",""pre"",""""),""-"","" "",IF("& _
"""",0,RC[-7])),"""")"
and yet, it gives me a syntax error...whats wrong?!
thank you
IF(A2="",0,A2)),"") Is being converted to IF(""",0,RC[-7])),"""")
Assuming that If your original formula is in Range("H2")
"=IF(AND(OR(RC[-6]={""1"",""2"",""3"",""4"",""5"",""6"",""7"",""8"",""9"",""10"",""11"",""12"",""13"",""14"",""15 "",""16 ""}),OR(RC[2]={""Q1"",""Q2"",""Q3"",""Q4""})),CONCATENATE(RC[2],"" "",IF(RC[3]=""p"",""pre"",""""),""-"","" "",IF(RC[-7]="""",0,RC[-7])),"""")"
I don't see the need to surround number with quotes when using formula contants
"=IF(AND(OR(RC[-6]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}),OR(RC[2]={""Q1"",""Q2"",""Q3"",""Q4""})),CONCATENATE(RC[2],"" "",IF(RC[3]=""p"",""pre"",""""),""-"","" "",IF(RC[-7]="""",0,RC[-7])),"""")"
Don't start a line continuations in the middle of a double escape pattern """". I prefer to place them between statements when possible
The easiest way to convert a formula to R1C1 notation is to use the Immediate Window
?Chr(34) & Replace(Range("H2").FormulaR1C1,chr(34),Chr(34) & Chr(34)) & Chr(34)
Build and test your strings in the Immediate Window when possible. It will complain when it is wrong
You can even use create variables in the Immediate Window when writing concatenations
The only thing that's wrong is the "& _ part. It should be replaced by RC[-7]=. See the corrected line below.
Selection.FormulaR1C1 = _
"=IF(AND(OR(RC[-6]={""1"",""2"",""3"",""4"",""5"",""6"",""7"",""8"",""9"",""10"",""11"",""12"",""13"",""14"",""15 "",""16 ""}), OR(RC[2]={""Q1"",""Q2"",""Q3"",""Q4""})), CONCATENATE(RC[2],"" "",IF(RC[3]=""p"",""pre"",""""),""-"","" "",IF(RC[-7]="""",0,RC[-7])),"""")"
I am needing to insert a formula in using vba coding.
at the moment the line of code is
=IF(
AND(
Compliance="No",
OR(
Delivery <> "",
C31 <> ""
)
),
"Please Delete Compliance Data",
IF(
AND(
E11="",
E13="",
E23="",
E25="",
E26="",
E28="",
E30="",
E31=""),
VLOOKUP(C15,'Extrapolated RV Calculator'!B:S,18,0),
"Please complete form / SC request"
)
)"
It seems to error out on the text portions inside the code.
Any help would be appreciated.
Here are four ways to use quotation marks inside strings in VBA:
Replace "" with Chr$(34). 34 is the ASCII code for quotation marks
Use String(2,Chr$(34)) to make double quotes
Use two double quotation marks for every one (per Tim's comment)
Replace two double quotation marks with a different method, like ISBLANK for worksheet functions.
None of these is better. I usually use two double quotation marks to escape them. But sometimes I get so many quotation marks together that it's hard to read and maintain, so I'll use a different method. Here's an example:
Dim aFormula(1 To 5) As String
aFormula(1) = "=IF(AND(Compliance=""No"",OR(Delivery<>" & String(2, Chr$(34))
aFormula(2) = ",C31<>" & String(2, Chr$(34)) & ") ),"
aFormula(3) = Chr$(34) & "Please Delete Compliance Data" & Chr$(34)
aFormula(4) = ",IF(AND(ISBLANK(E11),ISBLANK(E13),ISBLANK(E23),ISBLANK(E25),ISBLANK(E26),ISBLANK(E28),ISBLANK(E30),ISBLANK(E31)),"
aFormula(5) = "VLOOKUP(C15,'Extrapolated RV Calculator'!B:S,18,0),""Please complete form / SC request""))"
Sheet1.Range("R13").Formula = Join(aFormula, vbNullString)
To empower you for the future I strongly recommend you do the following when you want to use functionality in Excel in your VBA code that you are not acquainted with yet.
Go to the developer menu and press the record macro button.
Now fill in a formula in a cell, Clear a cells content by pressing delete and clearing a cells content by going into the cell and deleting all the characters and press enter.
Now stop the macro. And go to the VBA window. See how the code is structured to accomplish these things.
Apply this also whenever you want to do other things to get a good idea of what you can use to get the results you want without having to browse around on the internet for ages!
Also watch the local variables in the locals window or Debug.Print the string you try to build to see hwat it looks so far