Domanda Macro checkbox problema nomi

Max Power

Nuovo utente
26 Giugno 2020
17
1
Excel 2016
0
Ciao a tutti,
ho un problema con una macro per creare delle checkbox che non riesco a risolvere, avevo già aperto un post al quale ho ricevuto interessanti risposte e suggerimenti ma ho altre domande da porvi..purtroppo per vari motini non posso allegare alcun foglio excel per cui vi spiego qui sotto quello che dovrei fare e vi allego sia il codice che uno screenshot sul risultato finale sperato, mi scuso per questo problema.
  1. io devo modificare un file dove nella colonna M (ad esempio) vado ad inserire delle checkbox, diciamo 4 ma in realtà molte di più, ognuna con un suo nome ed una sua formattazione così come la cella a cui le varie checkbox sono collegate, che poi è la cella stessa della checkbox e questo, anche grazie all'aiuto vostro riesco a farlo bene
  2. nella colonna O vi sono già presenti dei "si" in corrispondenza dei quali io dovrei manualmente attivare una checkbox, volevo evitare questo passaggio e farlo fare in automatico alla macro, quindi dove c'è "sì" la macro che creo deve essere già nello status VERO, e qui non riesco
  3. nella colonna N voglio metetre una formula che mi dice SE(checkbox = VERO; "nome checkbox"; " ") e anche qui non riesco, in particolare non riesco a mettere il nome, mi restituisce sempre l'errore #NOME?
  4. infine gli farò cancellare la colonna C, per questo voglio che in automatico in fase di costruzione le checkbox siano flaggate automaticamente in corrispondenza dei "si"
Spero di essere stato chiaro, per le mie conoscenze molto basiche non è affatto facile, ho provato in 1000 modi ma non riesco...ringrazio chiunque riesca ad aiutarmi in qualche modo.

Qui sotto un'immagine dello stato di partenza e del risultato finale che vorrei, vedete in verde la situazione desiderata in automatico, in rosso gli errori: il #NOME? riguardante il punto 3 e l'errore in corrispondenza della checkbox topo che non si è flaggata in automatico, punto 2



Visual Basic:
:
Option Explicit

Sub TEST()
    Dim i As Integer
    Dim j As Integer
    Dim myCheckBox As Object
    Dim riga_checkbox()
    riga_checkbox = Array(7, 10, 15, 16)
    Dim colonna_checkbox()
    colonna_checkbox = Array("M") 
    Dim nome()
    nome = Array("Cane", "Gatto", "Topo", "Mucca")
    Dim colonna_formula()
    colonna_formula = Array("N")   
    
    Application.ScreenUpdating = False
    
    Cells.Select
    Selection.RowHeight = 15
        For i = LBound(colonna_checkbox) To UBound(colonna_checkbox)
            Columns(colonna_checkbox(i)).Select
            Selection.ColumnWidth = 10
        Next i
    For i = LBound(riga_checkbox) To UBound(riga_checkbox)
        For j = LBound(colonna_checkbox) To UBound(colonna_checkbox)
            With Range(colonna_checkbox(j) & riga_checkbox(i))
                Set myCheckBox = ActiveSheet.CheckBoxes.Add(.Left, .Top, .Width, .Height)
                myCheckBox.Caption = nome(i)
                myCheckBox.LinkedCell = colonna_checkbox(j) & riga_checkbox(i)
                myCheckBox.Display3DShading = True
            End With
            Cells(riga_checkbox(i), colonna_checkbox(j)).Select
            With Selection.Font
                .ThemeColor = xlThemeColorDark1
                .TintAndShade = 0
            End With
            Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
                Formula1:="=VERO"
            Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
            With Selection.FormatConditions(1).Font
                .ThemeColor = xlThemeColorAccent2
                .TintAndShade = 0.399945066682943
            End With
            With Selection.FormatConditions(1).Interior
                .PatternColorIndex = xlAutomatic
                .ThemeColor = xlThemeColorAccent2
                .TintAndShade = 0.399945066682943
            End With
            Selection.FormatConditions(1).StopIfTrue = False
            Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
                Formula1:="=FALSO"
            Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
            With Selection.FormatConditions(1).Font
                .ThemeColor = xlThemeColorDark1
                .TintAndShade = 0
            End With
            With Selection.FormatConditions(1).Interior
                .Pattern = xlNone
                .TintAndShade = 0
            End With
            Selection.FormatConditions(1).StopIfTrue = False
        Next j
    Next i
    For i = LBound(riga_checkbox) To UBound(riga_checkbox)
        For j = LBound(colonna_formula) To UBound(colonna_formula)
            Cells(riga_checkbox(i), colonna_formula(j)).Select
            ActiveCell.FormulaR1C1 = "=IF(RC[-1]=TRUE,nome(i),"""")"    
        Next j
    Next i

    
    Application.ScreenUpdating = True
    
End Sub
 

alfrimpa

VBA Expert
Supermoderatore
Expert
18 Dicembre 2015
28.275
1.845
66
Napoli
2019 Pro Plus
770
In pratica tu vuoi che se in O7 si scrive si venga selezionata la checkbox in M7 e così via?

In N7 c'è questa formula

=SE(M7=VERO;nome(i);"")

che cosa è nome(i)?

Tu hai inserito delle checkbox controllo modulo; meglio usare gli ActiveX
 
Ultima modifica:

Max Power

Nuovo utente
26 Giugno 2020
17
1
Excel 2016
0
In pratica tu vuoi che se in O7 si scrive si venga selezionata la checkbox in M7 e così via?

In N7 c'è questa formula

=SE(M7=VERO;nome(i);"")

che cosa è nome(i)?

Tu hai inserito delle checkbox controllo modulo; meglio usare gli ActiveX
Esatto, il "si" è già presente, io voglio che la macro veda il "si" e mi selezioni la cella in M, una volta fatto tutto la colonna dove ci sono i vari "si" viene cancellata

nome(i) è lo stesso che ho usato per dare il nome alle checkbox, l'ho definito all'inizio

Dici che sono meglio gli ActiveX? non so come usarli, me li devo studiare
 

alfrimpa

VBA Expert
Supermoderatore
Expert
18 Dicembre 2015
28.275
1.845
66
Napoli
2019 Pro Plus
770
Onestamente non ho capito nulla.

Avevo già fatto qualcosa ma mi rendo conto che non è quello che vuoi.
 

Max Power

Nuovo utente
26 Giugno 2020
17
1
Excel 2016
0
eh...probabilmente non riesco a spiegarlo bene....allora vediamo...nella colonna O io ho già dei "si" impostati, voglio mettere nella colonna M delle checkbox che in corrispondenza di ogni "si" vengano attivate, solo la prima volta, in fase di costruzione, poi si andranno ad attivare oppure no manualmente, è solo per non farlo in fase di costruzione file, tu conta che qui nell'esempio sono solo 4 le checkbox, nella realtà me ne serviranno 276 quindi se si sistemano in automatico coi "si" è meglio....poi la colonna O la cancello perchè non serve più. In pratica al momento i "si" svolgono il lavoro che poi faranno le checkbox
 

alfrimpa

VBA Expert
Supermoderatore
Expert
18 Dicembre 2015
28.275
1.845
66
Napoli
2019 Pro Plus
770
Prova questa macro

Visual Basic:
Sub CreaCHK()
Dim i As Integer
Dim rng As Range
Dim cel As Range
Dim shp As CheckBox
Set rng = Range("O7:O16")
For Each cel In rng
    If cel.Value = "si" Then
    ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, _
        DisplayAsIcon:=False, Left:=cel.Offset(0, -2).Left, Top:=cel.Offset(0, -2).Top, Width:=45, Height:=18 _
        ).Select
    End If
Next cel
For i = 1 To ActiveSheet.Shapes.Count
ActiveSheet.OLEObjects("CheckBox" & i).Object.Value = True
Next i
End Sub
 

Max Power

Nuovo utente
26 Giugno 2020
17
1
Excel 2016
0
Grazie Alfredo,

solo una cosa...mi sbaglio o questa macro mi mette la checkbox SOLO se c'è il si altrimenti non mette nulla?
devo vedere come modificare in modo che la cella viene messa anche senza sì ma in questo caso non attivata
 

alfrimpa

VBA Expert
Supermoderatore
Expert
18 Dicembre 2015
28.275
1.845
66
Napoli
2019 Pro Plus
770
Prova quest'altra

Visual Basic:
Sub CreaCHK()
Dim i As Integer
Dim rng As Range
Dim cel As Range
Dim shp As CheckBox
Set rng = Range("O7:O16")
For Each cel In rng
    'If cel.Value  "si" Then
    ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, _
        DisplayAsIcon:=False, Left:=cel.Offset(0, -2).Left, Top:=cel.Offset(0, -2).Top, Width:=45, Height:=18 _
        ).Select
    'End If
Next cel
For i = 1 To ActiveSheet.Shapes.Count
    If ActiveSheet.OLEObjects("CheckBox" & i).TopLeftCell.Offset(0, 2).Value = "si" Then
        ActiveSheet.OLEObjects("CheckBox" & i).Object.Value = True
    End If
Next i
End Sub
Permettimi una osservazione a latere: a me 276 checkbox sembrano una follia.
 

Max Power

Nuovo utente
26 Giugno 2020
17
1
Excel 2016
0
Ancora grazie Alfredo!! vedo come mettere il tutto con le condizioni di nome checkbox e formattazioni varie....mi manca di capire come far saltar fuori il nome nelle celle della colonna N dove esce l'errore #NOME?

Le checkbox sono tante per un semplice motivo: tu immagina per un sito produttivo di dover verificare delle tariffe contrattuali che hanno 23 voci....immagina ora che per questo sito ci sia la possibilità di avere 3 contratti (23*3 = 69 voci), ora immagina che nel file di analisi non ci sia un sito solo ma 4....ecco che arrivi a quel numero esagerato di checkbox....
 

alfrimpa

VBA Expert
Supermoderatore
Expert
18 Dicembre 2015
28.275
1.845
66
Napoli
2019 Pro Plus
770
....mi manca di capire come far saltar fuori il nome nelle celle della colonna N dove esce l'errore #NOME?
Non ho capito; puoi spiegare meglio?

Cosa deve venire fuori in colonna N?

Tieni presente che la macro non provvede ad impostare per ogni checkbox una cella collegata.
 

Max Power

Nuovo utente
26 Giugno 2020
17
1
Excel 2016
0
se ci fai caso nella colonna N deve saltar fuori il nome della checkbox corrispondente quando questa è attivata, a me restituisce #NOME? come errore
 

Max Power

Nuovo utente
26 Giugno 2020
17
1
Excel 2016
0
il nome solo quando la checkbox è attiva, sia che sia attiva nel momento di inserimento perchè c'è un "si" sia quando ci clicco sopra, lo so....è un casino!
 

alfrimpa

VBA Expert
Supermoderatore
Expert
18 Dicembre 2015
28.275
1.845
66
Napoli
2019 Pro Plus
770
Per l'inserimento prova questa

Visual Basic:
Sub CreaCHK()
Dim i As Integer
Dim rng As Range
Dim cel As Range
Dim shp As CheckBox
Set rng = Range("O7:O16")
For Each cel In rng
    'If cel.Value  "si" Then
    ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, _
        DisplayAsIcon:=False, Left:=cel.Offset(0, -2).Left, Top:=cel.Offset(0, -2).Top, Width:=45, Height:=18 _
        ).Select
    'End If
Next cel
For i = 1 To ActiveSheet.Shapes.Count
    If ActiveSheet.OLEObjects("CheckBox" & i).TopLeftCell.Offset(0, 2).Value = "si" Then
        ActiveSheet.OLEObjects("CheckBox" & i).Object.Value = True
        ActiveSheet.OLEObjects("CheckBox" & i).TopLeftCell.Offset(0, 1).Value = ActiveSheet.OLEObjects("CheckBox" & i).Object.Caption
    End If
Next i
End Sub
e per la singola checkbox questa che va inserito in tutte le checkbox.

Visual Basic:
Private Sub CheckBox2_Click()
If CheckBox2.Value = True Then
    CheckBox2.TopLeftCell.Offset(0, 1).Value = CheckBox2.Caption
    Else
    CheckBox2.TopLeftCell.Offset(0, 1).Value = ""
End If
End Sub
ma le checkbox saranno sempre in colonna M ed i "si" in colonna O?
 
Ultima modifica:

Rubik72

Excel/VBA Expert
Supermoderatore
Expert
12 Dicembre 2015
7.500
245
48
Cosenza
Excel 2016
398
Un saluto a tutti.
Senza creare un doppio ciclo:
Visual Basic:
Sub CreaCHK()
Dim rng As Range
Dim cel As Range
Dim shp As OLEObject

Set rng = Range("O7:O16")
For Each cel In rng
    Set shp = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", _
        Link:=False, _
        DisplayAsIcon:=False, _
        Left:=cel.Offset(0, -2).Left, _
        Top:=cel.Offset(0, -2).Top, _
        Width:=45, Height:=18)
    
    If cel.Value = "si" Then
        shp.Object.Value = True
        shp.TopLeftCell.Offset(0, 1).Value = shp.Object.Caption
    End If
Next 'i
End Sub

Sub DeleteAllChk()
Dim shp As OLEObject

For Each shp In ActiveSheet.OLEObjects
    shp.Delete
Next shp

End Sub
 

Max Power

Nuovo utente
26 Giugno 2020
17
1
Excel 2016
0
Grazie mille per il vostro aiuto, appena ho due minuti liberi provo gli ultimi codici che mi avete inviato e vi faccio sapere, non metto "risolto" per il momento...ancora tante grazie!!
 

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!