
Option Explicit
Sub mask_column()
Dim v As Variant, itm As Variant, i As Long, j As Long, col As Long
Dim a_column(1 To 20) As String, all_columns(1 To 5) As String
'l'idea è tradurre ogni colonna di dati in una sequenza di uno e zero:
'000100011 indica per esempio tre celle vuote seguite da una piena, poi tre vuote e quindi due piene
'poi si confrontano tra loro queste stringhe: a stringa uguale corrisponde struttura uguale
For col = 4 To 8
'memorizza la sequenza di valori delle celle colonna per colonna da D5:D24 a H5:H24
v = Application.Transpose(Range(Cells(5, col), Cells(24, col)))
i = 0
For Each itm In v 'per ogni elemento di ogni colonna da riga 5 a riga 24
i = i + 1
a_column(i) = "0" 'memorizza zero se la cella è vuota,
If itm <> "" Then a_column(i) = "1" '1 se l cella è piena
Next
all_columns(col - 3) = Join(a_column, "") 'crea l'array delle cinque colonne da D a H con la sequenza delle celle valorizzate
Erase a_column 'si prepara a raccogliere il dato della prossima colonna
Next
'procede al confronto tra le colonne per eliminare le colonne con struttura simile
For i = 1 To 4
For j = i + 1 To 5
If all_columns(j) = all_columns(i) Then
Debug.Print "La colonna " & Chr(j + 67) & " è simile alla colonna " & Chr(i + 67) 'piccolo edit :)
End If
Next
Next
End Sub |
Option Explicit
Sub mask_column2()
Dim v As Variant, itm As Variant, i As Long, j As Long, col As Long
Dim a_column(1 To 20) As String, all_columns(1 To 5) As String
Dim my_coll As Collection
'l'idea è tradurre ogni colonna di dati in una sequenza di uno e zero:
'000100011 indica per esempio tre celle vuote seguite da una piena, poi tre vuote e quindi due piene
'poi si confrontano tra loro queste stringhe: a stringa uguale corrisponde struttura uguale
For col = 4 To 8
'memorizza la sequenza di valori delle celle colonna per colonna da D5:D24 a H5:H24
v = Application.Transpose(Range(Cells(5, col), Cells(24, col)))
i = 0
For Each itm In v 'per ogni elemento di ogni colonna da riga 5 a riga 24
i = i + 1
a_column(i) = "0" 'memorizza zero se la cella è vuota,
If itm <> "" Then a_column(i) = "1" '1 se la cella è piena
Next
all_columns(col - 3) = Join(a_column, "") 'crea l'array delle cinque colonne da D a H con la sequenza delle celle valorizzate
Erase a_column 'si prepara a raccogliere il dato della prossima colonna
Next
'procede al confronto tra le colonne per eliminare le colonne con struttura simile
'sfrutta la tecnica della Collection per eliminare i duplicati
'chiave della Collection è l'indice della prima colonna univoca
'che possiamo trattare come Offset per costruire le tabelle successive
Set my_coll = New Collection
On Error Resume Next
For i = 1 To 5
my_coll.Add CStr(i), all_columns(i)
Next
On Error GoTo 0
'adesso SOLO PER TEST ricopia le colonne univoche in altra zona del foglio
Range("A26..H50").Clear
Range("A5..C24").Copy Range("A30")
For i = 1 To my_coll.Count
Range("C1..C24").Offset(, my_coll(i)).Copy Range("C26").Offset(, i)
Next
End Sub
|
Option Explicit
Sub mask_column3()
Dim v As Variant, itm As Variant, i As Long, j As Long, col As Long, num As Long
Dim a_column(1 To 20) As String, all_columns(1 To 5) As String
Dim my_coll As Collection
'l'idea è tradurre ogni colonna di dati in una sequenza di uno e zero:
'000100011 indica per esempio tre celle vuote seguite da una piena, poi tre vuote e quindi due piene
'poi si confrontano tra loro queste stringhe: a stringa uguale corrisponde struttura uguale
num = [COUNTA(1:1)] 'conta le celle valorizzate in riga 1 per predire quante sono le colonne da esaminare
For col = 4 To 4 + num - 1
'memorizza la sequenza di valori delle celle colonna per colonna da D5:D24 a H5:H24
v = Application.Transpose(Range(Cells(5, col), Cells(24, col)))
i = 0
For Each itm In v 'per ogni elemento di ogni colonna da riga 5 a riga 24
i = i + 1
a_column(i) = "0" 'memorizza zero se la cella è vuota,
If itm <> "" Then a_column(i) = "1" '1 se la cella è piena
Next
all_columns(col - 3) = Join(a_column, "") 'crea l'array delle cinque colonne da D a H con la sequenza delle celle valorizzate
Erase a_column 'si prepara a raccogliere il dato della prossima colonna
Next
'procede al confronto tra le colonne per eliminare le colonne con struttura simile
'sfrutta la tecnica della Collection per eliminare i duplicati
'chiave della Collection è l'indice della prima colonna univoca
'che possiamo trattare come Offset per co-struire le tabelle successive
Set my_coll = New Collection
On Error Resume Next
For i = 1 To 5
my_coll.Add CStr(i), all_columns(i)
Next
On Error GoTo 0
'adesso ricopia le colonne univoche in altra zona del foglio
Range("26..50").Clear
Range(Cells(1, 4 + num + 1), Cells(24, 4 + num + 1 + my_coll.Count * 4)).Clear
Range("A5..C24").Copy Range("A30")
For i = 1 To my_coll.Count
Range("C1..C24").Offset(, my_coll(i)).Copy Range("C26").Offset(, i)
Next
'quindi effettua l'estrazione tabella per tabella e la riporta nello stesso foglio
'a fianco della tabella originale
For i = 1 To my_coll.Count
Range("29:29").AutoFilter
Range("D29:D49").AutoFilter Field:=3 + i, Criteria1:="<>"
Range("A26:C49").SpecialCells(xlCellTypeVisible).Copy Cells(2, 4 + num + 2 + (i - 1) * 5)
Range("D26:D49").Offset(, i - 1).SpecialCells(xlCellTypeVisible).Copy Cells(2, 4 + 3 + num + 2 + (i - 1) * 5)
Range("29:29").AutoFilter
Next
End Sub
|
Option Explicit
Sub mask_column4()
Dim v As Variant, itm As Variant, i As Long, j As Long, col As Long, num As Long
Dim a_column(1 To 20) As String, all_columns(1 To 5) As String
Dim my_coll As Collection
Dim sh As Worksheet, activesh As Worksheet
'l'idea è tradurre ogni colonna di dati in una sequenza di uno e zero:
'000100011 indica per esempio tre celle vuote seguite da una piena, poi tre vuote e quindi due piene
'poi si confrontano tra loro queste stringhe: a stringa uguale corrisponde struttura uguale
num = [COUNTA(1:1)] 'conta le celle valorizzate in riga 1 per predire quante sono le colonne da esaminare
For col = 4 To 4 + num - 1
'memorizza la sequenza di valori delle celle colonna per colonna da D5:D24 a H5:H24
v = Application.Transpose(Range(Cells(5, col), Cells(24, col)))
i = 0
For Each itm In v 'per ogni elemento di ogni colonna da riga 5 a riga 24
i = i + 1
a_column(i) = "0" 'memorizza zero se la cella è vuota,
If itm <> "" Then a_column(i) = "1" '1 se la cella è piena
Next
all_columns(col - 3) = Join(a_column, "") 'crea l'array delle cinque colonne da D a H con la sequenza delle celle valorizzate
Erase a_column 'si prepara a raccogliere il dato della prossima colonna
Next
'procede al confronto tra le colonne per eliminare le colonne con struttura simile
'sfrutta la tecnica della Collection per eliminare i duplicati
'chiave della Collection è l'indice della prima colonna univoca
'che possiamo trattare come Offset per co-struire le tabelle successive
Set my_coll = New Collection
On Error Resume Next
For i = 1 To 5
my_coll.Add CStr(i), all_columns(i)
Next
On Error GoTo 0
'adesso ricopia le colonne univoche in altra zona del foglio
Range("26..50").Clear
Range(Cells(1, 4 + num + 1), Cells(24, 4 + num + 1 + my_coll.Count * 4)).Clear
Range("A5..C24").Copy Range("A30")
For i = 1 To my_coll.Count
Range("C1..C24").Offset(, my_coll(i)).Copy Range("C26").Offset(, i)
Next
'quindi effettua l'estrazione tabella per tabella e la riporta nello stesso foglio
'a fianco della tabella originale
Set activesh = ActiveSheet
For i = 1 To my_coll.Count
With activesh
.Range("29:29").AutoFilter
.Range("D29:D49").AutoFilter Field:=3 + i, Criteria1:="<>"
Set sh = Sheets.Add
.Range("A26:C49").SpecialCells(xlCellTypeVisible).Copy sh.Cells(1, 1)
.Range("D26:D49").Offset(, i - 1).SpecialCells(xlCellTypeVisible).Copy sh.Cells(1, 4)
.Range("29:29").AutoFilter
End With
Next
End Sub
|
