2016-06-03 3 views
0

내 문제는 열린 특정 보고서 인스턴스에 포커스를 설정하는 것입니다. 양식 객체에는 완벽하게 작동하지만 Report 객체에는 작동하지 않는 함수를 복사합니다. 내 기능 : 오류 438 MS 특정 다중 보고서 인스턴스에 초점을 설정하는 방법에 액세스

  • obj.SetFocus : 루틴, 아래 명령 clsReport에서 각 OBJ를 들어 에서

    Function mInstanceReportCA(varYear As Variant) 
    
    Dim oReport As Access.Report 
    Dim obj As Object 
    
    ' Création du nouveau formulaire 
    For Each obj In clsReport 
        If obj.txtYear = varYear Then 
         obj.Visible 'Error 438 
         obj.SetFocus 'Error 2465 
         Exit Function 
        End If 
    Next obj 
    
    Set oReport = New Report_rptCaMois 
    
    ' Activation du nouveau formulaire 
    With oReport 
    
        If varYear = "1999" Then 
         .txtYear = "1999" 
         .Caption = "Rapport toutes années confondues" 
         .Filter = "Year(dateFacture) > 1999 " 
        Else 
         .txtYear = CStr(varYear) 
         .Caption = "Rapport pour l'année " & CStr(varYear) 
         .Filter = "Year(dateFacture) = " & varYear 
        End If 
        .FilterOn = True 
        .Visible = True 
    End With 
    
    
    ' Ajout du formulaire à la collection globale 
    clsReport.Add Item:=oReport, Key:=CStr(oReport.Hwnd) 
    
    Set oReport = Nothing 
    end function 
    

    오류 메시지가

    1. obj.Visible을 생성 오류 2465

    감사합니다. elp

  • +0

    clsReport 란에

    BringWindowToTop obj.hwnd 

    감사? 보고서의 배열이 아닌 것으로 보입니다. 객체 – BitAccesser

    +0

    clsReport는 콜렉션 객체입니다. –

    +0

    보고서 객체 인 경우'debug.print TypeName (obj)'로 확인하십시오. – BitAccesser

    답변

    0

    왜 이것이 양식에 효과가 있었는지 모르겠지만 이것이 작동하지 않는 이유는 두 가지입니다.

    obj를 Object로 선언합니다. 이것은 인스턴스화 될 때까지 (set obj = New Report) 속성이없는 일반 데이터 형식입니다. 늦은 바인딩을 통해 bang (!) obj.txtdate/obj! visible/obj! Setfocus를 참조하면 작동합니다.

    또한 object.visible에 값 (True/False)을 할당해야합니다. 여러 유형의 객체를 다루지 않는 한 Access obj를 Access.Report로 처리 할 것입니다.

    +0

    당신이 object.visible에 맞으면 참/거짓 값을 할당해야합니다. 코드를 수정했는데 더 이상 오류 메시지가 표시되지 않습니다. 그러나 obj.setFocus의 경우에도 "런타임 오류 2465 - 응용 프로그램 정의 또는 개체 정의 오류"오류 메시지가 표시됩니다. –

    0

    나는 그것을 알아 냈다고 생각한다. clsReport는 콜렉션이 아니며, Dictionary 객체이다. oReport = Nothing을 설정하면 사전에서 객체의 복사본을 보관하지 않으므로 해당 참조를 범위에서 제외합니다.

    컬렉션은 전체 복사본을 저장하므로 복잡한 개체를 저장할 때 사전이 훨씬 빠르고 덜 부 풀릴 수 있습니다.

    다시 말하지만, 내가 모르는 양식에 효과가 있었던 이유는 보고서를 작성한 것처럼 양식 사본을 작성하지 않았기 때문입니다.

    당신은 반드시이 줄을 넣어하지 않는 경우 창조 '하기 전에 뒤 누보 formulaire

    Msgbox Typename(clsReport) 
    

    은 사전 당신의 대답은 당신이 개체 (oReport), 사전 점에서 기준을 파괴 할 때,이 말한다면 ~ 아무것도. 더 이상 존재하지 않는 개체 속성에 액세스하려고 할 때만 For Each 루프에서 컬렉션 (사전) 항목을 참조 할 때 오류가 발생하지 않는 사전 항목을 제거하지 않습니다.

    는 obj.Visible

    Msgbox TypeName(obj) 
    

    위의 같은 MSGBOX 라인을 넣고는 "빈"다시 와야한다.

    +0

    VBA 편집기 스파이 창에서 obj가 제대로 인스턴스화되었는지 확인했습니다. 문제 없습니다. 또 다른 증거, 'If obj.txtYear = varYear Then'테스트는 완벽하게 작동합니다. –

    +0

    나는 코드의 더 많은 부분을 볼 필요가 있다고 생각합니다. 실제 양식 코드와 모음 선언을 게시 할 수 있습니까? – Delecron

    1

    일반적인 부품 모듈

    용액 : 블록 코드

    Public Declare Function BringWindowToTop Lib "user32" (ByVal hWnd As Long) As Long 
    

    : Dirk Goldgar

    +0

    표시대로 허용! – BitAccesser