2010-03-23 8 views
2

특정 데이터를 처리하기 위해 약 15 개의 SQL 쿼리를 생성 한 Access 2007 데이터베이스가 있는데 Access의 메뉴를 사용하여 기본 프레임 탐색 메뉴를 만들었으므로 이제는 모든 th VBA 코드를 사용하여 Excel에 쿼리를 작성한 후에는 단추를 만들고이 코드를 지정하여 아래 코드로이 작업을 수행했습니다. Excel로 액세스 쿼리 내보내기

Private Sub query1_Click() 
DoCmd.TransferSpreadsheet acExport, _ 
acSpreadsheetTypeExcel9, "Total Users and Sessions", _ 
"C:\UsersandSessions.xls", , "Total Users & Sessions" 
End Sub 

지금 순간에 내 문제가 잘 쿼리가 Excel로 수출되고 있지만, 모두에 적용 서식없이 그렇게되는 것을, 나는 적어도 어쩌면 헤더와 일부 서식을 추가하고 싶습니다 스프레드 시트 내부의 제목과 내가 정말로 좋아하지 않는 한 가지는 모든 레코드가 첫 번째 셀에서 시작된다는 것입니다. 또한 Access에서 해당 버튼을 다시 누르면 Excel 스프레드 시트가 이미 해당 쿼리 출력과 함께 존재하면 다시 클릭하면 다음 사용 가능한 시트에 다시 쓰게됩니다.

어떤 제안이나 아이디어라도 환영합니다.

+0

몇 가지 질문 : # 1 "모든 검색어를 Excel로 추출"이라고 말하면 검색어 결과 만 내보내시겠습니까? # 2이 검색어는 실행되기 전에 사용자 입력, 즉 날짜 기준이 필요합니까? – PowerUser

+0

Access에서 Excel 자동화를 조사해 보셨습니까? 꽤 큰 주제입니다. –

+0

PowerUser, 쿼리에 사용자 입력이 필요하지 않으며 죄송합니다. formmating으로 Excel로 내보내기를 권장합니다. 권장 사항이 있습니까? 감사합니다. – MalsiaPro

답변

0

짧은 이야기는 할 수 없습니까? 결과 파일의 서식을 지정하기 위해 Excel 쪽에서 스크립팅을 할 수 있습니다. 꽤 멋진 것을 원한다면 아마 보고서를 만들고 싶을 것이다.

엑셀 시트를 테이블로 마운트 한 다음 엑셀 파일의 분리 된 시트에 마운트하고 첫 번째 시트를 참조한 다음 두 번째 시트를 볼 수 있도록 포맷 할 수 있습니다.

0

DoCmd.TransferSpreadsheet를 사용하여 원본을 만든 다음 서식을 올바르게 편집하면 DoCmd.TransferSpreadsheet를 다시 실행하여 파일을 값으로 업데이트하지만 서식을 유지합니다.

그러나 사람이 새 탭을 추가하거나 계산을 추가하여 파일을 변경하면 DoCmd.TransferSpreadsheet가 더 이상 작동하지 않으며 추악한 오류 메시지가 표시되어 실패합니다. 따라서 환경에서 DoCmd.TransferSpreadsheet를 서식이있는 원본 파일로 가져 와서 파일을 사용자 데스크톱에 복사 한 다음 VBA에서 복사 한 다음 복사본을 열어 사용자가 원래 원본을 엉망으로 만들지 않도록합니다 엑셀 파일.

이 방법은 최소한의 코드로 깨끗하고 유지하기 쉬운 솔루션입니다. 그러나 추가 "소스"또는 원본 파일이 필요합니다. Access 2007에서 작동합니다.

결과가 새 탭으로 끝나기를 바랍니다. 불행히도, 나는 그렇게하기 위해 자동화가 필요하다고 생각합니다. 엑세스 내부의 VBA는 Excel에서 VBA 내부의 함수를 호출 할 수 있습니다. 그런 다음 해당 VBA는 필요에 따라 탭을 복사 할 수 있습니다.

0

제 생각에는 Access의 Excel 자동화와 Excel에서 템플릿을 만드는 하이브리드가 있습니다.이 템플릿은 쿼리에 연결된 데이터 테이블을 가지고 있습니다. Excel에서 데이터 테이블을 만들려면 시작하십시오. 원하는 경우 또는 원하는 경우 오른쪽 아래에 세 개의 행을 시작하고 두 개의 열을 시작할 수 있습니다. 데이터 탭으로 이동하여 액세스를 클릭하고 데이터베이스를 찾고 링크 할 쿼리를 선택하고 라디오 버튼으로 테이블을 선택하지만 확인 대신 다음 속성을 클릭하고 배경 새로 고침 사용을 선택 취소하십시오.이 부분은 중요합니다 ... 당신이 Mode = Write Deny Write Mode로 변경하는 Connection String의 정의 탭을 보면, db가 열려있는 동안 MS Access VBA에서 오류없이 쿼리가 새로 고쳐지며, 쿼리가 쓰기 가능한 쿼리 인 경우 사용자가 db에 다시 쓰지 못하게합니다. 일단 이것을 설정하면 테이블 디자인 탭에서 선택하지만 테이블 서식을 조정할 수 있으며 서식을 유지할 수 있습니다.

우리는 다음과 같은 VBA 예제의 목적을 위해 셀 B4에서 테이블을 시작하고 이름을 워크 시트 CurrentDay라고 가정합니다.이 참조는 실제 배치로 대체해야합니다.

다음으로 돌아가서 VBA에 액세스하고 작성하십시오. 도구> 참조로 이동하여 알파벳순 목록에서 선택하여 VBA 창에서 Microsoft Excel 12.0 개체 라이브러리에 대한 참조가 선택되어 있는지 확인하십시오. 다음과 같이 하위 만들기 : 당신이 당신의 시트의 A1에서 시작하여 이전 데이터마다 저장하고 액세스에서 단계를 자동화하지 않도록 데이터를 가지고 가야

Sub query1_click() 
Dim xl as Excel.Application 
Dim wbk as Excel.Workbook 
Dim wks as Excel.Worksheet 
Dim RC as Integer 
Dim CC as Integer 
Set xl = New Excel.Application 
Set wbk = xl.wbk.Open "X:\Filelocation\FileName.xlsx" 'name and path you saved the file you previously created 
xl.Visible = True 
'The above is not necessary but you may want to see your process work the first few times and it will be easier than going to task manager to end Excel if something fails. 
RC = xl.Application.CountA(xl.wbk.Worksheets("CurrentDay").Range("B:B")) + 3 'This will count the rows of data in your table including your header so you can copy the data to another tab dynamically as the size of your table expands and shrinks we add 3 to it because we started at row 4 and we need the location of the last row of the record set. 

CC = xl.Application.CountA(xl.wbk.Worksheets("CurrentDay").Range("4:4")) + 1 'This counts the header row and adds one space because we will use this as a location holder for our copy/paste function 

Set wks = xl.wbk.Worksheets.Add 
wks.Name = format(date(),"MM_dd_yy") 'this will name the tab with today's date... you can eliminate this step if you just want the sheets to be the generic Sheet1, Sheet2, etc. 


    With xl.wbk 
      .Worksheets("CurrentDay").Range(Cells(4,2),Cells(RC,CC)).Copy 
      .wks.PasteSpecial xlPasteValues 'This pastes the values so that the table links do not paste otherwise every tab would just refresh everyday. 
      .wks.PasteSpecial xlPasteFormats 'This gets your formatting. 
      .RefreshAll 'This will refresh your table 
    Wend 

    With xl 
     .Save 
     .Close False 
     .Quit 
    Wend 
Set xl = Nothing 
Set wbk = Nothing 
Set wks = Nothing 
End Sub 

.