Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
Ciao Danilo,
vi scrivo in quanto vorrei eliminare le formule nel riquadro ("I1:P19"),("A20:H20"),("Q1:R19"),("Q20:R20") e utilizzare le stesso calcolo ma con il VBA. Nel riquadro I1:P19 ho delle formule che impongono delle condizioni. Esempio: quando in A1 e B1 sono presenti due 1 allora I1 = 1, se C1 o D1 è uguale a 1 allora K1=0 e cosi per tutto il resto. In Q1 effettuo la somma di I,K,M,O e in R1 effettuo la somma di J,L,N,P. In Q20:R20 effettuo la somma delle relative colonne come pure in A20:H20.
Vi allego il file qualora sia stato poco esaustivo nella spiegazione.
Prova qualcosa del genere:
- Fai clic dx sulla linguetta del foglio di interesse
- Seleziona l'opzione Visualizza Codice dal **** menu contestuale risultante
- Incolla il seguente codice:
'=========>>
Option Explicit
'--------->>
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rng As Range, RngDati As Range, rCell As Range
Dim CellaSommaPari As Range, CellaSommaNonPari As Range
Dim destCell As Range
Dim rowSumCell As Range, colSumCell As Range
Dim i As Long
Dim iCols As Long, iRows As Long
Dim dSum As Double, dRowSum As Long, dColSum As Long
Dim bEven As Boolean
Const sIntervalloDati As String = "B2:I20"
Set RngDati = Me.Range(sIntervalloDati)
Set Rng = Intersect(RngDati, Target)
If Not Rng Is Nothing Then
With RngDati
iCols = .Columns.Count
iRows = .Rows.Count
Set CellaSommaNonPari = .Cells(.Row + iRows - 1, _
.Column + iCols * 2 - 1)
Set CellaSommaPari = CellaSommaNonPari.Offset(0, 1)
End With
On Error GoTo XIT
With Application
.EnableEvents = False
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
For Each rCell In Rng.Cells
With rCell
bEven = .Column Mod 2 <> RngDati.Column Mod 2
Set destCell = .Offset(0, iCols)
Set rowSumCell = RngDati.Rows(.Row - RngDati.Row + 1).Cells(1). _
Offset(0, iCols * 2 - bEven)
Set colSumCell = Me.Cells(RngDati.Row + iRows, .Column)
Select Case True
Case .Column Mod 2 = RngDati.Column Mod 2
dSum = Application.Sum(.Resize(1, 2))
If dSum = 2 Then
destCell.Value = 1
Else
destCell.Value = 0
End If
Case Else
If dSum = 1 Then
destCell.Value = 1
Else
destCell.Value = 0
End If
End Select
dColSum = Application.Sum(RngDati.Columns( _
.Column - RngDati.Column + 1))
For i = 1 To iCols Step 2
dRowSum = dRowSum + RngDati.Cells _
(.Row - RngDati.Row + 1, 1). _
Offset(0, iCols + i - 1 - bEven).Value
Next i
rowSumCell.Value = dRowSum
colSumCell.Value = dColSum
End With
dRowSum = 0
dColSum = 0
Next rCell
With RngDati
CellaSommaPari.Value = _
Application.Sum(.Columns( _
CellaSommaPari.Column - .Column + 1))
CellaSommaNonPari.Value = _
Application.Sum(RngDati.Columns( _
CellaSommaNonPari.Column - .Column + 1))
End With
End If
XIT:
With Application
.EnableEvents = True
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
End With
End Sub
'<<=========
- Alt+Q per chiudere l'editor di VBA e tornare a Excel.
- Salva il file con l'estensione xlsm.
Questo codice di evento agggiorna la tabella automaticamente in risposta ad una modifica di valori nell'intervallo definito dalle prime 8 colonne e le prime 19 righe della tabella, Volendo, si può modificare le dimensioni della tabella nodificando lòindirizzo assegnato alla costante sIntervalloDati.
Per scattenare il codice per convertire, una tantum, l'intera tabella, seleziona la tabella ed eseguire una semplice operazione di copia/incolla.
Ti chiederei gentilmente di caricare il file problematico, dopo averlo depurato dei dati sensibili, su un servizio di condivisione di file, per esempio Microsoft OneDrive o DropBox, e postare un link al file in una risposta qui.
Potresti scaricare il mio file di prova Danilo23052018.xlsm
===
Regards,
Norman