La macro è molto lunga in quanto adatta il formato dei dati ad una successiva elaborazione che viene fatta da altre macro... Ho comunque visto che dopo l'esecuzione di questa macro nel foglio di riepilogo la formule cambiano.
Sub mise_en_forme_ordo()
Dim col, n, i, j As Integer 'col rappresenta il numero di colonna, n dà il numero di linee di rapporto, i e j sono dei contatori
Dim copie, mat As String 'copie rappresenta il valore da copiare (data, calandra tipo ..), mat è il tipo di prodotto
Dim cel As Range
Worksheets("ordo").Select
n = Cells(Rows.Count, 1).End(xlUp).Row
Cells.Replace What:="PET RATELIER ", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
'Cancella CNOPK del rappoto d'ordo che non apporta valore aggiunto
Cells.Replace What:=" CNOPK", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
'Cancella MFD del rapporto d'ordo che non apporta valore aggiunto
Cells.Replace What:="MFD ", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
'Annulla la fusione delle celle per poterle ordinare
n = Rows(1).Find("Commentaire Planneur").Column
If n = 5 Then
Else
Columns(n).Select
Application.CutCopyMode = False
Selection.Copy
Application.CutCopyMode = False
Selection.Cut
Columns(5).Select
Selection.Insert Shift:=xlToRight
End If
'Trova l'ultima linea del rapporto (prende n-1 per non contare il totale). E' importante fare questo contaggio prima di spostare le colonne, altrimenti tutto il calcolo risulta sbagliato
n = Cells(Rows.Count, 1).End(xlUp).Row
col1 = Rows(1).Find("Date Fabrication").Column
col3 = Rows(1).Find("Journée Michelin").Column
'Questo ciclo permette di copiare e riempire le celle vuote con MAG-PK.
For i = 2 To n
If Cells(i, 5) = "" Then
Cells(i, 5) = "MAG-PK"
End If
Cells(i, col1) = DateValue(Cells(i, col1))
Cells(i, col3) = DateValue(Cells(i, col3))
Next i
' Next col
'Questo passaggio permette di cancellare la produzione sulle calandre EB
n = Rows(1).Find("Machine").Column
If n = 1 Then
Else
Columns(n).Select
Application.CutCopyMode = False
Selection.Copy
Application.CutCopyMode = False
Selection.Cut
Columns(1).Select
Selection.Insert Shift:=xlToRight
End If
n = Cells(Rows.Count, 1).End(xlUp).Row
ActiveWorkbook.Worksheets("ordo").Sort.SortFields.Clear
'Mette come 1° criterio di ordinamento la calandra
ActiveWorkbook.Worksheets("ordo").Sort.SortFields.Add Key:=Range("A2:A" & n) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("ordo").Sort
.SetRange Range("A1:BA" & n)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Min = Columns(1).Find("EB").Row
Rows(Min & ":" & n).Select
Selection.Delete Shift:=xlUp
'Questo passaggio permette di ordinare le colonne secondo un ordine fisso, qualsiasi posizione di partenza le colonne hanno. Il codice è dettagliato solo per la prima colonna.
'Posiziona la data Michelin sulla prima colonna
n = Rows(1).Find("Journée Michelin").Column 'Questo n rappresenta la colonna dove prima si trovava il dato "Michelin date"
If n = 1 Then 'Questo test vede se la colonna è gia ben posizionata; in caso affermativo, non fa nulla...
Else '...altrimenti la mette al buon posto
Columns(n).Select
Application.CutCopyMode = False
Selection.Copy
Application.CutCopyMode = False
Selection.Cut
Columns(1).Select
Selection.Insert Shift:=xlToRight
End If
'La colonna Machine è gia correttamente posizionata
'Posiziona la colonna heure fabrication sulla 3° colonna
n = Rows(1).Find("Heure Fabrication").Column
If n = 3 Then
Else
Columns(n).Select
Application.CutCopyMode = False
Selection.Copy
Application.CutCopyMode = False
Selection.Cut
Columns(3).Select
Selection.Insert Shift:=xlToRight
End If
'Posiziona la colonna resource sulla 4° colonna
n = Rows(1).Find("Ressource").Column
If n = 4 Then
Else
Columns(n).Select
Application.CutCopyMode = False
Selection.Copy
Application.CutCopyMode = False
Selection.Cut
Columns(4).Select
Selection.Insert Shift:=xlToRight
End If
'Posiziona la colonna Product Code sulla 5° colonna
n = Rows(1).Find("Produit").Column
If n = 5 Then
Else
Columns(n).Select
Application.CutCopyMode = False
Selection.Copy
Application.CutCopyMode = False
Selection.Cut
Columns(5).Select
Selection.Insert Shift:=xlToRight
End If
'Posiziona la colonna Quantité (Pièce) sulla 6° colonna
n = Rows(1).Find("Quantité (Pièce)").Column
If n = 6 Then
Else
Columns(n).Select
Application.CutCopyMode = False
Selection.Copy
Application.CutCopyMode = False
Selection.Cut
Columns(6).Select
Selection.Insert Shift:=xlToRight
End If
'Posiziona la colonna Quantité (M2) sulla 7° colonna
n = Rows(1).Find("Quantité (M2)").Column
If n = 7 Then
Else
Columns(n).Select
Application.CutCopyMode = False
Selection.Copy
Application.CutCopyMode = False
Selection.Cut
Columns(7).Select
Selection.Insert Shift:=xlToRight
End If
'Posiziona la colonna Commentaires sulla 8° colonna
n = Rows(1).Find("Commentaire Planneur").Column
If n = 8 Then
Else
Columns(n).Select
Application.CutCopyMode = False
Selection.Copy
Application.CutCopyMode = False
Selection.Cut
Columns(8).Select
Selection.Insert Shift:=xlToRight
End If
'Posiziona la colonna Renfort Code sulla 9° colonna
n = Rows(1).Find("Code Renfort").Column
If n = 9 Then
Else
Columns(n).Select
Application.CutCopyMode = False
Selection.Copy
Application.CutCopyMode = False
Selection.Cut
Columns(9).Select
Selection.Insert Shift:=xlToRight
End If
'Posiziona la colonna longueur renfort sulla 10° colonna
n = Rows(1).Find("Longueur renfort (m)").Column
If n = 10 Then
Else
Columns(n).Select
Application.CutCopyMode = False
Selection.Copy
Application.CutCopyMode = False
Selection.Cut
Columns(10).Select
Selection.Insert Shift:=xlToRight
End If
'Posiziona la colonna Nb de fils sulla 11° colonna
n = Rows(1).Find("Nb de fils").Column
If n = 11 Then
Else
Columns(n).Select
Application.CutCopyMode = False
Selection.Copy
Application.CutCopyMode = False
Selection.Cut
Columns(11).Select
Selection.Insert Shift:=xlToRight
End If
'Posiziona la colonna pas sulla 12° colonna
n = Rows(1).Find("Pas").Column
If n = 12 Then
Else
Columns(n).Select
Application.CutCopyMode = False
Selection.Copy
Application.CutCopyMode = False
Selection.Cut
Columns(12).Select
Selection.Insert Shift:=xlToRight
End If
'Posiziona la colonna Tps réglage sulla 13° colonna
n = Rows(1).Find("Tps réglage").Column
If n = 13 Then
Else
Columns(n).Select
Application.CutCopyMode = False
Selection.Copy
Application.CutCopyMode = False
Selection.Cut
Columns(13).Select
Selection.Insert Shift:=xlToRight
End If
'Questo passagio permette di ordinare bene i dati: verranno divisi in 1) giorno, 2) macchina, 3) campagna
col1 = Rows(1).Find("Date Fabrication").Column
col3 = Rows(1).Find("Journée Michelin").Column
n = Cells(Rows.Count, 1).End(xlUp).Row
ActiveWorkbook.Worksheets("ordo").Sort.SortFields.Clear 'cancella tutte le regole di ordinamento
'Mette come primo criterio di ordinamento la calandra
ActiveWorkbook.Worksheets("ordo").Sort.SortFields.Add Key:=Range("B2:B" & n) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
'Mette come secondo criterio di ordinamento la data Michelin
ActiveWorkbook.Worksheets("ordo").Sort.SortFields.Add Key:=Range(Cells(2, col3), Cells(n, col3)) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortTextAsDate 'Mette come primo criterio di ordinamento la data
'Mette come secondo criterio di ordinamento la data di fabbricazione
ActiveWorkbook.Worksheets("ordo").Sort.SortFields.Add Key:=Range(Cells(2, col1), Cells(n, col1)) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortTextAsDate 'Mette come primo criterio di ordinamento la data
'Mette come terzo criterio di ordinamento l'ora della campagna
ActiveWorkbook.Worksheets("ordo").Sort.SortFields.Add Key:=Range("C2:C" & n) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers
'Applica l'ordinamento
With ActiveWorkbook.Worksheets("ordo").Sort
.SetRange Range("A1:AF" & n)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'
'
'Inserimento di una colonna Compteur che serve a fare la differenza tra le campagne
col = Rows(1).Find("Tps réglage").Column
Columns(col + 1).Select
Selection.Insert Shift:=xlToLeft, CopyOrigin:=xlFormatFromLeftOrAbove
Cells(1, col + 1) = "Compteur"
'questa parte permette di differenziare le campagne secondo il tempo di cambio dimensione (se =0 allora è la stessa campagna)
compteur = 0 'variabile che permette di identificare le campagne
machinebis = "" 'variabile che permette di conservare in memoria la macchina prima per fare la fusione dei cells (ergonomia) e fare un paragone con la linea prima
For i = 2 To n 'n è il massimo di linee
machine = Cells(i, 2)
If machine = "WKC CAL CAL804" Or machine = "WKC CAL CAL802" Then
If Cells(i, col) = "0h 0m 0s" Then
If machine = machinebis Then 'se è la stessa calandra e che il cambio dimensione =0 allora è lo stesso numero
Else
compteur = compteur + 1 'se la calandra è diversa allora il compteur cambia (nuova campagna giustamente !)
machinebis = machine ' cambia il riferimento per la calandra
End If
Else
compteur = compteur + 1 'se il cambio di dimensione è diverso di 0 allora è un cambio di campagna
machinebis = machine
End If
Else
If Cells(i, col) = "0h 0m 0s" Or Cells(i, col) = "1h 0m 0s" Or Cells(i, col) = "0h 30m 0s" Then
If machine = machinebis Then 'se è la stessa calandra e che il cambio dimensione =0 allora è lo stesso numero
Else
compteur = compteur + 1 'se la calandra è diversa allora il compteur cambia (nuova campagna giustamente !)
machinebis = machine ' cambia il riferimento per la calandra
End If
Else
compteur = compteur + 1 'se il cambio di dimensione è diverso di 0 allora è un cambio di campagna
' If i = 3 Then
machinebis = machine
' End If
End If
End If
Cells(i, col + 1) = compteur 'indicare il numero della campagna
Next i
Worksheets("Azioni").Select
End Sub
In partica mi servirebbe bloccare il foglio di lavoro in cui ci sono le formule affichè la macro non le cambi e riattivarlo quando la macro ha terminato l'esecuzione.