2017-01-09 6 views
1

Эй StackOverflow сообщества,Импорт конкретной соте из Excel в MS Access

Я пытаюсь импортировать определенную ячейку из листа первенствовать доступа мс.

Я уже создал в Access код, который помещает определенное поле из excel в таблицу доступа.

Const fName As String = "C:\Users\...\" & varP_ID & ".xlsb" 
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "ImportData", _ 
     fName, False, "Project Details!H12:H12" 

Проблема заключается в том, что файл excel очень динамичен и изменяется. Из-за этого я записал макрос в excel, который находит конкретное поле в листе.

Dim Field As String 
Cells.Find(What:="goal", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ 
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ 
    False, SearchFormat:=False).Activate 
Selection.End(xlDown).Select 

Field = Selection.Text 

Я поместил ячейку, которую я хочу импортировать, для доступа к переменной «Поле». Теперь я не знаю, как объединить эти 2 кода.

Как я могу получить переменную «Поле» в доступе? Что мне нужно кодировать в доступе, что я импортирую определенную ячейку из excel, то есть в любой лист excel в другом месте?

ответ

1

Это можно сделать намного проще.

Создать Именованный диапазон, удерживающий ячейку (ы) для чтения данных.

Затем укажите этот Именованный диапазон при вызове TransferSpreadsheet.

Edit:

Создать именованный диапазон (пример):

Range("A1").Select 
    Cells.Find(What:="goal", After:=ActiveCell, LookIn:=xlFormulas, _ 
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
    MatchCase:=False).Activate 
ActiveCell.Offset(1,5).Resize(1,60).Select 
ActiveWorkbook.Names.Add Name:="Lots", RefersTo:=Selection 
+0

большое спасибо! Но проблема в том, что у меня много разных файлов Excel, где ячейка, которую я хочу импортировать, находится на разных позициях. Поэтому, когда я использую «NamedRange», он не будет функционировать автоматически, и мне нужно создать для каждого файла excel новый диапазон. –

+0

ОК. Вы упомянули только один файл. Затем вы можете изменить свой код, чтобы найти ячейку, а затем - используя ее координаты - создать Именованный диапазон. См. Править. – Gustav

+0

Спасибо вам большое! Я думаю, что моя программа должна работать сейчас. Хороший день –

-1

Есть много способов сделать это.

Sub ImportDataFromRange() 

' Assign the Excel Object 
Dim excelapp As Object 
Set excelapp = CreateObject("excel.application") 

' Assign the workbook 
Dim wb As Object 
Set wb = excelapp.Workbooks.Open("C:\your_path\Excel.xls") 

' Assign the result of your CountA function used in the next line 
Dim numberofrows As Integer 

' Get the bottom-most row number needed to complete our dynamic range address 
numberofrows = 2 + excelapp.Application.CountA(wb.worksheets("Dynamic").Range("A1:A10")) 

' Delete any previous access table, otherwise the next line will add an additional table each time it is run 
DoCmd.DeleteObject acTable, "ExcelDynamicRangeData" 

' Import data from Excel using a range that now knows where bottom row number is 
DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel9, "ExcelDynamicRangeData", "C:\your_path\Excel.xls", True, "Dynamic!A1:B" & numberofrows 

' Close and clean 
wb.Close 
Set wb = Nothing 
excelapp.Quit 
Set excelapp = Nothing 

End Sub  

Private Sub Command0_Click() 

ImportDataFromRange 

End Sub 

Также. , ,

Sub ADOFromExcelToAccess() 
' exports data from the active worksheet to a table in an Access database 
' this procedure must be edited before use 
Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long 
' connect to the Access database 
Set cn = New ADODB.Connection 
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _ 
"Data Source=C:\FolderName\DataBaseName.mdb;" 
' open a recordset 
Set rs = New ADODB.Recordset 
rs.Open "TableName", cn, adOpenKeyset, adLockOptimistic, adCmdTable 
' all records in a table 
r = 3 ' the start row in the worksheet 
Do While Len(Range("A" & r).Formula) > 0 
' repeat until first empty cell in column A 
With rs 
.AddNew ' create a new record 
' add values to each field in the record 
.Fields("FieldName1") = Range("A" & r).Value 
.Fields("FieldName2") = Range("B" & r).Value 
.Fields("FieldNameN") = Range("C" & r).Value 
' add more fields if necessary... 
.Update ' stores the new record 
End With 
r = r + 1 ' next row 
Loop 
rs.Close 
Set rs = Nothing 
cn.Close 
Set cn = Nothing 
End Sub 
Смежные вопросы