Domenica, 08 ottobre 2017
  0 Risposte
  3.1K visite
0
voti
Disfare
Ho un foglio di lavoro in una cartella di lavoro contenente oltre 400 righe, 8 colonne e 160 intervalli uniti e ho incasinato il suo aspetto. Ho cercato su Internet le celle unite di VBA Autofit. Nessuno degli URL è molto utile. La macro su questo sito è sulla buona strada ma: -
1) Dovrei identificare e digitare manualmente i 160 intervalli uniti.
Ho aggiunto una ricerca per intervalli di celle uniti.
2) Utilizza la riga uno per eseguire calcoli di celle unite (cella ZZ1). Uso un carattere molto più grande sulla cella A1 (Titolo) che provoca errori nel calcolo dell'altezza di adattamento automatico unita richiesta.
Uso una cella 1 colonna a destra e 1 riga sotto i dati. (Ctrl+Maiusc+Fine, non trova questa cella)
3) Ricalcola tutte le celle unite in modo da ridurre l'altezza di due righe contenenti sia celle unite che normali rendendo le celle normali illeggibili.
Modifico l'altezza della riga solo quando l'altezza unita richiesta supera l'altezza esistente.
4) Il metodo per copiare i dati negli intervalli uniti nella cella ZZ1 non è corretto, si basa solo sul testo nell'intervallo unito ma non tiene conto delle diverse dimensioni dei caratteri nelle varie celle unite.
Ho corretto il metodo di copia.
5) La macro è lenta: circa 15+ secondi sul mio foglio di lavoro.
La disattivazione dell'aggiornamento dello schermo e la riattivazione al termine della macro riduce questo a 2 secondi.

Sono riuscito a trovare un altro fastidioso difetto. Adatta automaticamente il foglio di lavoro (prima di correggere gli intervalli uniti) e ha distorto diverse righe. Alcune celle "normali", impostate su wrapping, avevano la loro altezza aumentata e apparivano come una riga (o due righe) di testo con una riga vuota sotto il testo. La ricerca su Internet ha indicato che è causato da Excel che altera il display per adattarsi ai caratteri della stampante. Trovata una “soluzione alternativa”, ho aggiunto alla macro:
Aumenta la larghezza delle colonne di una piccola percentuale.
Adatta automaticamente tutte le righe del foglio di lavoro.
Eseguire le correzioni all'altezza delle righe per adattarsi agli intervalli uniti.
Ripristina la larghezza della colonna alle dimensioni originali.
Il problema è stato risolto, le righe vuote ora non vengono più visualizzate!

Pensavo che ora fosse tutto corretto, ma poi ho scoperto un ulteriore problema. Se chiudo la cartella di lavoro e la riapro, le righe vuote tornano di nuovo. Ho esaminato File/Opzioni e ho cercato su Internet un metodo per impedire alla cartella di lavoro di aggiornare la visualizzazione dello schermo alla chiusura/apertura della cartella di lavoro senza successo. Ho dovuto aggiungere Private Sub Workbook_Open() nella scheda "ThisWorkbook" con una chiamata per eseguire la Macro all'apertura della cartella di lavoro.


Opzione esplicita

Sub Look4Merged()
Oscura WSN come stringa 'Nome foglio di lavoro
Dim sht As Worksheet 'Usato da "Set"
Dim LastRow As Long 'Ultima riga in tutte le colonne con dati
Dim LastRowCC As Long 'Ultima riga nella colonna corrente con i dati
Dim LastColumn As Integer 'Numero dell'ultima colonna in tutte le righe con dati
Dim CurrCol As Integer 'Numero della colonna corrente
Dim Letter As String 'Converti il ​​numero CurrCol in stringa
Dim ILetter As String 'Colonna dell'indice una a destra dell'ultima colonna
Dim ICell As String 'Cella una colonna a destra e una riga in basso nell'area dati frpm. Utilizzato per calcolare l'altezza unita richiesta
Dim CRow come "Numero di riga corrente".
Dim TwN As Long 'Gestione degli errori
Dim TwD As String 'Gestione degli errori
Dim Mgd As Boolean 'Vero/Falso verifica se la cella è unita
Dim MgdCellAddr As String 'Contiene l'intervallo unito come stringa
Dim MgdCellStart As String 'Lettera iniziale dell'intervallo di celle unito Utilizzato ad esempio ispezionando la colonna B per le celle unite, ignora tutte le celle unite che iniziano nella colonna A e si estendono alla colonna B (già valutata)
Dim MgdCellStart1 As String 'usato per calcolare MgdCellStart
Dim MgdCellStart2 As String 'usato per calcolare MgdCellStart
Dim OldHeight As Single 'Altezza esistente di tutte le righe nell'intervallo unito
Dim P1 As Integer 'Conteggio loop/puntatore
Dim OldWidth As Single 'Larghezza esistente delle celle nell'intervallo unito
Dim NewHeight As Single 'Altezza richiesta di tutte le righe nell'intervallo unito. Aggiorna le singole righe in modo proporzionale se supera OldHeight
Dim C1 As Integer 'Loop Conteggio colonne
Dim R1 As Long 'Loop Conteggio righe/puntatore
Dim Tweak As Single 'Piccolo aumento della larghezza della colonna per superare il problema della riga vuota
Dim oRange come intervallo
In errore Vai a TomsHandler

Application.ScreenUpdating = False 'MOLTO più veloce 15 secondi se lo schermo è stato aggiornato solo 2 secondi spento.
Tweak = 1.04 'Aumenta la larghezza della colonna del 4% prima di adattare automaticamente tutte le righe.
WSN = ActiveSheet.Nome
Columns("A:A").EntireRow.Hidden = False

'Trova l'ultima riga e colonna attive nell'intero foglio di lavoro con i dati
Con ActiveSheet.UsedRange
LastColumn = Range(Range("A1"), Cells(Rows.Count, Columns.Count)).Find(What:="*", LookIn:=xlValues, _
OrdineRicerca:=xlByColumns, DirezioneRicerca:=xlPrevious).Colonna
LastRow = Range(Range("A1"), Cells(Rows.Count, Columns.Count)). Find(What:="*", LookIn:=xlValues, _
Ordine di ricerca:=xlByRows, SearchDirection:=xlPrevious).Riga
Fine Con
CurrCol = LastColumn + 1 'ie a destra dell'ultima colonna
Se CurrCol < 27 Allora
ILetter = Chr$(CurrCol + 64) 'Colonna indice
Altro
ILettera = Chr$(Int((CorrCol - 1) / 26) + 64)
ILetter = ILetter & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64) 'Colonna indice se doppia cifra.
End If

'Icell si trova a destra e sotto i dati. La cella viene utilizzata per calcolare l'altezza richiesta per adattarsi all'intervallo unito
ICell = ILettera e UltimaRiga + 1

'Aumenta la larghezza della colonna di una piccola quantità per correggere il bug di wrapping delle righe vuote.
Intervallo("A" & UltimaRiga + 1).Seleziona
Per C1 = 1 a LastColumn
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth * Modifica "aumenta la larghezza della colonna di una piccola quantità per correggere il bug
ActiveCell.Offset(0, 1).Range("A1").Seleziona ' sposta una cella a destra
Avanti

'Adatta automaticamente le righe (ignora le righe unite) con la larghezza della colonna del 4% in più per evitare bug di righe vuote su alcune righe di wrapping
Cells.Select
Selezione.Righe.Adattamento automatico
Imposta sht = Fogli di lavoro (WSN) 'necessario per trovare l'ultima voce nella colonna con i dati

Per CurrCol = 1 a LastColumn
'converti il ​​numero della colonna corrente in alfa (singola o doppia lettera)
Se CurrCol < 27 Allora
Lettera = Chr$(CorrCol + 64)
Altro
Lettera = Chr$(Int((CorrCol - 1) / 26) + 64)
Lettera = Lettera & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64)
End If
LastRowCC = sht.Cells(sht.Rows.Count, Letter).End(xlUp).Row 'trova l'ultima riga nella colonna corrente

Per CRow = 1 per LastRowCC
Intervallo(Lettera e CRow).Seleziona
Mgd = ActiveCell.MergeCells 'La cella è nell'intervallo unito
Se Mgd = Vero Allora 'Se Vero, allora lo è
'Qual è l'indirizzo dell'intervallo unito? estrarre una cifra singola/doppia per l'inizio della gamma
MgdCellAddr = ActiveCell.MergeArea.Indirizzo
MgdCellStart1 = Medio(MgdCellAddr, 2, 1)
MgdCellStart2 = Medio(MgdCellAddr, 3, 1)
Se MgdCellStart2 = "$" Allora
MgdCellInizio = MgdCellInizio1
Altro
MgdCellStart = MgdCellStart1 e MgdCellStart2
End If
Se MgdCellStart = Lettera, allora la prima colonna della cella è unita uguale alla colonna corrente
Con fogli (WSN)
Vecchia Larghezza = 0
Set oRange = Range(MgdCellAddr) 'imposta oRange su Intervallo unito rilevato
Per C1 = 1 A oRange.Columns.Count
OldWidth = OldWidth + .Cells(1, oRange.Column + C1 - 1).ColumnWidth 'Accumula le larghezze delle colonne per l'intervallo di celle (con il 4% aggiunto)
Avanti
Vecchiaaltezza = 0
Per R1 = 1 A oRange.Rows.Count
OldHeight = OldHeight + .Cells(CRow, oRange.Row + R1 - 1).RowHeight 'Accumula l'altezza della riga esistente per l'intervallo di celle
Avanti
oRange.MergeCells = Falso
.Range(Letter & CRow).Copy Destination:=Range(ICell) 'Copia il testo E la dimensione del carattere, non solo i valori
.Range(ICell).WrapText = True 'avvolge ICell
.Columns(ILetter).ColumnWidth = OldWidth 'modifica la larghezza della colonna contenente ICell per simulare l'intervallo esistente
.Rows(LastRow + 1).EntireRow.AutoFit 'Adatta automaticamente la riga ICell, pronta per misurare l'altezza unita richiesta
oRange.MergeCells = True 'Reimposta l'intervallo unito su unito
oRange.WrapText = True 'e avvolgimento
'Misura l'altezza richiesta per la gamma unita
NuovaAltezza = .Righe(UltimaRiga + 1).AltezzaRiga
'La Nuova altezza richiesta supera la Vecchia altezza esistente
Se NewHeight > OldHeight allora
Per R1 = CRow To CRow + oRange.Rows.Count - 1
'Aumenta ogni riga in proporzione all'intervallo
Intervallo (Lettera e R1). AltezzaRiga = Intervallo (Lettera e R1).AltezzaRiga * Altezza Nuova / Altezza Vecchia
Avanti
Altro
'spazio sufficiente nella cella unita
End If
CRow = CRow + oRange.Rows.Count - 1 'altro su un intervallo multiriga, scenderà alla 2a riga dell'intervallo e ripeterà il calcolo quando si arriva a "Avanti"
.Range(ICell).Clear 'Zap ICell pronto per il calcolo successivo
.Range(ICell).ColumnWidth = 8.1 'Riordina la larghezza della colonna
Fine Con
End If
End If
Avanti
Avanti

'Ripristina la larghezza della colonna rimuovendo il 4% aggiunto (necessario per correggere l'errore di avvolgimento)
Intervallo("A" & UltimaRiga + 1).Seleziona
Per C1 = 1 a LastColumn
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth / Tweak 'riduci la larghezza della colonna all'originale
ActiveCell.Offset(0, 1).Range("A1").Seleziona ' una cella a destra
Avanti
Intervallo ("A1").Seleziona

Application.ScreenUpdating = True 'riattiva l'aggiornamento
Exit Sub

TomsHandler:
Application.ScreenUpdating = True 'riattiva l'aggiornamento
TwN = Numero Err
TwD = Err.Descrizione
MsgBox "Necessità di gestire l'errore" & TwN & " " & TwD
Fermare
CV
End Sub

È possibile impedire a Excel di modificare l'aspetto di visualizzazione dello schermo alla chiusura/riapertura della cartella di lavoro?
Non ci sono ancora risposte per questo post.