Userforn textbox/label

Anonimo
2019-03-20T06:59:36+00:00

Buogiorno ragazzi ho una richiesta da farvi:

Su Foglio1 ho un range di celle (A1:AE24) che tramite una formattazione condizionata in base al valore inserito che va da 1 a 12 cambiano colore di sfondo. Io devo ricreare la stessa cosa con una Userform, che andrò a richiamare con un CommandButton, formata da tanti textbox o label (a seconda di quello che sarà più opportuno) che andranno a cambiare il colore sfondo in base alle celle collegate. Come posso fare tutto questo in VBA?H Help Help! Help!

Premessa: la Userform la so "costruire", mi serve la parte VBA

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2019-03-31T18:38:18+00:00

Prova con:

   Set oRangeP = ThisWorkbook.Worksheets("FERIE").Range(sRangeP)

   NumRigheP = oRangeP.Rows.Count

   With Me

   For i = 1 To NumRigheP Step 2

      cont=cont+1

      .Controls("Labelp" & cont).Caption = oRangeP(i, 1)

   Next i

   End With

Ne prosegui della tua routine c'è un "cont = cont + 1"

Ma mi pare che non sia poi realmente utilizzato (forse un residuo dal mio codice che "costruireva anche le label".

Se invece fosse utilizzato allora dopo il ciclo dei controlli del personale va impostato nuovamente a zero indicando cont = 0

La risposta è stata utile?

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2019-03-31T18:26:27+00:00

Ma B3:B23 sono più di 12 righe (21 per l'esattezza).

Mentre le label del personale sono solo 12.

Ho letto male e l'intervallo è B3:B26, quindi 24 righe.

Si tratta di righe unite due a due?

La risposta è stata utile?

0 commenti Nessun commento

36 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2019-03-21T06:41:50+00:00

    Auguri nel voler creare 744 label :)

    Vedi questo esempio (file esempio: File esempio 2) dove, diversamente dal precedente, ho nominato le label in modo continuativo (1,2,3,...,744) con un contantore che si incrementa di 1 ad ogni ciclo "combinato" i + j.

    Quindi in pratica alla label1 corrisponde la prima cella dell'intervallo (cella 1,1), poi man mano ogni label corrisponde alla cella successiva seguendo l'ordine righe x colonne.

    Se questo è lo schema che utilizzerai anche tu alla seguente procedura dovresti poter eliminare le parti che evidenzio in con la "barratura":

    Private Sub UserForm_Initialize()

    '< --- costanti e variabli non necessarie se i controlli label sono già creati manualmente --- >

    Const Itop As Double = 5

    Const Ileft As Double = 5

    Const deltaTop As Double = 5

    Const deltaLeft As Double = 5

    Dim lHeight As Double, lWidth As Double

    Dim cLabel As MSForms.Label

    '</ --- costanti e variabli non necessarie se i controlli label sono già creati manualmente --- >

       Const sRange As String = "A1:AE24"

       Dim oRange As Range

       Dim NumRighe As Long, NumCol As Long

       Dim i As Long, j As Long

       Dim cont As Long

       Dim iLng As Long

       Set oRange = ThisWorkbook.Worksheets("Foglio1").Range(sRange)

       With oRange

          NumRighe = .Rows.Count

          NumCol = .Columns.Count

       End With

       With Me

    '< --- codice che non è necessario se la UserForm è già dimensionata manualmente --- >

    .Width = Application.UsableWidth - 5

    .Height = .Width / 2

    lWidth = (.Width - (Ileft * 3) - (deltaLeft * (NumCol - 1))) / NumCol

    lHeight = (.Height - (Itop * 6.5) - (deltaTop * (NumRighe - 1))) / NumRighe

    '</ --- codice che non è necessario se la UserForm è già dimensionata manualmente --- >

          For i = 1 To NumRighe

             For j = 1 To NumCol

                cont = cont + 1

    '< --- codice che non è necessario se i controlli Label sono già creati manualmente --- >

    Set cLabel = .Controls.Add("Forms.Label.1")

    With cLabel

    .Name = "Label" & cont

    .Height = lHeight

    .Width = lWidth

    .TextAlign = fmTextAlignCenter

    If i = 1 Then

    .Top = Itop

    Else

    .Top = deltaTop + Me.Controls("Label" & cont - NumCol).Top + _

    Me.Controls("Label" & cont - NumCol).Height

    End If

    If j = 1 Then

    .Left = Ileft

    Else

    .Left = deltaLeft + Me.Controls("Label" & cont - 1).Left + _

    Me.Controls("Label" & cont - 1).Width

    End If

    End With

    '< --- codice che non è necessario se i controlli Label sono già creati manualmente --- >

                With .Controls("Label" & cont)

                   iLng = oRange(i, j)

    .Caption = iLng '<=== questo può essere eliminato se non interessa avere i valori nelle label

                   Select Case iLng

                      Case 1

                         .BackColor = RGB(255, 0, 0)

                      Case 2

                         .BackColor = RGB(0, 255, 0)

                      Case 3

                         .BackColor = RGB(0, 0, 255)

                      Case 4

                         .BackColor = RGB(255, 0, 255)

                      Case 5

                         .BackColor = RGB(255, 255, 0)

                      Case 6

                         .BackColor = RGB(0, 0, 255)

                      Case 7

                         .BackColor = RGB(0, 0, 0)

                      Case 8

                         .BackColor = RGB(125, 0, 0)

                      Case 9

                         .BackColor = RGB(0, 125, 0)

                      Case 10

                         .BackColor = RGB(0, 0, 125)

                      Case 11

                         .BackColor = RGB(75, 75, 75)

                      Case 12

                         .BackColor = RGB(150, 150, 150)

                   End Select

                End With

             Next j

          Next i

       End With

    End Sub

    ovviamente i colori da assegnare dovrai modificarli in base alle tue esigenze (io ho messo un po' di colori a caso)

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2019-03-20T20:35:31+00:00

    Bene, ottimo lavoro :)

    Considerando che le label le imposto e le posiziono io manualmente nella userform e non mi interessa di importare i valori delle celle collegate ma solo i colori interni gran parte del codice posso eliminarlo ma quale parte devo eliminare/aggiungere nel modulo per fare in modo che prendano solo il colore interno???

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2019-03-20T19:17:26+00:00

    Ciao se vuoi qui puoi trovare un esempio dove viene popolata una userform di tante label quane sono le celle dell'intervallo.

    La userform viene dimensionato in base alla "UsableWidth" dell'applicazione Excel (la finestra utilizzabile da Excel in pratica).

    Poi le varie label vengono dimensionate in base allo spazio disponibile e "ordinate" in modo da riempire l'intera userform.

    Viene assegnata la "caption" in base al valore presente nella "corrispondente cella" dell'intervallo e ogni riga viene colorata in maniera differente in base che si tratti di una riga dispari o pari.

    Ovviamente tu dovresti colorare ogni label in base alle tue diverse condizioni.

    Questo vuole essere ovviamente solo un esempio possibile senza la pretesa che possa rappresentare la soluzione alla tua probelmatica.

    File esepio: File esempio

    Nel modulo della userform è presente questo codice:

    Option Explicit

    Private Sub UserForm_Initialize()

       Const sRange As String = "A1:AE24"

       Dim oRange As Range

       Dim NumRighe As Long, NumCol As Long

       Const Itop As Double = 5

       Const Ileft As Double = 5

       Const deltaTop As Double = 5

       Const deltaLeft As Double = 5

       Dim lHeight As Double, lWidth As Double

       Dim i As Long, j As Long

       Dim cLabel As MSForms.Label

       Dim cont As Long

       Dim sFormat As String

       Set oRange = ThisWorkbook.Worksheets("Foglio1").Range(sRange)

       With oRange

          NumRighe = .Rows.Count

          NumCol = .Columns.Count

          sFormat = String(Len(CStr(NumCol * NumRighe)), "0")

       End With

       With Me

          .Width = Application.UsableWidth - 5

          .Height = .Width / 2

          lWidth = (.Width - (Ileft * 3) - (deltaLeft * (NumCol - 1))) / NumCol

          lHeight = (.Height - (Itop * 6.5) - (deltaTop * (NumRighe - 1))) / NumRighe

          For i = 1 To NumRighe

             For j = 1 To NumCol

                cont = cont + 1

                Set cLabel = .Controls.Add("Forms.Label.1")

                With cLabel

                   .Name = "Label" & Format(i, sFormat) & Format(j, sFormat)

                   .Height = lHeight

                   .Width = lWidth

                   .TextAlign = fmTextAlignCenter

                      If i = 1 Then

                         .Top = Itop

                      Else

                         .Top = deltaTop + Me.Controls("Label" & Format((i - 1), "000") & Format(j, sFormat)).Top + _

                                Me.Controls("Label" & Format((i - 1), sFormat) & Format(j, sFormat)).Height

                      End If

                      If j = 1 Then

                         .Left = Ileft

                      Else

                         .Left = deltaLeft + Me.Controls("Label" & Format(i, sFormat) & Format(j - 1, sFormat)).Left + _

                                 Me.Controls("Label" & Format(i, sFormat) & Format(j - 1, sFormat)).Width

                      End If

                      .Caption = oRange(i, j)

                      Select Case i Mod 2

                         Case 0

                            .BackColor = vbWhite

                         Case Is <> 0

                            .BackColor = vbYellow

                      End Select

                End With

             Next j

          Next i

       End With

    End Sub

    La risposta è stata utile?

    0 commenti Nessun commento