Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di leomac
    Registrato dal
    Mar 2009
    Messaggi
    188

    [VBA/Excell '07] Dicitura data

    Ragazzi salve a tutti,
    ho un baco da risolvere in questo codice:

    in userform:
    codice:
    Private Sub CommandButton1_Click() 'INSERISCI MESE
    Dim M As Integer
    Dim A As Integer
    Dim J As Integer
    Dim Giorni As Integer
    Dim chegiorno As String
    Dim firstrow As Integer
    Dim firstcol As Integer
    Dim R As Integer
    Dim C As Integer
    
    If ComboBox1.Text = "" Then
            MsgBox "Nessun MESE selezionato." & Chr(13) & "Seleziona il MESE dall'elenco a discesa."
    ElseIf ComboBox2.Text = "" Then
            MsgBox "Nessun ANNO selezionato." & Chr(13) & "Seleziona l'ANNO dall'elenco a discesa."
    Else:   Dim DataIn As Object
            A = ComboBox2.Value  ' prendi l'anno
            M = PrendiMese(ComboBox1.Value) ' prendi il mese
            Set zona = Range(Range("A1"), Range("A1").End(xlDown)).Rows
            DataBox = CDate(CStr(M) & "/" & CStr(A))
            firstrow = 1
            firstcol = 1
            R = firstrow
            C = firstcol
            For Each DataIn In zona
                If DataIn = DataBox Then
                        MsgBox "Già cè"
                        Exit Sub
                Else: MsgBox "Non cè"
                        Giorni = UltimoDelMese(M, LeapYear(A))
                        For J = 1 To Giorni
                            chegiorno = CDate(CStr(J) & "/" & CStr(M) & "/" & CStr(A))
                            Cells(R, C) = chegiorno
                            Cells(R, C + 1) = "gigi"
                            Cells(R, C + 2) = "pino"
                            Cells(R, C + 3) = "ninos"
                            R = R + 1
                        Next
                        MsgBox "Completato!"
                        Exit Sub
                End If
            Next
    End Sub
    in un modulo:
    codice:
    Function UltimoDelMese(Mese As Integer, Bisest As Boolean) As Integer
     Select Case Mese
      Case 1, 3, 5, 7, 8, 10, 12
        UltimoDelMese = 31
      Case 4, 6, 9, 11
        UltimoDelMese = 30
      Case 2
        If Bisest Then
          UltimoDelMese = 29
        Else
          UltimoDelMese = 28
        End If
     End Select
    End Function
    
    Function LeapYear(YYYY As Integer) As Integer
      LeapYear = YYYY Mod 4 = 0 And (YYYY Mod 100 <> 0 Or YYYY Mod 400 = 0)
    End Function
    
    Function PrendiMese(strItem As String) As Integer
      Select Case LCase(strItem)
        Case "gennaio"
            PrendiMese = 1
        Case "febbraio"
            PrendiMese = 2
        Case "marzo"
            PrendiMese = 3
        Case "aprile"
            PrendiMese = 4
        Case "maggio"
            PrendiMese = 5
        Case "giugno"
            PrendiMese = 6
        Case "luglio"
            PrendiMese = 7
        Case "agosto"
            PrendiMese = 8
        Case "settembre"
            PrendiMese = 9
        Case "ottobre"
            PrendiMese = 10
        Case "novembre"
            PrendiMese = 11
        Case "dicembre"
            PrendiMese = 12
      Case Else
        PrendiMese = 0
      End Select
    End Function
    Problema: durante il ciclo dell'userform(segnato in rosso), inizia col segnarmi mese/giorno/anno sul foglio excell, poi dal giorno 13 mi segna giorno/mese/anno. Non trovo dove sbaglio. Vorrei la solita dicitura giorno/mese/anno.
    Grazie a tutti

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Premesso che ho guardato il codice molto di sfuggita, per sapere l'ultimo giorno del mese è sufficiente fare

    =DATA(ANNO(A1);MESE(A1)+1;0)

    che ovviamente tiene conto anche degli anni bisestili. Esiste anche la funzione fine.mese(), abilitabile da componenti aggiuntivi => strumenti di analisi.

    edit. La formula precedente restituisce la data dell'ultimo giorno del mese.

    Se ti basta sapere di quanti giorni è composto il mese

    =GIORNO(DATA(ANNO(A1);MESE(A1)+1;0))

    ovviamente la formula può essere integrata anche in vba.

  3. #3
    Utente di HTML.it L'avatar di leomac
    Registrato dal
    Mar 2009
    Messaggi
    188
    Nico scusami ma come la implementi all'interno del mio codice una funzione excell tenendno conto poi del ciclo??
    Ho provato a fare alcune modifiche anche al ciclo stesso... ma niente.


  4. #4
    Seguendo il consiglio di nicola75ss dovresti tradurre la funzione excel in istruzioni vba.

    Così dovrebbe funzionare:
    codice:
        giorni = Day(DateSerial(A, M + 1, 0))
        For J = 1 To giorni
            cheGiorno = CDate(CStr(J) & "/" & CStr(M) & "/" & CStr(A))
            ...
        Next
    A tutti i COBOL-isti/CICS-isti/DB2-isti come me: l'adunanza è iniziata; ne resterà soltanto uno.
    È meglio bruciare subito, che spegnersi lentamente.

    Per fare un fumetto di successo ci voglio le tre "A": Azione - Avventura - Atette
    Ratman

  5. #5
    Utente di HTML.it L'avatar di leomac
    Registrato dal
    Mar 2009
    Messaggi
    188
    si grazie pippolik il tutto funge, eliminando anche le due funzioni UltimodelMese e LapYear, ma l'errore rimane. Difatti facendo partire la sub inserisce la data in formato mese/giorno/anno fino al giorno 13 poi ritorna nel formato che voglio giorno/mese/anno :master:.
    Riposto il codice modificato:
    codice:
    Private Sub CommandButton1_Click() 'INSERISCI MESE
    Dim M As Integer
    Dim A As Integer
    Dim J As Integer
    Dim Giorni As Integer
    Dim chegiorno As String
    Dim firstrow As Integer
    Dim firstcol As Integer
    Dim R As Integer
    Dim C As Integer
    
    If ComboBox1.Text = "" Then
            MsgBox "Nessun MESE selezionato." & Chr(13) & "Seleziona il MESE dall'elenco a discesa."
    ElseIf ComboBox2.Text = "" Then
            MsgBox "Nessun ANNO selezionato." & Chr(13) & "Seleziona l'ANNO dall'elenco a discesa."
    Else:   Dim DataIn As Object
            A = ComboBox2.Value  ' prendi l'anno
            M = PrendiMese(ComboBox1.Value) ' prendi il mese
            Set zona = Range(Range("A1"), Range("A1").End(xlDown)).Rows
            DataBox = CDate(CStr(M) & "/" & CStr(A))
            firstrow = 1
            firstcol = 1
            R = firstrow
            C = firstcol
            For Each DataIn In zona
                If DataIn = DataBox Then
                        MsgBox "Già cè"
                        Exit Sub
                Else: MsgBox "Non cè"
                        Giorni = Day(DateSerial(A, M + 1, 0))
                        For J = 1 To Giorni
                            chegiorno = CDate(CStr(J) & "/" & CStr(M) & "/" & CStr(A))
                            Cells(R, C) = chegiorno
                            Cells(R, C + 1) = "gigi"
                            Cells(R, C + 2) = "pino"
                            Cells(R, C + 3) = "ninos"
                            R = R + 1
                        Next
                        MsgBox "Completato!"
                        Exit Sub
                End If
            Next
    End Sub
    
    
    
    Function PrendiMese(strItem As String) As Integer
      Select Case LCase(strItem)
        Case "gennaio"
            PrendiMese = 1
        Case "febbraio"
            PrendiMese = 2
        Case "marzo"
            PrendiMese = 3
        Case "aprile"
            PrendiMese = 4
        Case "maggio"
            PrendiMese = 5
        Case "giugno"
            PrendiMese = 6
        Case "luglio"
            PrendiMese = 7
        Case "agosto"
            PrendiMese = 8
        Case "settembre"
            PrendiMese = 9
        Case "ottobre"
            PrendiMese = 10
        Case "novembre"
            PrendiMese = 11
        Case "dicembre"
            PrendiMese = 12
      Case Else
        PrendiMese = 0
      End Select
    End Function

  6. #6
    Prova a modificare così l'istruzione in cui scrivi la data sul foglio excel (a me funziona!!!!).
    codice:
    Cells(R, C) = CDate(chegiorno)
    A tutti i COBOL-isti/CICS-isti/DB2-isti come me: l'adunanza è iniziata; ne resterà soltanto uno.
    È meglio bruciare subito, che spegnersi lentamente.

    Per fare un fumetto di successo ci voglio le tre "A": Azione - Avventura - Atette
    Ratman

  7. #7
    Utente di HTML.it L'avatar di leomac
    Registrato dal
    Mar 2009
    Messaggi
    188
    si thx pippolik ora funge anche a me ma il mistero rimane anche perchè il Cdate l'avevo già messo nella definizione di chegiorno
    codice:
    chegiorno = CDate(CStr(J) & "/" & CStr(M) & "/" & CStr(A))
    quindi perchè dare un "errore" di questo tipo?
    Comunque grazie a voi ho risolto in questo modo:
    codice:
    chegiorno = CStr(J) & "/" & CStr(M) & "/" & CStr(A)
    Cells(R, C) = CDate(chegiorno)

  8. #8
    Sono contento che funziona
    Per quanto riguarda il motivo sfugge anche a me (credo che abbia qualcosa a che fare con il formato di default della colonna o qualcosa di simile) ma si tratta di prodotti Microsoft, quindi rinuncio a dare spiegazioni logiche.
    A tutti i COBOL-isti/CICS-isti/DB2-isti come me: l'adunanza è iniziata; ne resterà soltanto uno.
    È meglio bruciare subito, che spegnersi lentamente.

    Per fare un fumetto di successo ci voglio le tre "A": Azione - Avventura - Atette
    Ratman

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.