Ho questo foglio in cui uso Advanced Filter per cercare informazioni all'interno di un altro foglio nella mia cartella di lavoro.
Inoltre, voglio proteggere il foglio perché ho alcune formule sulle cellule che le persone non dovrebbero essere in grado di cambiare, ma ho anche delle celle che l'utente dovrebbe venire con alcune informazioni, poi ho già sbloccato queste celle come puoi vedere di seguito :
Il problema è quando tento di eseguire il mio filter avanzato quando faccio clic sul button "Filtro". Ho un messaggio di errore che dice:
Il filter avanzato non può essere eseguito in Foglio protetto.
Così ho associato questo codice al mio button "Filtro":
Private Sub Filtrar_Click() Dim wks As Worksheet For Each wks In ActiveWorkbook.Worksheets wks.Unprotect "Password" Call LimparAntes wks.Protect "Password", UserInterfaceOnly:=True Next End Sub
Il sub LimparAntes è la routine che chiama Filtro avanzato, ma ho ancora lo stesso errore, quindi sono in dubbio. Il codice è sotto:
Sub LimparAntes() ' ' LimparAntes Macro ' ' Dim Lastrow As Long Lastrow = Sheets("AUX").Range("A" & rows.Count).End(xlUp).Row Sheets("AUX").Range("A1:K" & Lastrow).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Sheets("CONSULTA").Range("D34:I35"), CopyToRange:=Sheets("CONSULTA").Range("B40:K40"), Unique:= _ False Sheets("CONSULTA").Range("F37").Select End Sub
Sub LimparAntes ()Sub LimparAntes() ' ' LimparAntes Macro ' ' Dim Lastrow As Long Lastrow = Sheets("AUX").Range("A" & rows.Count).End(xlUp).Row Sheets("AUX").Range("A1:K" & Lastrow).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Sheets("CONSULTA").Range("D34:I35"), CopyToRange:=Sheets("CONSULTA").Range("B40:K40"), Unique:= _ False Sheets("CONSULTA").Range("F37").Select End Sub
LimparAntes MacroSub LimparAntes() ' ' LimparAntes Macro ' ' Dim Lastrow As Long Lastrow = Sheets("AUX").Range("A" & rows.Count).End(xlUp).Row Sheets("AUX").Range("A1:K" & Lastrow).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Sheets("CONSULTA").Range("D34:I35"), CopyToRange:=Sheets("CONSULTA").Range("B40:K40"), Unique:= _ False Sheets("CONSULTA").Range("F37").Select End Sub
Dim Lastrow As LongSub LimparAntes() ' ' LimparAntes Macro ' ' Dim Lastrow As Long Lastrow = Sheets("AUX").Range("A" & rows.Count).End(xlUp).Row Sheets("AUX").Range("A1:K" & Lastrow).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Sheets("CONSULTA").Range("D34:I35"), CopyToRange:=Sheets("CONSULTA").Range("B40:K40"), Unique:= _ False Sheets("CONSULTA").Range("F37").Select End Sub
Lastrow = Sheets ("AUX") Range ("A" e righe.Count) .End (xlUp) .RowSub LimparAntes() ' ' LimparAntes Macro ' ' Dim Lastrow As Long Lastrow = Sheets("AUX").Range("A" & rows.Count).End(xlUp).Row Sheets("AUX").Range("A1:K" & Lastrow).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Sheets("CONSULTA").Range("D34:I35"), CopyToRange:=Sheets("CONSULTA").Range("B40:K40"), Unique:= _ False Sheets("CONSULTA").Range("F37").Select End Sub
Fogli ("AUX") Gamma ("A1: K" & Lastrow) .Avante azione avanzata: = xlFilterCopy, _Sub LimparAntes() ' ' LimparAntes Macro ' ' Dim Lastrow As Long Lastrow = Sheets("AUX").Range("A" & rows.Count).End(xlUp).Row Sheets("AUX").Range("A1:K" & Lastrow).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Sheets("CONSULTA").Range("D34:I35"), CopyToRange:=Sheets("CONSULTA").Range("B40:K40"), Unique:= _ False Sheets("CONSULTA").Range("F37").Select End Sub
Intervallo ("D34: I35"), CopyToRange: = fogli ("CONSULTA"). Range ("B40: K40"), Unico: = _Sub LimparAntes() ' ' LimparAntes Macro ' ' Dim Lastrow As Long Lastrow = Sheets("AUX").Range("A" & rows.Count).End(xlUp).Row Sheets("AUX").Range("A1:K" & Lastrow).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Sheets("CONSULTA").Range("D34:I35"), CopyToRange:=Sheets("CONSULTA").Range("B40:K40"), Unique:= _ False Sheets("CONSULTA").Range("F37").Select End Sub
È questo il modo corretto di farlo? Ho fatto molta ricerca, ma non ho trovato nessuno con lo stesso problema con il filter avanzato come io così non so nemless se è ansible get quello che voglio.
Tutto questo è il codice?
Appena guardando il codice senza eseguirlo, i primi passi dovrebbero essere per sbloccare / eliminare tutti i fogli facendo:
Dim wks As Worksheet For Each wks In ActiveWorkbook.Worksheets wks.Unprotect "Password" Next
Dim wks come foglio di lavoroDim wks As Worksheet For Each wks In ActiveWorkbook.Worksheets wks.Unprotect "Password" Next
Per each settimana in ActiveWorkbook.WorksheetsDim wks As Worksheet For Each wks In ActiveWorkbook.Worksheets wks.Unprotect "Password" Next
wks.Unprotect "Password"Dim wks As Worksheet For Each wks In ActiveWorkbook.Worksheets wks.Unprotect "Password" Next
Quindi al termine, dovresti eseguire LimparAntes (). Quindi copia / filtra i dati necessari. E poi finalmente dovresti bloccare i fogli.
Private Sub Filtrar_Click() Dim wks As Worksheet For Each wks In ActiveWorkbook.Worksheets wks.Unprotect "Password" 'Unprotect all sheets first Next Call LimparAntes 'Call filter sub For Each wks In ActiveWorkbook.Worksheets wks.Protect "Password", UserInterfaceOnly:=True 'Re-Protect all sheets Next End Sub
Private Sub Filtrar_Click ()Private Sub Filtrar_Click() Dim wks As Worksheet For Each wks In ActiveWorkbook.Worksheets wks.Unprotect "Password" 'Unprotect all sheets first Next Call LimparAntes 'Call filter sub For Each wks In ActiveWorkbook.Worksheets wks.Protect "Password", UserInterfaceOnly:=True 'Re-Protect all sheets Next End Sub
Dim wks come foglio di lavoroPrivate Sub Filtrar_Click() Dim wks As Worksheet For Each wks In ActiveWorkbook.Worksheets wks.Unprotect "Password" 'Unprotect all sheets first Next Call LimparAntes 'Call filter sub For Each wks In ActiveWorkbook.Worksheets wks.Protect "Password", UserInterfaceOnly:=True 'Re-Protect all sheets Next End Sub
Per each settimana in ActiveWorkbook.WorksheetsPrivate Sub Filtrar_Click() Dim wks As Worksheet For Each wks In ActiveWorkbook.Worksheets wks.Unprotect "Password" 'Unprotect all sheets first Next Call LimparAntes 'Call filter sub For Each wks In ActiveWorkbook.Worksheets wks.Protect "Password", UserInterfaceOnly:=True 'Re-Protect all sheets Next End Sub
wks.Unprotect "Password" 'Proteggi tutti i fogli primaPrivate Sub Filtrar_Click() Dim wks As Worksheet For Each wks In ActiveWorkbook.Worksheets wks.Unprotect "Password" 'Unprotect all sheets first Next Call LimparAntes 'Call filter sub For Each wks In ActiveWorkbook.Worksheets wks.Protect "Password", UserInterfaceOnly:=True 'Re-Protect all sheets Next End Sub
Chiama LimparAntes 'Filtro chiamata subPrivate Sub Filtrar_Click() Dim wks As Worksheet For Each wks In ActiveWorkbook.Worksheets wks.Unprotect "Password" 'Unprotect all sheets first Next Call LimparAntes 'Call filter sub For Each wks In ActiveWorkbook.Worksheets wks.Protect "Password", UserInterfaceOnly:=True 'Re-Protect all sheets Next End Sub
Per each settimana in ActiveWorkbook.WorksheetsPrivate Sub Filtrar_Click() Dim wks As Worksheet For Each wks In ActiveWorkbook.Worksheets wks.Unprotect "Password" 'Unprotect all sheets first Next Call LimparAntes 'Call filter sub For Each wks In ActiveWorkbook.Worksheets wks.Protect "Password", UserInterfaceOnly:=True 'Re-Protect all sheets Next End Sub
wks.Protect "Password", UserInterfaceOnly: = True 'Re-Protect tutti i fogliPrivate Sub Filtrar_Click() Dim wks As Worksheet For Each wks In ActiveWorkbook.Worksheets wks.Unprotect "Password" 'Unprotect all sheets first Next Call LimparAntes 'Call filter sub For Each wks In ActiveWorkbook.Worksheets wks.Protect "Password", UserInterfaceOnly:=True 'Re-Protect all sheets Next End Sub
Prova questo e vedi se rimuove l'errore. In caso contrario, ho letto che impostare la properties; autofilter su True prima di bloccare il foglio potrebbe essere utile.