Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
Ok.
Qui trovi un file di esempio dove ho modificato il codice presente nella UserForm: File esempio #2
Le modifiche hanno riguardato la dichiarazione di una costate PW (attualmente valorizzata ="") dove inserre l'eventuale password utilizzata per proteggere tutti i fogli dedicati alle fatture. Nel caso di utilizzo di password ovviamente questa deve essere comune a tutti questi fogli.
Ho inoltre dichiarato una costante SuffissoNomeFatture (attualmente valorizzata ="Foglio") per gestire l'inserimento delle date nei soli fogli che hanno questo suffisso.
Se tu un domani volessi cambiare il suffisso ai fogli (es. Fattura o Fatt) ti basterà cambiare il testo del suffisso in corrispondenza di questa costante.
Al codice presente all'interno della UserForm ho aggiunto una "funzione" VBA (NumeroFatturePresenti) per determinare il numero di fogli che fanno da fatture. Numero che serve per poter verificare che un eventuale numero inserito negli intervalli (continuativi o alternati) non sia maggiore del numero di fogli dedicati alle fatture.
Per quanto riguarda la questione delle celle unite, che tanto sembra preoccuparti, in questo caso non dà luogo a problemi.
Nel caso un domani modificassi lo schema e cambiassi posizione al campo dedicato alla data fattura ti basterebbe modificare l'indirizzo della cella nella costante sCellaData.
Mi sono accorto che in due avvisi relativi ad intervalli di numeri fatture non valide il numero visualizzato non era corretto e ho provveduto a correggere.
Riporto di seguito tutto il codice presente nella userform (in grassetto le parti nuove/modificate):
'---
Option Explicit
Const PW As String = "" 'inserire qui la password di protezione. se non c'è password inserire ""
Const SuffissoNomeFatture As String = "Foglio" 'suffisso del nome dei fogli che fanno da fattura
Const ChrNC As String = "-" 'carattere per impostare i numeri fatture consecutivi a cui assegnare la date
Const ChrNA As String = "," 'carattere per impostare i numeri fatture alternati a cui assengare la data
Const sCellaData As String = "J9" 'indirizzo delle celle in cui verrà inserita la data eventualmente da personalizzare
Dim arrayNumeri As Variant
Dim NumI As Long
Dim NumF As Long
Dim VerificaNumeriOk As Boolean
Private Sub cmb_InserisciData_Click()
Dim i As Long, t As Long
With TB_Data
If .Text = "" Then
MsgBox "Inserire una data valida in formato gg/mm/aaaa", vbExclamation, "Data Non Valida"
.SetFocus
Exit Sub
End If
End With
Call VerificaNumeri
If VerificaNumeriOk Then
Application.ScreenUpdating = False
With ThisWorkbook
For i = LBound(arrayNumeri) To UBound(arrayNumeri)
If InStr(1, arrayNumeri(i), ChrNC) = 0 Then
With .Worksheets(SuffissoNomeFatture & CLng(arrayNumeri(i)))
.Unprotect PW
.Range(sCellaData).Value = CDate(TB_Data.Text)
.Protect PW
End With
Else
For t = NumI To NumF
With .Worksheets(SuffissoNomeFatture & t)
.Unprotect PW
.Range(sCellaData).Value = CDate(TB_Data.Text)
.Protect PW
End With
Next t
End If
Next i
End With
Application.ScreenUpdating = True
Unload Me
Else
TB_NumeroFatture.SetFocus
End If
End Sub
Private Sub cmb_Esc_Click()
Unload Me
End Sub
Private Sub TB_NumeroFatture_Change()
Dim dig As String
With TB_NumeroFatture
dig = Right(.Text, 1)
If dig = "." Then
.Text = Left(.Text, Len(.Text) - 1) & ChrNA
dig = ChrNA
End If
If Not IsNumeric(dig) And dig <> ChrNC And dig <> ChrNA And dig <> "" Then
.Text = Left(.Text, Len(.Text) - 1)
End If
End With
End Sub
Private Sub TB_Data_Exit(ByVal Cancel As MSForms.ReturnBoolean)
With TB_Data
If Not IsDate(.Text) And .Text <> "" Then
MsgBox "Inserire una data valida in formato gg/mm/aaaa", vbExclamation, "Data Non Valida"
.Text = ""
Cancel = True
Else
.Text = Format(.Text, "dd/mm/yyyy")
End If
End With
End Sub
Private Sub VerificaNumeri()
Dim i As Long
Dim cont As Long
Dim NumeroMax As Long
VerificaNumeriOk = True
With TB_NumeroFatture
Do While Right(.Text, 1) = ChrNC Or Right(.Text, 1) = ChrNA
.Text = Left(.Text, Len(.Text) - 1)
Loop
If .Text = "" Then
MsgBox "Inserire almeno un numero di fattura a cui assegnare la data", vbExclamation, "Numero Fattura"
VerificaNumeriOk = False
Exit Sub
End If
For i = 1 To Len(.Text)
If Mid(.Text, i, 1) = ChrNC Then cont = cont + 1
If cont > 1 Then
MsgBox "Intervallo numeri fatture non valido." & vbCrLf & "Sono presenti più intervalli consecutivi!", _
vbExclamation, "Intervallo Numeri Fatture Non Valido"
VerificaNumeriOk = False
Exit For
End If
Next i
arrayNumeri = Split(.Text, ChrNA)
NumeroMax = NumeroFatturePresenti
For i = LBound(arrayNumeri) To UBound(arrayNumeri)
If InStr(1, arrayNumeri(i), ChrNC) = 0 Then
If arrayNumeri(i) = 0 Then
MsgBox "Intervallo numeri fatture non valido." & vbCrLf & "Il numero 0 non è ammesso!", _
vbExclamation, "Intervallo Numeri Fatture Non Valido"
VerificaNumeriOk = False
Exit For
End If
If arrayNumeri(i) > NumeroMax Then
MsgBox "Intervallo numeri fatture non valido." & vbCrLf & "Il numero " & arrayNumeri(i) & " non è ammesso!", _
vbExclamation, "Intervallo Numeri Fatture Non Valido"
VerificaNumeriOk = False
Exit For
End If
Else
NumI = Left(arrayNumeri(i), InStr(1, arrayNumeri(i), ChrNC) - 1)
NumF = Right(arrayNumeri(i), Len(arrayNumeri(i)) - InStr(1, arrayNumeri(i), ChrNC))
If NumI = 0 Then
MsgBox "Intervallo numeri fatture non valido." & vbCrLf & "Il numero 0 non è ammesso!", _
vbExclamation, "Intervallo Numeri Fatture Non Valido"
VerificaNumeriOk = False
Exit For
End If
If NumF = 0 Then
MsgBox "Intervallo numeri fatture non valido." & vbCrLf & "Il numero 0 non è ammesso!", _
vbExclamation, "Intervallo Numeri Fatture Non Valido"
VerificaNumeriOk = False
Exit For
End If
If NumI > NumeroMax Then
MsgBox "Intervallo numeri fatture non valido." & vbCrLf & "Il numero " & NumI & " non è ammesso!", _
vbExclamation, "Intervallo Numeri Fatture Non Valido"
VerificaNumeriOk = False
Exit For
End If
If NumF > NumeroMax Then
MsgBox "Intervallo numeri fatture non valido." & vbCrLf & "Il numero " & NumF & " non è ammesso!", _
vbExclamation, "Intervallo Numeri Fatture Non Valido"
VerificaNumeriOk = False
Exit For
End If
If NumF < NumI Then
MsgBox "Intervallo continuativo numeri fatture non valido." & vbCrLf & _
"Il numero iniziale (" & NumI & ") non può essere successivo al numero finale (" & NumF & ")!", _
vbExclamation, "Intervallo Numeri Fatture Non Valido"
VerificaNumeriOk = False
Exit For
End If
End If
Next i
End With
End Sub
Function NumeroFatturePresenti()
Dim ContF As Long
Dim wsF As Worksheet
For Each wsF In ThisWorkbook.Worksheets
If Left(wsF.Name, Len(SuffissoNomeFatture)) = SuffissoNomeFatture Then
ContF = ContF + 1
End If
Next wsF
NumeroFatturePresenti = ContF
End Function
'---