Sto riscontrando un problema con una macro VBA in Excel che interagisce con una forma (un rettangolo con angoli arrotondati) su un foglio di lavoro. La macro deve nascondere o mostrare delle colonne in base al testo contenuto nella forma quando questa viene cliccata.
La macro funziona correttamente se utilizzata in modo tradizionale, ma quando applicata alla forma, non sembra rilevare né cambiare il testo della forma come previsto. Inoltre, le colonne non vengono nascoste o mostrate come indicato dal codice.
il nome della forma è esattamente "Rettangolo con angoli arrotondati 27" e che il testo della forma può essere "Mostra V" o "Mostra M".
Ho tentato di utilizzare TextFrame2.HasText e TextFrame2.TextRange.Text per rilevare e modificare il testo all'interno della forma. Tuttavia, nonostante la forma sia visibile e il testo leggibile, il codice non rileva il testo e non modifica il comportamento delle colonne.
Ho implementato il codice per cambiare il testo della forma utilizzando TextFrame2.TextRange.Text per accedere e modificare il testo. Inoltre, abbiamo cercato di attivare l'interazione con la forma tramite la macro, ma nulla è cambiato: né il testo della forma né le colonne sono stati modificati.
Ho anche verificato che la protezione del foglio fosse correttamente gestita, sbloccando e proteggendo nuovamente il foglio con una password (presente nel foglio "Gestione"). Anche in questo caso, il problema persiste.
Nonostante le modifiche e le verifiche effettuate, il testo della forma non viene rilevato correttamente dal codice VBA, e le colonne non vengono nascoste o mostrate come previsto. Inoltre, gli errori riscontrati sono stati:
l elemento corrispondente al nome specificato non è stato trovato.
proprieta' o metodo non supportati dall oggetto.
( DEBUG: If forma.TextFrame.HasText Then ' Verifica se la forma contiene testo )
MACRO:
Sub GestioneColonneForma()
Dim ws As Worksheet
Dim wb As Workbook
Dim correctpassword As String
Dim gestioneSheet As Worksheet
Dim forma As Shape
' Disattiva aggiornamento schermo per maggiore fluidità
Application.ScreenUpdating = False
' Definisce il foglio attivo e la cartella di lavoro
Set ws = ActiveSheet
Set wb = ThisWorkbook
' Recupera la forma attiva (la forma che ha generato l'evento)
Set forma = ws.Shapes(Application.Caller)
' Protezione e sblocco del foglio
On Error Resume Next
Set gestioneSheet = wb.Sheets("Gestione")
On Error GoTo 0
If gestioneSheet Is Nothing Then
MsgBox "Foglio 'Gestione' non trovato.", vbExclamation
Exit Sub
End If
correctpassword = gestioneSheet.Range("E4").Value
ws.Unprotect Password:=correctpassword
' Gestione delle colonne sulla base del testo della forma
If forma.TextFrame2.TextRange.Text = "Mostra V" Then
' Nasconde colonne C, F, I, M, O, Q, U, W
ws.Columns("C").Hidden = True
ws.Columns("F").Hidden = True
ws.Columns("I").Hidden = True
ws.Columns("M").Hidden = True
ws.Columns("O").Hidden = True
ws.Columns("Q").Hidden = True
ws.Columns("U").Hidden = True
ws.Columns("W").Hidden = True
' Scopre colonne D, G, J, N, P, R, V, X
ws.Columns("D").Hidden = False
ws.Columns("G").Hidden = False
ws.Columns("J").Hidden = False
ws.Columns("N").Hidden = False
ws.Columns("P").Hidden = False
ws.Columns("R").Hidden = False
ws.Columns("V").Hidden = False
ws.Columns("X").Hidden = False
' Cambia il testo della forma
forma.TextFrame2.TextRange.Text = "Mostra M"
ElseIf forma.TextFrame2.TextRange.Text = "Mostra M" Then
' Scopre colonne C, F, I, M, O, Q, U, W
ws.Columns("C").Hidden = False
ws.Columns("F").Hidden = False
ws.Columns("I").Hidden = False
ws.Columns("M").Hidden = False
ws.Columns("O").Hidden = False
ws.Columns("Q").Hidden = False
ws.Columns("U").Hidden = False
ws.Columns("W").Hidden = False
' Nasconde colonne D, G, J, N, P, R, V, X
ws.Columns("D").Hidden = True
ws.Columns("G").Hidden = True
ws.Columns("J").Hidden = True
ws.Columns("N").Hidden = True
ws.Columns("P").Hidden = True
ws.Columns("R").Hidden = True
ws.Columns("V").Hidden = True
ws.Columns("X").Hidden = True
' Cambia il testo della forma
forma.TextFrame2.TextRange.Text = "Mostra V"
End If
' Riprotegge il foglio
ws.Protect Password:=correctpassword
' Riattiva aggiornamento schermo
Application.ScreenUpdating = True
End Sub