Добавление переменного количества символов в строку, основанная на текущей длине строки

У меня есть список имен, дат и титров, которые я пытаюсь вывести в текстовое поле. Я хочу, чтобы формат вывода имел следующие «Столбцы»:

Имя | Дата | Название | Индекс

Поскольку это всего лишь текстовое поле, я должен использовать вкладки [chr (9)] для поддержания интервала «Столбцы» этой таблицы. Однако, поскольку люди имеют разные имена длин, мне нужно иметь возможность вводить разные количества вкладок, чтобы каждый «столбец» правильно выравнивался. (Проблема только между именем и датой, другие «столбцы» расположены на некотором расстоянии)

Я пробовал следующий код, который предполагает (возможно, неверно), что tab = 7 пробелов (я пробовал другие номера). Он пытается выровнять даты с заголовком заголовка даты, содержащего 4 вкладки с левого края. В качестве примечания к моей нотации я заменил сложные пути на текстовое поле и имена с помощью скобок [Text Box] и [Name] для простоты. Следующие пробежки в цикле:

[Text Box].Text = "Name" & Chr(9) & Chr(9) & Chr(9) & Chr(9) & "Date" & Chr(9) & "Reason" & Chr(9) & "Index#" & Chr(10) [[Begin Loop]] [Text Box].Text = [Text Box].Text & [Name] If Len([Name]) >= 0 And Len([Name]) < 7 Then [Text Box].Text = [Text Box].Text & Chr(9) & Chr(9) & Chr(9) & Chr(9) ElseIf Len([Name])>= 7 And Len([Name]) < 14 Then [Text Box].Text = [Text Box].Text & Chr(9) & Chr(9) & Chr(9) ElseIf Len([Name]) >= 14 And Len([Name]) < 21 Then [Text Box].Text = [Text Box].Text & Chr(9) & Chr(9) ElseIf Len([Name]) >= 21 And Len([Name]) < 28 Then [Text Box].Text = [Text Box].Text & Chr(9) End If NOTE: I found that names that were an exact multiple of 7 were one tab too short, thus I added: If Len([Name]) = 7 Or Len([Name]) = 14 Or Len([Name]) = 21 Then [Text Box].Text = [Text Box].Text & Chr(9) End If [[End Loop]] 

Большинство из 100 строк в текстовом поле выстроены правильно, однако, похоже, что некоторые имена (не все), имеющие len = 14, имеют дополнительную вкладку. Когда я удаляю код, который добавляет дополнительную вкладку для кратных 7, некоторые (не все) имена с len = 14 недостаточно вложены в закладки.

У кого-нибудь есть решение? Или иначе я могу представить эти данные (т. Е. Не текстовое поле)?

Если вы делаете это исключительно для визуального выравнивания и не должны иметь возможность копировать + вставлять контент в excel или что-то (как CSV и т. Д.), То то, что вы делаете, почти правильно.

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

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

Обновить

Я решил сделать что-то, что преобразует рабочий лист в строку с выравниванием по пространству, которая может делать то, что вы хотите 🙂

 Const TABSIZE = 3 Public Function Main2(Optional ByVal SheetName As String = "Sheet1") As String Dim Sheet As Worksheet: Set Sheet = ThisWorkbook.Worksheets(SheetName) Dim Data As Variant Dim Index, Row, Column As Long Dim Max() As Integer Data = Sheet.UsedRange.Value2 ReDim Max(LBound(Data, 2) To UBound(Data, 2)) ' configure the Max() array with default values For Index = LBound(Max) To UBound(Max) Max(Index) = 0 Next Index ' populate the Max() array with the maximum width For Index = LBound(Data, 1) To UBound(Data, 1) For Column = LBound(Data, 2) To UBound(Data, 2) If Len(Data(Index, Column)) > Max(Column) Then Max(Column) = Len(Data(Index, Column)) End If Next Column Next Index ' add the tabsize to the max (add a gap between columns) ' note: the loop below is not required, has been rolled into the output loop 'For Index = LBound(Max) To UBound(Max) ' Max(Index) = Max(Index) + TABSIZE 'Next Index ' output the data! For Row = LBound(Data, 1) To UBound(Data, 1) For Column = LBound(Data, 2) To UBound(Data, 2) 'Result = Result & Pad(Data(Row, Column), Max(Column)) Result = Result & Pad(Data(Row, Column), Max(Column) + TABSIZE) Next Column Result = Result & vbCrLf Next Row ' return it Main2 = Result End Function ' pad text to length with spaces Public Function Pad(ByVal Text As String, ByVal Length As Long) As String Pad = Text & Space(Length - Len(Text)) End Function 
  • Форматирование текстовых полей в форме пользователя
  • Ограничение текстовой строки VBA в текстовом поле
  • Excel VBA - получить слово с двойным щелчком в многострочном текстовом поле userform
  • Текстовое поле VBA на числовое значение
  • Код VBA / Macro для получения значения текстового поля
  • Excel VBA - Shapes Текстовое поле OnChange событие
  • Копирование / управление форматированным текстом в текстовых блоках в Excel 2013 с использованием VBA
  • Как я могу суммировать значение в 8 текстовых файлах с одним текстовым полем?
  • сохранение данных в текстовом поле для Excel в vb.net
  • нажмите клавишу ввода в текстовом боксе, затем перейдите к определенной ячейке
  • Как активировать входной режим с VBA на текстовом поле неактивного x, вставленного в рабочий лист?
  • Interesting Posts

    Несколько сценариев в Excel для финансовых лет

    Оптимизация Excel VBA с несколькими циклами

    сталкиваются с проблемой в String, заменяя символы spl, когда вы пишете excel java

    Функция Excel с несколькими выходами БЕЗ формул массива

    Vba компенсируется новым листом

    Автоматическая загрузка в SQL через Excel

    Столбец таблицы разделен по значению на другие столбцы и его значения

    Скопируйте изображение в буфер обмена из excel -> вывод в программу -> получите сглаженное изображение. Где терпит неудачу?

    Имея проблемы совместимости с excel 2003 и 2007 с запросом данных

    Как проверить цвет фона ячейки excel

    Убедитесь, что ваш код VBA совместим с 64-разрядными версиями

    Макросъемка, когда пользователь перестает прокручивать (обновлять экран, чтобы предотвратить визуальные ошибки, связанные с фигурами)

    Несколько диапазонов с ошибкой свойства .cells

    VBA: вставить переменное количество строк

    Сравнить ячейки в VBA для условного форматирования

    Давайте будем гением компьютера.