2012-07-10 1 views
2

현재 Access에서 하위 폼의 레코드를 필터링하고 단추를 클릭하면 첫 번째 시트의 데이터가있는 Excel 문서를 만드는 양식이 있습니다. 후속 시트에서 발생하는 다른 계산이 많이 있지만 첫 번째 시트의 "이름"열에 "이름"필드가 이미있는 항목에 대해서만 발생해야합니다. 다른 계산은 SQL 문을 통해 수행됩니다.Access에서 VBA 내부의 변수에 전체 Excel 열을 어떻게 할당 할 수 있습니까?

내 생각 과정은 그런 짓을하는 것입니다 NameField는 이름의 요소가 될 것이며, NameColumn은 전체 열 것

SELECT (various fields) FROM (query name) WHERE (first couple of where statements) AND NameField IN NameColumn 

. 성공없이 여러 방법으로이 변수를 만들려고했습니다. 예를 들어 내가 시도한 한 가지는 올바른 인스턴스에서 "(", ","및 ")를 추가하는 레코드를 반복하는 것이었지만 문자열이 너무 길어서 Access에서 실행하지 못했습니다. 나는 또한처럼 변수를 정의하는 시도 :

NameColumn = ExcelApplication.Range("A:A") 

그리고

NameColumn = Worksheet.Range("A:A") 

그리고

NameColumn = ExcelApplication.Columns("A:A").EntireColumn 

등,하지만이 모든에만 컬럼의 첫 번째 항목을 참조 할 것. 솔루션을 연구하려고했지만 유용한 것도 하나도 없습니다. 아무도 내가 이런 식으로 접근하는 방법을 알고 있습니까?

편집 : 아마도 NameColumn이 이전에 아무 것도 정의되지 않았기 때문에이 메서드를 사용하여 첫 번째 항목 만 얻는다고 생각한다고 언급해야합니다. 그러나 나는 일을 시도 :

Dim NameColumn As Range 

을하지만 난 후 다음과 같은 오류 얻을 것이다 : 나는 범위 나타났습니다 몇 가지 조사가 유효한 데이터 형식

을 것으로 보인다 이후부터

Compile Error: 
User-defined type not defined 

이상한 편집 2 : 내 Excel 응용 프로그램 및 워크 시트를 정의하는 방법은 다음과 같습니다.

EDIT 3 : 도움이 될 경우 좀 더 완벽하게 편집했습니다.

,

EDIT 4 : 코드

Dim rst As DAO.Recordset 
Dim ApXL As Object 
Dim xlWBk As Object 
Dim xlWSh As Object 
Dim fld As DAO.Field 
Const xlCenter As Long = -4108 
Const xlBottom As Long = -4107 

On Error GoTo err_handler 

Set rst = frm.RecordsetClone 

Set ApXL = CreateObject("Excel.Application") 
Set xlWBk = ApXL.Workbooks.Add 
ApXL.Visible = True 

Set xlWSh = xlWBk.Worksheets("Sheet1") 

#THESE TWO BLOCKS COPY THE DATA FROM THE SUBFORM# 
For Each fld In rst.Fields 
    ApXL.ActiveCell = fld.Name 
    ApXL.ActiveCell.Offset(0, 1).Select 
Next 

rst.MoveFirst 
xlWSh.Range("A2").CopyFromRecordset rst 
. 
. 
. 
Dim FirstColumn As Object 
Set FirstColumn = xlWSh.Columns(1) 
. 
. 
. 
+0

작동 완전히 다른 답변이므로 정말 분할되어야합니다. . 질문의 원하는 부분, Excel 자동화 또는 Access SQL을 결정한 다음 해당 질문과 관련된 대답을 결정하십시오. – Fionnuala

답변

1

왜 하위 쿼리를 사용하여 더 업데이트?

AND NameField IN (SELECT NameField FROM [Sheet1$a1:a10]) 

또는 명명 된 범위에 대한

:

AND NameField IN (SELECT NameField FROM NameColumn) 

DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel8, _ 
    "Atable", "z:\docs\test.xls", True, "A1:A15" 

마지막 댓글 :

SELECT * FROM Table1 
WHERE ADate NOT IN (
    SELECT SomeDate 
    FROM [Excel 8.0;HDR=YES;DATABASE=Z:\Docs\Test2.xls].[Sheet1$a1:a4]) 
+0

이것은 실제로 문제가있는 부분입니다. 나는 두 번째 NameFields가 두 번째가 [Sheet1 $ a1 : a10]/NameColumn과 정확히 일치하기 때문에 동일하지 않다고 가정합니다. 어쨌든, 나는 이들 중 하나를 작동시키지 못합니다. 첫 번째로 두 번째 NameField는 무엇이되어야합니까? 방금 시도한 : 및 NameField IN (Worksheet.Range ("A1 : A10")) 수 없기 때문에 생각할 수 없기 때문에이 "나형 오류"오류가 발생했습니다. 또한 두 번째 예제에서 NameColumn은 하위 폼이되므로 테이블이나 쿼리를 기대하기 때문에 NameColumn에서 오류가 발생합니다. – KryptKeeper

+0

편집 한 내용에서 쿼리 인스턴스를 찾는 것이 아니라 Excel 인스턴스로 작업하려고한다는 것을 알았습니다. 범위 또는 명명 된 범위를 테이블로 연결하고 Access 테이블과 마찬가지로 작업 할 수 있습니다. Excel에서 범위를 참조하는 쿼리를 작성할 수도 있습니다. 개요 쿼리에서 Excel 또는 Access를 사용합니까? – Fionnuala

+0

와우, 범위를 표로 변환하는 것이 가능하다는 것을 몰랐습니다. 지금 당장 살펴볼 것입니다.하지만 그런 일을하는 것에 대해 찾기가 어려운 유용한 링크가 있습니까? 그리고 미안하지만, "개요 쿼리"란 무엇을 의미합니까? 그것이 의미하는 바가 있다면 나는 Access에서 대부분의 일을하고 있습니다. – KryptKeeper

2

but I would then get the following error: Compile Error: User-defined type not defined which is weird since after some research I've noticed Range seems to be a valid datatype

당신은 Excel Range은 액세스 개체가 아니라 Excel 개체이기 때문에 오류가 발생합니다.

Dim NameColumn As oXl.Range 

여기서 oXL은 앱에 정의한 Excel 응용 프로그램입니다.

그리고 범위를 설정, 당신은 당신이 단어 Set를 사용할 필요가

NameColumn = Worksheet.Range("A:A") 

을 사용할 수 없습니다. 그래서 위의 코드는 내가이 시도

Set NameColumn = Worksheet.Range("A:A") 

또는

Set NameColumn = Worksheet.Columns(1) 

후속

로 변경 그리고이 질문은 지금이 두 개의 완전히 다른 질문을 포함

Dim ApXL As Object, xlWBk As Object, xlWSh As Object, NameColumn As Object 

Set ApXL = CreateObject("Excel.Application") 
ApXL.Visible = True 

Set xlWBk = ApXL.Workbooks.Add 
Set xlWSh = xlWBk.Worksheets("Sheet1") 
Set NameColumn = xlWSh.Columns(1) 
+0

안녕하세요, 응답 해 주셔서 감사합니다! 그것은 정확하게 작동하지 않았지만 이전보다 더 가까이에 느낍니다. 내가 정의한 My Excel 응용 프로그램은 "ApXL"입니다. 당신이 말한 것을 시도한 후에 (Dim NameColumn As ApXL.Range), 나는 여전히 같은 오류가 발생합니다. 그러나 그 코드를 주석으로 처리하려고해도 [Set NameColumn = Worksheet.Columns (1)]을 그대로두면 다음과 같은 오류가 발생합니다. "응용 프로그램 정의 또는 개체 정의 오류"로 인해 다른 방법이 있다고 생각합니다. 이 작업을 수행 할 Range를 정의하십시오. 어떤 아이디어? – KryptKeeper

+0

'Worksheet'를 포함하여 Excel 개체를 정의하는 코드를 공유 할 수 있습니까? 질문을 수정하여 코드를 붙여 넣을 수 있습니다. –

+0

예, 방금 추가했습니다 – KryptKeeper

관련 문제