[AccessD] Pulling Data from Excel into Access with "Automation"

William Benson (VBACreations.Com) vbacreations at gmail.com
Fri Jul 1 21:04:23 CDT 2011


There was a typo in the below. Where I said

             So I switched to   ws =
forms!frmCreateTableFromExcel!lst1.column(0, lst1.listindex)

I meant to say

So I switched FROM ws = forms!frmCreateTableFromExcel!lst1.column(0,
lst1.listindex) 

Sorry about that.


-----Original Message-----
From: William Benson (VBACreations.Com) [mailto:vbacreations at gmail.com] 
Sent: Friday, July 01, 2011 9:58 PM
To: Access Developers discussion and problem solving
Subject: RE: [AccessD] Pulling Data from Excel into Access with "Automation"

OK, I am leaving the subject line the same, because this was (and mostly is)
an awesome automation exercise, which in fact I will send to Brad after I
perfect it. I have built a tool for examining all fields and the occurrence
rate of distinct values those fields have, within Excel data. Chiefly, from
within all worksheets among open workbooks. There is an option to store this
info for easy reference later, or to clear it out and/or refresh it later. 

One thing I like to use it for is examining data when there are way too many
excel rows to look at cleanly and the number of distinct items exceeds what
Excel will show in the autofilter drop down. I also plan to use this to
build Access tables on the fly from the data in a worksheet, and then save
specific sheets to CSV, perhaps building import specs on the fly using Duane
Hookom's identification of the required tables for maintaining import specs.
But I have an annoying glitch which I have solved through a UDF workaround
but I feel I should not have to do that. Maybe someone can read through this
for the likely issue. Or at least reassure me I have no alternative but the
UDF. Which is fast enough, I suppose - but I would think that the UDF will
be calculated with every row in the result, whereas the parameters I wanted
to use would have been calculated by Access only once then used for every
row).

Basic structure is:

4 controls:
   Lst0 shows open workbooks
   Lst1 shows worksheets which have data in row 1, from the workbook chosen
in Lst0
   LstFields shows all the column headers on worksheet = Lst1
   LstValues shows all distinct values in lstField ... and the number of
occurrences. 
      I store the info in a local table and refresh when desired (workbooks
have to be open in order
      To populate the listboxes.

My Problem:
When creating SQL for the rowsource for lstValues, I tried to reference
listbox columns - but was told by Access that was a syntax error. 

QUESTION!
(I don't know if something like this is supposed to work or not:
       ws = forms!frmCreateTableFromExcel!lst1.column(0, lst1.listindex) -
but it don't. I think maybe because listindex can be -1 and there's no value
and that is a problem.

Here is the complete rowsource SQL
	SELECT WB, WS, Fld, [Values], Items FROM Tbl_Field_Values 
	WHERE		WB = forms!frmCreateTableFromExcel!lst0 
	and 		ws = forms!frmCreateTableFromExcel!lst1  
	and 		fld = forms!frmCreateTableFromExcel!lstfields   


So I switched to   ws = forms!frmCreateTableFromExcel!lst1.column(0,
lst1.listindex). That brought good results except that for some reason I
don't quite understand, the value property of the lstFields listbox was not
adjusting when a statement like lstFields.Selected(i) = was used to select a
different value in the listbox. Sure enough the _AfterUpdate event would
fire, but a test of lstFields.Value would show the same value every time,
regardless. That seems evil and wrong to me!
	==snippet - lstFields.Value didn't change when each row was made the
selection.
	  For i = 0 To lstFields.ListCount - 1
	      lstFields.Selected(i) = True   'no impact on .Value
apparently.
	      debug.print lstFields
	  Next

K, how I solved this, now tell me if I am craze... I used a UDF in the
rowsource, which called the values out of those columns -- which the query
wouldn't let me refer to by themselves: my new RowSource is:

SELECT   WB, WS, Fld, [Values], Items FROM Tbl_Field_Values 
WHERE 	WB = ValuefromList("WB")  
		and ws = ValuefromList("WS") and 
		fld = ValuefromList("Fields") 

'Here's the function
Function ValuefromList(str As String) As String Dim frm As Form Dim strval
As String On Error Resume Next Set frm = Screen.ActiveForm If Not frm Is
Nothing Then
  Dim c As Control
  Set c = frm.Controls("Lst" & str)
  If Not c Is Nothing Then
    If c.ListIndex >= 0 Then
      strval = c.Column(0, c.ListIndex)
    End If
  End If
End If
ValuefromList = strval

End Function




More information about the AccessD mailing list