Jim Lawrence
accessd at shaw.ca
Fri May 18 21:00:18 CDT 2012
Good job there, Benson. Jim -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Benson, William (GE Global Research, consultant) Sent: Friday, May 18, 2012 6:55 PM To: Access Developers discussion and problem solving Subject: Re: [AccessD] Code to auto-load an ORACLE schema Resolved the error. I needed to append the field to the fields collection and then I also benefited from assigning the property values as I created them and definitely did need to append the properties. I guess order of events is important. Sub CreateTableAndFields() Dim XL As Excel.Application Dim R As Excel.Range Dim WS As Excel.Worksheet Dim WB As Excel.Workbook Dim rBegin As Range Dim rEnd As Range Dim Cell As Excel.Range Dim D As DAO.Database Dim T As DAO.TableDef Dim F As DAO.Field Dim Ar() Dim P As DAO.Property Dim sLastTable As String Dim ub As Long Set XL = MyXL Set D = CurrentDb Set WB = XL.ActiveWorkbook Set WS = WB.ActiveSheet Set R = WB.Names("MyFields").RefersToRange Set rBegin = R.Cells(1, 1).Offset(1, 0) Set rEnd = WS.Cells(WS.Rows.Count, 1).End(xlUp) If rEnd.Row > R.Cells(1, 1).Row Then 'There is data Set rBegin = R.Cells(1, 1).Offset(1, 0) Set rEnd = WS.Cells(WS.Rows.Count, 1).End(xlUp) For Each Cell In XL.Range(rBegin, rEnd).Cells If sLastTable <> XL.Trim(Cell) Then '1 =Table Name (don't need this but may as well) '2 = Field Name '3 = Type '4 = Size '5 = Decimals '6 = ValidationRule '7 = Required ReDim Ar(1 To 7, 1 To 1) On Error Resume Next DoCmd.DeleteObject acTable, XL.Trim(Cell) On Error GoTo 0 Set T = D.CreateTableDef(Name:=XL.Trim(Cell)) ub = 1 Else ub = UBound(Ar, 2) + 1 ReDim Preserve Ar(1 To 7, 1 To ub) End If Ar(1, ub) = XL.Trim(Cell) 'Table Name Ar(2, ub) = XL.Trim(Cell.Offset(0, 1)) 'Field Name Ar(3, ub) = CLng(Cell.Offset(0, 2)) ' Type Ar(4, ub) = CLng(Cell.Offset(0, 3)) ' Size If Len(XL.Trim(Cell.Offset(0, 4))) > 0 Then Ar(5, ub) = CLng(Cell.Offset(0, 4)) 'Decimals End If If Len(XL.Trim(Cell.Offset(0, 5))) > 0 Then Ar(6, ub) = XL.Trim(Cell.Offset(0, 5)) 'ValidationRule End If If XL.Trim(Cell.Offset(0, 6)) = "NOT NULL" Then Ar(7, ub) = True 'Required Else Ar(7, ub) = False End If Set F = T.CreateField(Ar(2, ub), Ar(3, ub), Ar(4, ub)) T.Fields.Append F F.Required = Ar(7, ub) If CStr(Ar(6, ub)) <> "" Then F.ValidationRule = CStr(Ar(6, ub)) End If If CStr(Ar(5, ub)) <> "" Then Set P = F.CreateProperty(Name:="DecimalPlaces", Type:=2, Value:=Ar(5, ub)) 'P.Value = Ar(5, ub) F.Properties.Append P End If If CLng(Ar(3, ub)) = 8 And CLng(Ar(4, ub)) = 8 Then Set P = F.CreateProperty(Name:="Format", Type:=10, Value:="General Date") ' P.Value = "General Date" F.Properties.Append P End If If ub = 1 Then D.TableDefs.Append T ' D.TableDefs.Refresh End If sLastTable = Cell Next End If Application.RefreshDatabaseWindow End Sub -- AccessD mailing list AccessD at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/accessd Website: http://www.databaseadvisors.com