Excel: в ячейках таблицы появляются пробелы после многострочных данных

#excel #vba

#excel #vba

Вопрос:

Это странно, и я не знаю, как правильно сформулировать это, чтобы найти результаты поиска, поэтому, хотя я бы предпочел не спрашивать здесь, я собираюсь, потому что я просто сбит с толку.

У меня есть таблица на листе Excel, которую я заполняю с помощью некоторого кода. Есть один конкретный столбец, в который я вставляю несколько многострочных строк.

Когда данные вставляются, они отображаются с тем, что кажется кучей пустых строк после данных, т. Е. Высота строки больше, чем должна быть, даже если она должна быть автоматически подобрана.

Если я попытаюсь дважды щелкнуть номера строк слева, чтобы автоматически подогнать строку, это не сработает, как будто он думает, что после данных в ячейке есть разрывы строк, однако двойной щелчок по ячейке для ее редактирования или выделения и щелчка в строке формул показывает пустых строк нет, и после выхода из редактирования строка будет автоматически подогнана, и все будет в порядке.

Хорошо, несмотря на то, что я удалил сотни loc в этой горстке функций, кода все еще больше, чем я хотел бы опубликовать, извините за это, я просто хочу показать, что нигде в коде не происходит ничего подозрительного (что я вижу).

Итак, применительно к этому коду существует два рабочих листа, и в каждом из них есть таблица. В коде на них ссылаются как на глобальные ListObject , gloMainTable и gloSummaryTable . Существует также два Enum «s MainTableColumns «, и SummaryTableColumns они предназначены только для того, чтобы упростить обслуживание в случае замены колонок.

gloSummaryTable очищается до того, как мы дойдем до этого кода и будем его заполнять. Мы начинаем с того, что обращаемся к этому:

 Private Sub CreateSummaryTable()
    Dim i As Long
    For i = 1 To gloMainTable.ListRows.Count
        ' All sorts of checks and other stuff
        Call CreateTableEntry(i)
    Next i
End Sub
 

Мы gloMainTable выполняем проверки, и когда мы находим нужную строку, мы передаем номер этой строки туда CreateTableEntry() , где мы получаем данные для новой строки gloSummaryTable .

 Private Sub CreateTableEntry(parRow As Long)
    Dim descriptions As String
    Dim projectRows As Long
    Dim endRow As Long
    'All manner of irrelevant stuff
    projectRows = GetProjectRowCount(parRow)
    endRow = parRow   projectRows - 1
    descriptions = GetDescriptions(parRow, endRow)
    Call FillTableRow(parRow, descriptions) ' Irrelevant parameters removed.
End Sub
 

Среди прочего, внутри CreateTableEntry() мы узнаем, сколько строк gloMainTable нам нужно перебрать, чтобы создать наши данные для нашей новой строки, gloSummaryTable путем вызова GetProjectRowCount() . Мы передаем начальную строку и конечную строку, GetDescriptions() чтобы мы могли создать строку, которая вызывает проблемы, которые я пытаюсь решить.

 Private Function GetProjectRowCount(parRow As Long) As Long
    Dim salesforceRef As String
    Dim res As Long
    Dim i As Long

    salesforceRef = gloMainTable.DataBodyRange(parRow, MainTableColumns.Salesforce)
    res = 1
    For i = parRow To gloMainTable.ListRows.Count
        If gloMainTable.DataBodyRange(i   1, MainTableColumns.Salesforce) = salesforceRef Then
            res = res   1
        Else
            Exit For
        End If
    Next i

    GetProjectRowCount = res
End Function
 

Здесь мы проверяем, сколько строк после нашей начальной строки принадлежит одному и тому же набору данных (проверяем ссылочный номер salesforce), чтобы мы могли выполнять любые необходимые вычисления для указанного диапазона строк и объединять описания в одну строку в GetDescriptions() функции.

 Private Function GetDescriptions(parStart As Long, parEnd As Long) As String
    Dim res As String
    Dim opt As Long
    Dim i As Long
    
    If NoMoreOptions(parStart, parEnd) Then
        res = res amp; gloMainTable.DataBodyRange(parStart, MainTableColumns.Description)

        For i = parStart To parEnd - 1
            res = res amp; vbNewLine amp; gloMainTable.DataBodyRange(i   1, MainTableColumns.Description)
        Next i
    Else
        opt = GetCheapestOption(parStart, parEnd)
        res = GetDescriptionsOfOption(parStart, parEnd, opt)
    End If
    
    GetDescriptions = res
End Function
 

Здесь мы создали нашу строку консолидированных описаний, которые мы передаем обратно вызывающему коду, CreateTableEntry() чтобы их можно было передавать вместе с множеством других данных, не показанных здесь FillTableRow() .

 Private Sub FillTableRow(_
    parRow As Long, _
    Optional parDescriptions As String = "") ' All irrelevant params removed

    Dim newRow As listRow
    Set newRow = gloSummaryTable.ListRows.Add
    'All manner of irrelevant stuff
    If parDescriptions = "" Then
        newRow.Range(, SummaryTableColumns.Description) = _
        gloMainTable.DataBodyRange(parRow, MainTableColumns.Description)
    Else
        newRow.Range(, SummaryTableColumns.Description) = Trim(parDescriptions)
    End If 
End Sub
 

А затем мы создаем нашу новую строку gloSummaryTable и заполняем ее (с большим количеством больше, чем просто описания)

Я просто не знаю, что происходит…

Комментарии:

1. Ваша настройка масштабирования не на 100%? Я вижу несколько сообщений, предполагающих, что это может сбить с толку автоматическую подгонку. Или увидеть superuser.com/questions/389976 /…

2. @TimWilliams Да, мой масштаб составляет 100%, и я попробовал небольшие хитрости, чтобы заставить его автоматически соответствовать, как в сообщении, на которое вы уже ссылались, но безрезультатно. Единственный способ, которым я мог автоматически настроить высоту строк, — это попытаться отредактировать ячейки, и при выходе они будут отображаться правильно.

3. @TimWilliams Хорошо, это определенно проблема, которая затрагивает только определенные шрифты. Я использую Liberation Mono (мне нужно моноширинное пространство, чтобы значения валют хорошо совпадали), и когда я просто выбирал затронутую ячейку и прокручивал список шрифтов, она разрешалась для определенных шрифтов и возвращалась к oversize для других. Я сомневаюсь, что это можно исправить, скорее всего, мне придется выбрать другой шрифт.

4. Когда я сталкивался с подобными проблемами, я обнаружил, что сначала установка максимальной ширины столбца (например, 255), а затем выполнение .EntireRow.AutoFit:EntireColumn.Autofit исправит это.

5. @RonRosenfeld Да, я тоже пробовал, не сработало. Похоже, это проблема с определенными шрифтами. Я замечаю, что когда я прокручиваю шрифты, все они отображаются по-разному, у некоторых появляются дополнительные пустые строки между строками текста, даже как у рукописного ввода Lucida. На самом деле, я только что вернулся и проверил прямо сейчас, и даже изменение размера шрифта, похоже, имеет значение. Я использовал Liberation Mono со скоростью 12pt, и когда я меняю его на 11pt, все в порядке. Похоже, это ошибка.