Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione di dati
Ciao Carlo,
Preciso che i pc che utilizziamo al lavoro hanno installato EXCEL 2000; nella P.A. non siamo molto aggiornati.
Nel file “Ferie” ho due fogli di lavoro che ho chiamato “Inserimento” e “DBase”.
In “Inserimento” utilizzo solo 2 celle: “A2” (con valori TESTO) e “B2” (DATA, formato “gg/mm/aaaa”); entrambe utilizzano una combo di convalida.
Sto cercando inutilmente e da tempo di:
copiare i valori di “Inserimento.A2” e di “Inserimento.B2” (quindi testo e data, non la convalida o la formattazione) nel foglio “DBase” nelle colonne “A” e “B” in successione dalla riga 2 alla riga 1001 (la 1° riga di “DBase” contiene le intestazioni di campo),
inserire automaticamente nelle celle “DBase.C2:C1001” la data di sistema nel formato (“gg-mm-aaaa, hh:mm”) al momento della copia dei valori di “Inserimento.A2” e di “Inserimento.B2”,
post inserimento ordinare dal valore minore a quello maggiore le celle della tabella in base ai valori prima di “DBase.C2:C1001” (data automatica nel formato “gg-mm-aaaa, hh:mm”) e poi di “DBase.B2:B1001” (valori formato data copiati da “Inserimento.B2”),
bloccare e proteggere progressivamente, in seguito all’inserimento, solo le celle popolate delle colonne A, B e C di “DBase” (le altre contenenti un sacco di formule correlate fra loro sono normalmente bloccate e protette),
far comparire un msgbox (vbyesonly) con conseguente interruzione della sub se o “Inserimento.A2” o “Inserimento.B2” sono senza valori al momento dell’inserimento dati nel foglio “DBase” per evitare di caricare dati incompleti.
Il risultato finale del foglio DBase dovrebbe essere una tabella di questo tipo:
**** A B C **** 1 PERSONALE DATA FERIE DATA RICHIESTA FERIE **** 2 Ciccio Formaggio 20/03/2023 10-03-2023 20:30 celle bloccate e protette 3 Pippo 20/03/2023 10-03-2023 20:35 celle bloccate e protette 4 Pluto 21/03/2023 10-03-2023 20:40 celle bloccate e protette 5 celle sbloccate
Scopiazzando e cercando di personalizzare ciò che ho letto e capito sul web sono riuscito a far funzionare (molto, molto malamente, anzi uno schifo!) le singole operazioni; non sono in grado di far funzionare, le mie conoscenze di VBA sono prossime allo 0 Kelvin, il tutto in maniera fluida utilizzando un solo pulsante da posizionare chiaramente nel foglio “Inserimento”.
Prova qualcosa del genere:
'========>>
Option Explicit
'-------->>
Public Sub Tester()
Dim WB As Workbook
Dim SrcSH As Worksheet, destSH As Worksheet
Dim srcRng As Range, destRng As Range
Dim LRow As Long
Const sFoglio\_Sorgente As String = "Inserimento"
Const sFoglio\_Destinazione As String = "DBase"
Const sPassword As String = "Pippo" '<<=== Modifica
Set WB = ThisWorkbook
With WB
Set SrcSH = .Sheets(sFoglio\_Sorgente)
Set destSH = .Sheets(sFoglio\_Destinazione)
End With
Set srcRng = SrcSH.Range("A2:B2")
With destSH
LRow = LastRow(destSH, .Columns("A"))
Set destRng = .Range("A" & LRow + 1)
End With
With srcRng
If IsEmpty(.Cells(1).Value) Or IsEmpty(.Cells(2).Value) Then
Call MsgBox(Prompt:="Questa procedura richiede che siano compilate entrambe " \_
& "le celle A2 e B2 del foglio " & sFoglio\_Sorgente & "!" \_
& vbNewLine & "Riprova!", \_
Buttons:=vbCritical, \_
Title:="REPORT")
Exit Sub
End If
destSH.Unprotect Password:=sPassword
.Copy Destination:=destRng
destRng.Offset(0, 2).Value = Format(Now, "dd/mm/yyyy h:mm")
End With
With destSH
.Range("A2").CurrentRegion.Sort Key1:=.Range("C2"), \_
Order1:=xlAscending, \_
Header:=xlGuess, \_
OrderCustom:=1, \_
MatchCase:=False, Orientation:=xlTopToBottom
.Range("A2").CurrentRegion.Sort Key1:=.Range("B2"), \_
Order1:=xlAscending, \_
Header:=xlGuess, \_
OrderCustom:=1, \_
MatchCase:=False, Orientation:=xlTopToBottom
.Protect Password:=sPassword
End With
Call MsgBox(Prompt:="Dati copiati!", \_
Buttons:=vbInformation, \_
Title:="REPORT")
End Sub
'--------->>
Public Function LastRow(SH As Worksheet, _
Optional Rng As Range, \_
Optional minRow As Long = 1)
If Rng Is Nothing Then
Set Rng = SH.Cells
End If
On Error Resume Next
LastRow = Rng.Find(What:="\*", \_
After:=Rng.Cells(1), \_
Lookat:=xlPart, \_
LookIn:=xlFormulas, \_
SearchOrder:=xlByRows, \_
SearchDirection:=xlPrevious, \_
MatchCase:=False).Row
On Error GoTo 0
If LastRow < minRow Then
LastRow = minRow
End If
End Function
'<<========
===
Regards,
Norman