datoB
 
Troppi formati di cella diversi HomePage Inside Contatti  

 Login

 Password

Ricorda
Link interessanti
Axy.news: notizie e attualità
- Tecnologia
- Software
E' un fastidioso messaggio di errore che appare in Excel con fogli di calcolo particolarmente ricchi di schemi e tabelle (nella versione inglese appare "Too many different cell formats"); quando appare è consigliabile chiudere Excel salvando il file con altro nome: per esperienza non sempre si riapre continuandoci a lavorare anche per poco.
Succede ad esempio quando si cercano di unire fogli provenienti da fonti e con stili differenti ed è dato da un limite a circa 4000 del numero di formati di cella utilizzabili da Excel. La spiegazione dettagliata dell'errore si può trovare sulla knowledge base di Microsoft.
Questo limite potrebbe sembrare alto in realtà il formato di due celle è diverso se lo è una caratteristica del testo come dimensione, stile, carattere, colore oppure una dello sfondo come il colore o il riempimento, un bordo, il formato numerico, l'allineamento, la protezione, ecc. Se il file contiene molti fogli e tabelle graficamente complicate si può arrivare a questo limite.
La prima soluzione che si può adottare, specie quando non è possibile modificare la formattazione, è quella di uniformare le celle non utilizzate e bianche, la macro riportata sotto modifica tutte le celle vuote, protette e bianche ad uno stesso tipo di carattere, in questo caso Arial 12:

Sub ToglieFormatiCelleVuote()
  For Each Fl In Worksheets
    Fl.Activate
    Set Ur = Fl.UsedRange
    
    For Each Ce In Ur
      If (Ce.Locked) And (IsEmpty(Ce) And (Ce.Font.ColorIndex = -4105) And (Ce.Interior.ColorIndex = -4142) And _
        ((Ce.Font.Name <> "Arial") Or (Ce.Font.Size <> 12) Or (Ce.Font.FontStyle <> "Normale"))) Then
        Ce.Select
        Ce.Font.Name = "Arial"
        Ce.Font.Size = 12
        Ce.Font.FontStyle = "Normale"
      End If
    Next Ce
  Next Fl
End Sub


Oppure, altra soluzione è quella di verificare quali formattazioni sono usate nel foglio e modificare manualmente quelle simili; la macro riportata sotto crea una tabella che ha sulle colonne il tipo di bordo delle celle e sulle righe il colore delle cella, del testo, il carattere, la dimensione e l'indicazione se la cella e protetta o meno. Il numero indicato rappresenta le volte che quella combinazione è stata usata ma quelle riportate non sono tutte le possibili variazioni dei formati, solo colore, carattere e bordi.

Sub AnalizzaFormati()
  Set Wbo = ActiveWorkbook
  
  Workbooks.Add
  Set Wbr = ActiveWorkbook
  Set Fr = Wbr.Sheets(1)
  ActiveWindow.DisplayGridlines = False
  ActiveWindow.Zoom = 50
  
  Columns("A:B").ColumnWidth = 3
  Columns("E").ColumnWidth = 20
  Columns("F").ColumnWidth = 20
  Columns("H:I").ColumnWidth = 3
  Rows("5:9").RowHeight = 3
  
  Fr.Cells(3, 3).Value = "Sfondo"
  Fr.Cells(3, 4).Value = "Colore testo"
  Fr.Cells(3, 5).Value = "Carattere"
  Fr.Cells(3, 6).Value = "Cella: colore, pattern, riempimento"
  Fr.Cells(3, 7).Value = "Protetta"
  
  MaxC = 10
  MaxR = 10
  Wbo.Activate
  
  R = 10
  Set Ce = Fr.Cells(R, 10)
  Fr.Cells(R, 4).Value = Ce.Font.ColorIndex
  Fr.Cells(R, 4).Interior.ColorIndex = Ce.Font.ColorIndex
  Fr.Cells(R, 5).Value = Ce.Font.Name & " " & Ce.Font.Size & ", " & Ce.Font.FontStyle
  Fr.Cells(R, 6).Value = Ce.Interior.ColorIndex & "," & Ce.Interior.Pattern & "," & Ce.Interior.PatternColorIndex
  If (Ce.Locked) Then Fr.Cells(R, 7).Value = "P" Else Fr.Cells(R, 7).Value = "np"
           
  C = 10
  Fr.Columns(C + 1).ColumnWidth = 7
  Fr.Columns(C + 1).ColumnWidth = 1
    
  For Each Fl In Wbo.Worksheets
      Fl.Activate
      Set Ur = Fl.UsedRange
      Ur.Select
    
      For Each Ce In Ur
        R = 10
       
        While (R <= MaxR) And Not ( _
              (Fr.Cells(R, 3).Interior.ColorIndex = Ce.Interior.ColorIndex) And _
              (Fr.Cells(R, 3).Interior.Pattern = Ce.Interior.Pattern) And _
              (Fr.Cells(R, 3).Interior.PatternColorIndex = Ce.Interior.PatternColorIndex) And _
              (Fr.Cells(R, 3).Font.Name = Ce.Font.Name) And _
              (Fr.Cells(R, 3).Font.Color = Ce.Font.Color) And _
              (Fr.Cells(R, 3).Font.Size = Ce.Font.Size) And _
              (Fr.Cells(R, 3).Font.FontStyle = Ce.Font.FontStyle) And _
              (Fr.Cells(R, 3).Locked = Ce.Locked) _
              )
          R = R + 1
        Wend
      
        If Not (R <= MaxR) Then
          Fr.Cells(R, 3).Font.Color = Ce.Font.Color
          Fr.Cells(R, 3).Font.Size = Ce.Font.Size
          Fr.Cells(R, 3).Font.FontStyle = Ce.Font.FontStyle
          Fr.Cells(R, 3).Interior.ColorIndex = Ce.Interior.ColorIndex
          Fr.Cells(R, 3).Interior.Pattern = Ce.Interior.Pattern
          Fr.Cells(R, 3).Interior.PatternColorIndex = Ce.Interior.PatternColorIndex
          Fr.Cells(R, 3).Locked = Ce.Locked
         
          Fr.Cells(R, 4).Value = Ce.Font.ColorIndex
          Fr.Cells(R, 4).Interior.ColorIndex = Ce.Font.ColorIndex
          Fr.Cells(R, 5).Value = Ce.Font.Name & " " & Ce.Font.Size & ", " & Ce.Font.FontStyle
          Fr.Cells(R, 6).Value = Ce.Interior.ColorIndex & "," & Ce.Interior.Pattern & "," & Ce.Interior.PatternColorIndex
          If (Ce.Locked) Then Fr.Cells(R, 7).Value = "P" Else Fr.Cells(R, 7).Value = "np"
          
          MaxR = R
        End If
      
        C = 10
        While (C <= MaxC) And Not ( _
              (Fr.Cells(3, C).Borders(xlEdgeBottom).LineStyle = Ce.Borders(xlEdgeBottom).LineStyle) And _
              (Fr.Cells(3, C).Borders(xlEdgeTop).LineStyle = Ce.Borders(xlEdgeTop).LineStyle) And _
              (Fr.Cells(3, C).Borders(xlEdgeRight).LineStyle = Ce.Borders(xlEdgeRight).LineStyle) And _
              (Fr.Cells(3, C).Borders(xlEdgeLeft).LineStyle = Ce.Borders(xlEdgeLeft).LineStyle) _
              )
          C = C + 2
        Wend
      
        If Not (C <= MaxC) Then
          Fr.Cells(3, C).Borders(xlEdgeBottom).LineStyle = Ce.Borders(xlEdgeBottom).LineStyle
          Fr.Cells(3, C).Borders(xlEdgeTop).LineStyle = Ce.Borders(xlEdgeTop).LineStyle
          Fr.Cells(3, C).Borders(xlEdgeRight).LineStyle = Ce.Borders(xlEdgeRight).LineStyle
          Fr.Cells(3, C).Borders(xlEdgeLeft).LineStyle = Ce.Borders(xlEdgeLeft).LineStyle
            
          Fr.Columns(C + 1).ColumnWidth = 7
          Fr.Columns(C + 1).ColumnWidth = 1
          MaxC = C
        End If
      
        Fr.Cells(R, C).Value = Fr.Cells(R, C).Value + 1
      Next Ce
  Next Fl
  
  
  Fr.Range(Fr.Cells(3, 10), Fr.Cells(3, MaxC)).Interior.ColorIndex = 36
  Fr.Range(Fr.Cells(10, 10), Fr.Cells(MaxR, MaxC)).Interior.ColorIndex = 36
  
End Sub
Tipi di articoli: 
 Presentazione Novit Istruz.uso Istruz. vers.3 Istruz. vers.5 Esempio Fogli di Calcolo
 Domanda Segnalaz. errore Risposta

datoB - via Adolfo Vital 169 - 31015 Conegliano TV - info@datob.it - Tel. 348 2285811 - P.Iva 04008200265