2011-09-21 6 views
1

VBA를 사용하여 Excel에서 저장된 MS 액세스 쿼리를 실행하려고합니다. ADODB를 사용하여이 작업을 수행하기위한 제네릭 함수를 만들었습니다. 매개 변수의 유무에 관계없이 결과를 얻을 수 있습니다.VBA 모듈을 사용하는 액세스 저장 쿼리에서 오류가 발생했습니다.

그러나 액세스 vba 모듈을 참조하는 저장된 쿼리를 실행하려고하면 barfs가 런타임 오류 "정의되지 않은 함수 MissCat"(저장된 쿼리가 사용하는 사용자 지정 함수의 이름)을 능가합니다.

나는이 함수가 함수의 정의를 알고 있기 때문에 작동 할 것으로 예상 했었지만 지금은 ADODB 인터페이스가 작성한 VBA 모듈의 도움없이 저장된 쿼리에서 SQL을 interperet하려고 시도하고 있다는 느낌이 들었다. 액세스.

대부분의 사용자가 컴퓨터에 액세스 할 수있는 권한이 없기 때문에이 농구대를 뛰어 넘고 있습니다.

저장된 쿼리를 그대로 사용할 수 있습니까 (쿼리 인터페이스를 변경하는 등)? 또는 사용자 정의 함수가 필요하지 않도록 쿼리를 변경하는 최소 저항의 경로입니다 (아래에서 볼 수 있듯이 매우 간단합니다. SQL을 잘 모르기 때문에 버팀목으로 사용했습니다)

여기

함수

Function MissCat(ProShip As Date, TargetDate As Date) As String 

If TargetDate >= ProShip Then 
    MissCat = "Meets target" 
    Exit Function 
End If 

If TargetDate < Date Then 
    MissCat = "Unrecoverable" 
    Exit Function 
End If 

Select Case ProShip - TargetDate 
    Case 1 To 6 
     MissCat = "Less than one week" 
    Case 7 To 14 
     MissCat = "1-2 Weeks" 
    Case Else 
     MissCat = "Greater than 2 Weeks" 
End Select 
End Function 

이며, 여기에 SQL을 것입니다 감사

TRANSFORM Count(Shipset.ID) AS CountOfID 
SELECT Calendar.[Week Of] 
FROM Calendar INNER JOIN Shipset ON Calendar.DateSerial = Shipset.ShipDate 
WHERE (((Calendar.[Week Of])>Date()-(13*7)) AND ((Shipset.ShipDate) Is Not Null) AND ((Shipset.ReqOut)=False) AND ((Shipset.TwoTier)=False)) 
GROUP BY Calendar.[Week Of] 
ORDER BY IIf(MissCat([Shipset]![ShipDate],[Shipset]![TargetDate])="Meets Target","Meets Target","Hit") DESC 
PIVOT IIf(MissCat([Shipset]![ShipDate],[Shipset]![TargetDate])="Meets Target","Meets Target","Hit"); 

,

+0

엑셀에서 ADO를 사용할 때 액세스 (응용 프로그램)가 사용되지 않고 있습니다 : Access VBA 코드를 볼 수없는 Jet 드라이버를 사용합니다. –

답변

1

귀하의 쿼리가있는 경우를 제외하고 사용자 정의 VBA 기능을 사용할 수 없습니다 Access 세션 내에서 실행됩니다.

중첩 된 IIf() 함수 문을 MissCat 함수로 대체 할 수 있습니다. 중첩이 복잡 할 때 그 접근법에 대한 두 가지 과제 : 논리를 따라 가기가 어렵습니다. 구문을 망칠 수 있습니다.

일반적인 형태

는하여 IIf (조건, truepart, falsepart가)

그래서 첫 번째 조건을 위해, 당신은 액세스에서 만든 임시 절차에서 이것을 시도이다.

Debug.Print IIf(TargetDate >= ProShip, "Meets target", "else") 

다음 단계로 두 번째 조건에 대해 "else"를 IIf 표현식으로 대체하십시오.

Debug.Print IIf(TargetDate >= ProShip, "Meets target", _ 
    IIf(TargetDate < Date, "Unrecoverable", "else")) 

등등. 이것은 내가 최종 그랜드 혼란으로 끝내었던 것이다.

Debug.Print IIf(TargetDate >= ProShip, "Meets target", _ 
    IIf(TargetDate < Date, "Unrecoverable", _ 
    IIf(ProShip - TargetDate < 7, "Less than one week", _ 
    IIf(ProShip - TargetDate < 15, "1-2 Weeks", "Greater than 2 Weeks")))) 

절차가 올바르게 작동하면 중첩 된 IIf 식을 복사하고 새 Access 쿼리에서 테스트합니다.

SELECT 
    ProShip, 
    TargetDate, 
    IIf(TargetDate >= ProShip, "Meets target", 
    IIf(TargetDate < Date, "Unrecoverable", 
    IIf(ProShip - TargetDate < 7, "Less than one week", 
    IIf(ProShip - TargetDate < 15, "1-2 Weeks", "Greater than 2 Weeks")))) AS MissCat 
FROM YourTable; 

당신이 원래 쿼리에서 MissCat 기능을 사용하는 방법을 다시보고 후, 내가 직접이 방법을 대체하려고 거라고 생각하지 않습니다. 별도의 쿼리를 만들어 기본 데이터를 변환 한 다음 원래 쿼리를 적용하여 새 쿼리를 해당 데이터 원본 중 하나로 사용합니다.

2

@ HansUp의 탁월한 분석을 바탕으로 작성하면 SWICH() 문을 읽기가 더 쉽다고 생각합니다.사용 DATEDIFF('D', TargetDate, ProShip)DATETIME 값을 산술 연산을 사용하는 것보다 (즉 의도를 해독) 읽기 쉬울 경우

SELECT ProShip, 
     TargetDate, 
     SWITCH 
     (
      TargetDate >= ProShip,  "Meets target", 
      TargetDate < Date,   "Unrecoverable", 
      ProShip - TargetDate < 7, "Less than one week", 
      ProShip - TargetDate < 14, "1-2 Weeks", 
      TRUE,      "Greater than 2 Weeks" 
     ) 
    FROM YourTable; 

는 또한 궁금합니다.

+0

SWITCH()는 항상 저에게 붉은 깃발을 올렸습니다. 이것은 SQL 문에 데이터를 저장하는 신호이며, 대신 룩업 테이블을 사용해야합니다. 이 경우에는 값이 너무 작아서별로 중요하지 않지만, 조회 테이블은 SQL에 이런 종류의 것을 묻는 것보다 더 나은 문서입니다. –

+1

David-W-Fenton : "항상 저에게 붉은 깃발을 꽂습니다"- Stackoverflow-이 말은 "코드 냄새"입니다. 표현식이 항상 같은 술어를 기반으로하지만,이 경우에는 조인을 사용하는 것이 거의 의미가없는 경우가 여러 개 있다고 생각합니다. 'TargetDate onedaywhen

+0

SQL 문에 데이터를 포함하는 관점에서 Switch()는 내가 제안한 복합 IIf() 표현식보다 더 이상 냄새가 없습니다. 그 IIf() 표현식은 당신의 Switch() 예제처럼 데이터를 저장합니다. 그러나 데이비드는 그런 IIf() 접근법에 대한 불만을 결코 제기하지 않았다. Switch()에 대해서만. 그가 우리가 그에게 물을 수 없을 정도로 간다. RIP, David. – HansUp

관련 문제