Avatar billede mortcob Nybegynder
10. maj 2007 - 15:06 Der er 5 kommentarer og
1 løsning

Hvordan kan denne VBA-kode virke på et helt ark?

Hej.

Jeg har et problem, med at få justeret rækkehøjden på flettede celler, når der er mere end én linies tekst i dem.

Jeg har tilsyneladende fundet en løsning (http://www.eksperten.dk/spm/441428). Men denne VBA-kode virker kun på den markerede celle. Jeg vil gerne have den til at løbe igennem hele arket.

Public Sub AutoFitMergedCellRowHeight()
    Dim iCurrentRowHeight As Single
    Dim iMergedCellRgWidth As Single
    Dim iActiveCellWidth As Single
    Dim iPossNewRowHeight As Single
    Dim rCurCell As Range
   
    If ActiveCell.MergeCells Then
      With ActiveCell.MergeArea
            If .Rows.Count = 1 And .WrapText = True Then
                Application.ScreenUpdating = False
                .EntireRow.AutoFit
                iCurrentRowHeight = .RowHeight
                iActiveCellWidth = ActiveCell.ColumnWidth
                For Each rCurCell In Selection
                    iMergedCellRgWidth = rCurCell.ColumnWidth + iMergedCellRgWidth
                Next
                .MergeCells = False
                .Cells(1).ColumnWidth = iMergedCellRgWidth
                .EntireRow.AutoFit
                iPossNewRowHeight = .RowHeight
                .Cells(1).ColumnWidth = iActiveCellWidth
                .MergeCells = True
                .RowHeight = IIf(iCurrentRowHeight > iPossNewRowHeight, _
                iCurrentRowHeight, iPossNewRowHeight)
            End If
        End With
    End If

    Set rCurCell = Nothing
End Sub



Er der nogen, som har et input, til hvordan det kan lade sig gøre?
Avatar billede kabbak Professor
10. maj 2007 - 16:12 #1
Public Sub AutoFitMergedCellRowHeight()
    Dim iCurrentRowHeight As Single
    Dim iMergedCellRgWidth As Single
    Dim iActiveCellWidth As Single
    Dim iPossNewRowHeight As Single
    Dim rCurCell As Range
    Dim Selle As Range
  For Each Selle In ActiveSheet.UsedRange
    If Selle.MergeCells Then
   
      With Selle.MergeArea
            If .Rows.Count = 1 And .WrapText = True Then
                Application.ScreenUpdating = False
                .EntireRow.AutoFit
                iCurrentRowHeight = .RowHeight
                iActiveCellWidth = ActiveCell.ColumnWidth
                For Each rCurCell In Selection
                    iMergedCellRgWidth = rCurCell.ColumnWidth + iMergedCellRgWidth
                Next
                .MergeCells = False
                .Cells(1).ColumnWidth = iMergedCellRgWidth
                .EntireRow.AutoFit
                iPossNewRowHeight = .RowHeight
                .Cells(1).ColumnWidth = iActiveCellWidth
                .MergeCells = True
                .RowHeight = IIf(iCurrentRowHeight > iPossNewRowHeight, _
                iCurrentRowHeight, iPossNewRowHeight)
            End If
        End With
    End If
    Next

    Set rCurCell = Nothing
End Sub
Avatar billede mortcob Nybegynder
10. maj 2007 - 16:46 #2
Hej kabbak.

Tak for dit svar.

Jeg kan ikke få ovenstående løsning til at virke. Den fejler ved:

.Cells(1).ColumnWidth = MergedCellRgWidth

Kører den smertefrit igennem hos dig?
Avatar billede kabbak Professor
10. maj 2007 - 18:15 #3
Nej herhjemme virkede den ikke, prøv denne, makroen "Tilpas" kalder den anden, så det er Tilpas, du skal køre


Sub AutoFitMergedCellRowHeight(Selle As String)
    Dim iCurrentRowHeight As Single
    Dim iMergedCellRgWidth As Single
    Dim iActiveCellWidth As Single
    Dim iPossNewRowHeight As Single
    Dim rCurCell As Range
    Range(Selle).Select
    With ActiveCell.MergeArea
        If .Rows.Count = 1 And .WrapText = True Then
            Application.ScreenUpdating = False
            .EntireRow.AutoFit
            iCurrentRowHeight = .RowHeight
            iActiveCellWidth = ActiveCell.ColumnWidth
            For Each rCurCell In Selection
                iMergedCellRgWidth = rCurCell.ColumnWidth + iMergedCellRgWidth
            Next
            .MergeCells = False
            .Cells(1).ColumnWidth = iMergedCellRgWidth
            .EntireRow.AutoFit
            iPossNewRowHeight = .RowHeight
            .Cells(1).ColumnWidth = iActiveCellWidth
            .MergeCells = True
            .RowHeight = IIf(iCurrentRowHeight > iPossNewRowHeight, _
                            iCurrentRowHeight, iPossNewRowHeight)
        End If
    End With
    Set rCurCell = Nothing
End Sub


Public Sub Tilpas()
    For Each Selle In ActiveSheet.UsedRange.Cells
        If Selle.MergeCells Then
            AutoFitMergedCellRowHeight Selle.Address
        End If
    Next
End Sub
Avatar billede mortcob Nybegynder
11. maj 2007 - 09:58 #4
Hej Kabbak.

Den virker. Tusind tak.

Kan man på nogen måde definere i makroen, at der er en afgrænset range (eks. C3:F45), som den skal gennemsøge. Den bliver nemlig tung at lade køre igennem hele arket.

Indsender du svar? Så lukker jeg spørgsmålet.
Avatar billede mortcob Nybegynder
11. maj 2007 - 10:02 #5
Jeg har selv fundet svaret på mit sidste spørgsmål:

Public Sub Tilpas()
    For Each Selle In Range("C3:F45")
        If Selle.MergeCells Then
            AutoFitMergedCellRowHeight Selle.Address
        End If
    Next
End Sub
Avatar billede kabbak Professor
11. maj 2007 - 10:16 #6
et svar ;-))
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester