2015-01-01 1 views
0

데이터를 가져 오기 위해 특별히 설계되지 않은 Excel 보고서에서 관련 정보를 가져 오려고합니다. 기본적으로 다른 정보와 함께 서식이 지정된 보고서입니다. 아이디어를 얻으려면 첨부 된 이미지를 참조하십시오. 이것은 거대한 보고서이며 수백 개의 행을 포함합니다.Excel 보고서를 읽음으로써 액세스 테이블에서 선택된 정보를 채 웁니다.

특정 행에 대한 정보를 기반으로 한 줄씩 읽는 Excel 파일을 읽은 다음 Access 테이블에 해당 행을 삽입하여 데이터를 가져 오려고 생각합니다.

간략한 버전의 보고서를 첨부하여 보고서 레이아웃에 대한 아이디어와 Access 테이블 구조, 테이블 DailyTranaction에 저장하려는 정보를 제공했습니다. 여기

예 보고서의 이미지 : 여기

enter image description here

액세스 테이블 구조 이미지 :

enter image description here

내가 액세스 VBA를 사용하여 위의 작업을 할 수있는 가장 좋은 방법은 확실하지 않다, 간단한 간단한 예를 들어 주시면 감사하겠습니다.

+0

위치는 필수는 아니지만보고 날짜 및 지점 코드가 필요합니다. – Alchy

+0

저는 첫 번째 행을 날짜로 읽는 방법을 모르며 다른 행의 다른 정보를 읽는 방법을 모르십니까? – Alchy

답변

0

삽입 new code module 복사해서 코드 아래에 붙여 넣습니다

GetDataFromReport ("C:\report.xls") 

을 당신이 볼 수 있듯이 :

Option Compare Database 
Option Explicit 

Public Function GetDataFromReport(ByVal sRepFileName As String) As Integer 
Dim xlApp As Object, xlWbk As Object, xlWsh As Object 
Dim retVal As Integer, sRepDate As String, r As Integer, sBranch As String, sQry As String, rs As Integer 

On Error GoTo Err_GetDataFromReport 

DoCmd.SetWarnings False 

Set xlApp = CreateObject("Excel.Application") 
Set xlWbk = xlApp.Workbooks.Open(sRepFileName) 
Set xlWsh = xlWbk.Worksheets(1) 'or pass the name, ex: "Sheet1" 

sRepDate = xlWsh.Range("A1") 
r = InStr(1, sRepDate, "th") 
sRepDate = Replace(sRepDate, Left(sRepDate, InStr(r - 3, sRepDate, " ")), "") 
sRepDate = Replace(sRepDate, "th", "") 

'find the last row; 
rs = xlWsh.Range("A" & xlWsh.Rows.Count).End(-4162).Row 
r = 3 
Do While r <= rs 
    Select Case UCase(Trim(xlWsh.Range("A" & r))) 
     Case "", UCase("CustId") 
      'skip empty row and header of data 
      GoTo SkipRow 

     Case UCase("Branch:") 
      sBranch = xlWsh.Range("B" & r) 

     Case Else 
      'proceed if the value is numeric 
      If Not IsNumeric(xlWsh.Range("A" & r)) Then GoTo SkipRow 

      sQry = "INSERT INTO Reports([ReportDate],[BranchCode],[CustId],[AccountNo],[Transaction])" & vbCr & _ 
        "VALUES(#" & sRepDate & "#," & sBranch & ", " & xlWsh.Range("A" & r) & _ 
          ", " & xlWsh.Range("B" & r) & ", " & xlWsh.Range("C" & r) & ")" 
      'Debug.Print sQry 
      DoCmd.RunSQL sQry 
      'get the number of rows affected ;) 
      retVal = retVal +1 
    End Select 

SkipRow: 
    r = r + 1 
Loop 

Exit_GetDataFromReport: 
    On Error Resume Next 
    DoCmd.SetWarnings True 
    Set xlWsh = Nothing 
    xlWbk.Close SaveChanges:=False 
    Set xlWbk = Nothing 
    xlApp.Quit 
    Set xlApp = Nothing 
    'return value 
    GetDataFromReport = retVal 
    Exit Function 

Err_GetDataFromReport: 
    MsgBox Err.Description, vbExclamation, Err.Number 
    Resume Exit_GetDataFromReport 

End Function 

이를 사용하려면, 당신은 행동는 위의 함수를 참조해야하는 create macro 필요 원본 통합 문서의 전체 경로를 정의해야합니다.

Alternativelly, 당신은 작성 절차에 의해 위의 코드를 실행할 수 있습니다

Sub Test() 
    MsgBox GetDataFromReport("D:\Report Daily Transaction.xls") " have been imported!", vbInformation, "Message..." 
End Sub 

Alternativelly, 당신은 열려있는 양식 매크로를 만들 수 있습니다. Sample database and report

행운을 빌어 요!

+0

답장을 보내고 실습 예제를 제공 할 시간을내어 주신 Maciej Los에게 많은 감사드립니다. 내 코드를 기본으로 구현하여 코드를 구현합니다. 다시 한번 감사드립니다! – Alchy

+0

@ Alchy, 대단히 환영합니다;) –

관련 문제