Condividi:        

Calcolare altezza riga

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Calcolare altezza riga

Postdi Ricky0185 » 09/05/20 14:52

Buongiorno a tutti.
Scarico dati da web, molte voci, che regolarmente vengono inseriti nel foglio excel una per riga. Queste voci sono lunghe e arrivano spesso ad occupare celle delle colonne BA o fino alla CR. Ora per poterle vedere a schermo ho fatto una macrina che dalla colonna A alla S col mergecells e wraptext me le fa vedere per intero. Il problema è l'altezza riga, questa riduzione fa si che in una riga di celle unite dalla colonna A alla S si formano fino a 3 o più righe di testo. Come posso ottenere che le altezze delle righe siano tali da contenere per intero le voci, quando queste possono essere di 1 o 2 o 4 righe? L'autofit non mi ha risolto. Ho provato anche ad impostare un'altezza generale di 50 ed applicare poi l'autofit, ma sempre l'altezza resta quella di 12,75.
Ricky0185
Utente Senior
 
Post: 303
Iscritto il: 10/12/19 20:38

Sponsor
 

Re: Calcolare altezza riga

Postdi Anthony47 » 10/05/20 17:54

Microsoft ha delle chiare istruzioni per superare queste situazioni: https://support.microsoft.com/en-us/hel ... contain-me

Tradotto: fallo a mano

Con un po' di pazienza (e qualche approssimazione) si puo' fare qualcosa con macro.

Ad esempio, mentre imposti "Unisci Celle" puoi usare la sequente macro che, lavorando sulle celle appena unite e selezionate, dovrebbe impostare l'altezza altrimenti ottenuta con Autofit:
Codice: Seleziona tutto
Sub MCAntoFit()
Dim SAdr As String, myC As Range, MaxRH As Single
Dim cComp As Single, mcW As Single, CC11W As Single
'
MaxRH = 300                     '<<< La max altezza riga consentita
SAdr = Selection.Address
cComp = 0.64        'Compensazione per margini omessi
If SAdr <> Selection.Cells(1, 1).Address And Selection.Rows.Count = 1 Then
    CC11W = Selection.Cells(1, 1).ColumnWidth
    Selection.UnMerge
    'Width complessiva:
    mcW = -(cComp) * 1
    For I = 1 To Range(SAdr).Columns.Count
        mcW = mcW + Range(SAdr).Cells(1, I).ColumnWidth + cComp
    Next I
    'Autofit su singola colonna:
    With Range(SAdr).Cells(1, 1)
        .EntireColumn.ColumnWidth = mcW
        .WrapText = True
        .EntireRow.AutoFit
        If .Height > MaxRH Then .RowHeight = MaxRH
    End With
    'Ripristino
    Range(SAdr).Merge
    Range(SAdr).Cells(1, 1).EntireColumn.ColumnWidth = CC11W
End If
End Sub
Il codice va inserito in un Modulo Standard del vba.
Ripeto l'uso: si seleziona una (sola) area di celle unite, si esegue la macro
Nella macro e' impostata una altezza max pari a 300 punti; in situazioni estreme quindi il contenuto potrebbe non essere tutto visibile. Volendo questo Max puo' essere modificato fino a 400.

Immagino pero' che dopo l'impostazione iniziale, visto che parli di dati importati dal web, i dati cambieranno ma l'altezza righe non cambiera' automaticamente.
Puoi ottenere il riallineamento delle altezze utilizzando questa ulteriore macro:
Codice: Seleziona tutto
Sub RangeFit()
Dim RHArr() As Single, myC As Range
Dim cRow As Long
'
Application.ScreenUpdating = False
ReDim RHArr(1 To Intersect(Selection, ActiveSheet.UsedRange).Row + Application.Intersect(Selection, ActiveSheet.UsedRange).Rows.Count)
For Each myC In Application.Intersect(Selection, ActiveSheet.UsedRange)
    myC.Select
    If myC.Row <> cRow Then myC.EntireRow.AutoFit: cRow = myC.Row
    Call MCAntoFit
    If myC.Height > RHArr(myC.Row) Then RHArr(myC.Row) = myC.Height
DoEvents
Next myC
For I = 1 To UBound(RHArr)
    If RHArr(I) > 0 Then Cells(I, 1).EntireRow.RowHeight = RHArr(I)
Next I
Application.ScreenUpdating = True
MsgBox ("Completato...")
End Sub

Il codice va inserito in un Modulo Standard del vba.
Poi si seleziona un intervallo del foglio che si vuole sistemare (possono essere anche intere colonne, tipo A:L) e si avvia la macro. Un messaggio informera' del completamento delle operazioni.

Tra le assunzioni fatte, che le celle unite siano su una unica riga (cioe' che siano state unite Colonne, non Righe).

Fai sapere...

Edit: Modificato il codice della Sub RangeFit per inserire la gestione ScreenUpdating False /True
Avatar utente
Anthony47
Moderatore
 
Post: 19440
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Impostare altezza riga in automatico

Postdi Ricky0185 » 10/05/20 20:16

Ti ringrazio della risposta ed anche per aver reinserito la mia richiesta ex novo.
La anzi le tue macro ovviamente fanno quanto richiesto. Ma mi sembra di capire che va attivata per ogni riga la cui prima cella contenente la voce viene unita con altre 15, poi dopo l'unione lanciando la Sub MCAntoFit mostra tutte le righe, qualunque esse siano. Cioè riga per riga. Noooooooooooo.
Se però così fosse bisognerebbe (bisognerò) trovare il modo, per la colonna dove vengono scaricate le voci, far sì che scorrendo le celle delle voci ci sia un controllo sulla lunghezza della voce che attiva la macro solo se la lunghezza della voce supera le 15 colonne (15x8,43). Dimmi che ho capito male. Le righe per il momento sono 402, ma destinate ad aumentarissimo.
Dimenticavo dirti che la mia macrina scorre tutte le celle della colonna contenenti le voci e qualunque sia la lunghezza della voce (anche due sole parole) unisce alla prima altre 14 celle (stessa riga), poi
Codice: Seleziona tutto
Dim CL As Range
For Each Cell In Range("D2:D402")
Cell.Select
Range(ActiveCell, ActiveCell.Offset(0, 14)).Select
    With Selection
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlCenter
        .WrapText = True
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = True
    End With
    Selection.RowHeight = 37
    'Selection.Rows.AutoFit
    Next

faccio prima
Ciao
Ricky0185
Utente Senior
 
Post: 303
Iscritto il: 10/12/19 20:38

Re: Calcolare altezza riga

Postdi Anthony47 » 10/05/20 23:34

Dimenticavo dirti che la mia macrina scorre tutte le celle della colonna contenenti le voci e qualunque sia la lunghezza della voce (anche due sole parole) unisce alla prima altre 14 celle (stessa riga)
Insomma usi UnisciCelle invece di usare ColumnWidth? Se fosse così saresti un bel masochista

Di quanto da me proposto, la prima macr o e' pensata per risovere l'Autofit verticale cella per cella (meglio: singolarmente per ognuno dei gruppi di celle unite); cioe' invece di fare doppiclick sul separatore di riga (come si fa con l'autofit tradizionale) selezione un singolo gruppo di celle unite e fai eseguire la macro; poi ripeti con un altro gruppo.

La seconda macro (RangeFit) lavora su una selezione piu' ampia e fa il lavoro su tutte le celle unite che trova in quella selezione; inoltre risolve eventuali conflitti tra piu' gruppi di celle unite presenti sulla stessa riga (la riga verra' impostata sull'altezza maggiore).
Da quello che ho capito, ti dovrebbe bastare selezionare la colonna D e avviare la Sub RangeFit.

Mi sono accorto che ho omesso la classica gestione dello ScreenUpdating =False/True, utile per velocizzare (anche se non in maniera "esagerata") l'esecuzione; aggiungi queste istruzioni in testa e in coda alla Sub RangeFit (vado a correggere il codice nel mio post precedente)
Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19440
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Calcolare altezza riga

Postdi Ricky0185 » 11/05/20 12:45

Ecco la mia soluzione
Codice: Seleziona tutto
Sub Test()
    Dim CL As Range
    For Each CL In Range("d2:d402")
    If Len(CL) > 130 Then
    CL.Select
Range(ActiveCell, ActiveCell.Offset(0, 14)).Select
    With Selection
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlCenter
        .WrapText = True
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = True
    End With
    'Selection.RowHeight = 37
    End If
    Next CL 'e fin qui "stende" le celle D>130 fino alla colonna R. Poi seleziono le celle della colonna D e lancio la tua macro
    Range("D2:D402").Select
    Call RangeFit
End Sub

In un modulo questa macro + le tue.
Come dice il saggio....se ti funziona come vuoi tu, allora va bene così.
C'è un piccolo problema, niente di importante: se il contenuto della cella è di 3 o più righe l'altezza riga è perfetta, se di 2 righe l'altezza è come se fosse di 3=38,25.
Ringrazio e saluto
Ricky
Ricky0185
Utente Senior
 
Post: 303
Iscritto il: 10/12/19 20:38


Torna a Applicazioni Office Windows


Topic correlati a "Calcolare altezza riga":


Chi c’è in linea

Visitano il forum: Marius44 e 4 ospiti