2016-08-06 9 views
1

Ich habe ein Excel-Makro, das eine andere Arbeitsmappe erstellt, die der Benutzer ändern kann. Wenn ich versuche, Daten in einer Zelle in der neuen Arbeitsmappe einzugeben, erhalte ich jedoch den Fehler "Die Zelle oder das Diagramm, das Sie ändern möchten, befindet sich auf einem geschützten Blatt." Das Blatt in der Makroarbeitsmappe ist tatsächlich geschützt, aber dieses Blatt ist zu dem Zeitpunkt, zu dem der Fehler auftritt, nicht sichtbar. Wenn ich versuche, die sichtbare, neu erstellte Arbeitsmappe zu schließen, wird die Makroarbeitsmappe geschlossen. Das letzte, was mein Makro tut, ist das Blatt in der neuen Arbeitsmappe zu aktivieren. Was muss ich tun, um diese Arbeit zu machen? Das Schließen des Makros schließt natürlich sein eigenes Arbeitsbuch, aber das ist nicht das, was ich tun möchte, da der Benutzer ein anderes Makro in derselben Arbeitsmappe benötigt, um die Änderungen auf dem neuen Arbeitsblatt zu verarbeiten.Excel 2016: Aktives Arbeitsblatt ist nicht das sichtbare

Das Programm hat über 6000 Zeilen Code (bis jetzt), aber hier ist eine der Routinen, die das Problem verursacht.

Private Sub z3_BudgetPrepUpd() 
    'Build a new workbook initialized to let the user modify data 
    'for an existing fiscal-quarter budget. 

    'When this routine executes, 
    '  UserForm1 is still active. 

    Dim strTracer As String    'error-handling tracer for this subroutine 
    Dim strFyrQtr As String 

    On Error GoTo abend 
    If blnAbort Then Exit Sub 
    If blnAbortGlobal Then Exit Sub 

    'Find out which ListBox item the user selected: 
    If UserForm1.ListBox1.ListCount < 1 Then GoTo aa9000  'ListBox is empty 
    If UserForm1.ListBox1.ListIndex < 0 Then        'No item selected 
     strMsgTitle = udtPrm.msgTtl 
     strMsgPrompt = "Please select a fiscal quarter to update." 
     Call z0_MsgBox 
     GoTo aa9000 
    End If 
    strFyrQtr = UserForm1.ListBox1.Value          'Selected item in ListBox 

    'Close UserForm1: 
    UserForm1.Hide 
    ThisWorkbook.Sheets(c_WKS_WELCOME).Activate 

    'Build the udtBgt() array with data for the specified quarter: 
    lngBgtHiNdx = -1 
    Call zz_GetBudgetForQtr(strFyrQtr) 
    If blnAbort Then GoTo aa9000 

    'Build a new workbook for the user to update budget amounts: 
    Workbooks.Add 
    Set wkbNewBook = ActiveWorkbook 

    'Save the names of the default worksheets 
    'so we can delete them later: 
    strDfltSheets() = z0_SheetNames(wkbNewBook) 

    'Build a worksheet with data from the udtBgt() array: 
    Call z3_BuildBudgetUpdSheet 
    If blnAbort Then GoTo aa9000 

    'Delete the default worksheets: 
    Call z0_DeleteSheets(wkbNewBook, strDfltSheets()) 
    If blnAbort Then GoTo aa9000 

    wkbNewBook.Sheets(c_WKS_IPT_BUDGET).Activate 

    'Excel 2016 Bug: 
    'We need to close ThisWorkbook to allow the user 
    'to work with the book we just created: 
    Application.DisplayAlerts = False 
    ThisWorkbook.Close 

aa9000: 
    Exit Sub 

abend: 
    lngErr = Err.Number 
    strErr = Err.Description 
    blnAbort = True 
    Application.Cursor = xlDefault 'no more hourglass 
    strMsgTitle = "Program Error" 
    strMsgPrompt = "The following error occurred:" & Chr(10) & Chr(10) & _ 
           "Error No. " & CStr(lngErr) & Chr(10) & _ 
           "Error Description: " & strErr & Chr(10) & _ 
           "Subroutine: z3_BudgetPrepUpd" & Chr(10) & _ 
           "Tracer: " & strTracer 
    Call z0_MsgBox 
    Resume aa9000 
End Sub 
+0

Wenn Sie Ihre Codes anzeigen, wäre es einfacher, die Probleme zu identifizieren – Rosetta

+0

Ich habe Code von einer der Problemroutinen hinzugefügt, aber ich bin mir nicht sicher, wie viel das hilft. Vielen Dank. –

+0

In welcher Zeile tritt der Fehler bitte auf? und Änderungen bitte senden. –

Antwort

1

Sie verwenden ThisWorkbook, dem ich zustimme. Sie verwenden ActiveWorkbook, das ich fast nie benutze.

Ich würde empfehlen, eine Variable zu verwenden, um einen Verweis auf Arbeitsmappen zu speichern, die nicht Ihren Code enthalten. So verwenden Sie

Dim wb As Excel.Workbook 
Set wb = Application.Workbooks.Open("c:\test.xlsm") 'for opening 

'* or 
Set wb = Application.Workbooks.Add 'for creating a new one 

'* or 
Set wb = Application.Workbooks.Item("AlreadyOpen.xlsm") 'for referencing one already open 

'* from hereon use wb instead of ActiveWorkbook 
wb.Worksheets.Item(1).Visible = True 
+0

Ich legte sofort das ActiveWorkbook auf eine Arbeitsmappe Variable: Set wkbNewBook ​​= ActiveWorkbook, und ich verwende diese Variable von nun an. Das ActiveWorkbook ist das, das sichtbar ist - das gerade erstellte. –

+0

@WestonE, wenn Sie eine neue Arbeitsmappe mit 'workbook.add' erstellen, wird diese neu erstellte Arbeitsmappe nicht automatisch zur aktiven Arbeitsmappe. Wenn Sie also 'wb = activeworkbook' nachträglich setzen, ist die Wahrscheinlichkeit sehr hoch, dass Sie die falsche Arbeitsmappe an wb binden. S Meaden Antwort kann Ihr Problem lösen, indem Sie 'set wb = workbooks.add ' – Rosetta

+0

ich denke, dies erklärt Ihre Fragen, warum" aktive Arbeitsblatt ist nicht das sichtbare ". 'workbook.add' erstellt die neu erstellte Arbeitsmappe nicht automatisch in der VBA-Umgebung. – Rosetta

0

Vielen Dank, alle, für Ihr Interesse und Anregungen. Ich habe das Problem gelöst, indem ich die Anwendung ohne UserForms oder externe Arbeitsmappen umgestalte. Office 2016 hat viele Probleme, und vielleicht ist dies einer von ihnen. Auf jeden Fall habe ich keine Zeit mehr, es zu recherchieren.

Verwandte Themen