#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, все в порядке. Похоже, это ошибка.