VBA 255 максимум символов в 1 ячейке

excel vba

845 просмотра

2 ответа

63 Репутация автора

У меня есть простой макрос, который добавляет содержимое каждой строки в листе Excel в текстовый файл с разделителями между значениями каждой ячейки. Это делается путем запуска цикла for, который выполняет итерацию по каждой строке, и в конце каждой итерации значения добавляются в конец переменной String.

В каждой строке может быть много символов - я не заметил никаких проблем с этим. Однако если в одной ячейке содержится более 255 символов, конкатенация завершается неудачно. Я не уверен, что это из-за ограничений String (я не думаю, что это так), или это функции Trim, Join или Index, которые содержат это ограничение, или это что-то еще. Любая помощь в получении более глубокого понимания будет принята с благодарностью.

Строка, о которой идет речь («R» обозначает номер строки / итерации):

stringVariable = stringVariable & vbNewLine & Application.Trim(Join(Application.Index(Cells(R, "A").Resize(, 25).Value, 1, 0), "|"))

Ошибка:

Ошибка времени выполнения «13»: несоответствие типов

Автор: user3341082 Источник Размещён: 18.07.2016 08:33

Ответы (2)


1 плюс

31116 Репутация автора

Решение

Проблема с Application.Index. Как отлаживать?

Давайте получим активный лист с любыми значениями в строке 1, все с менее чем 255 символами. Но в одной из этих ячеек в строке 1, например в C1, должна быть формула:

=REPT("c",255)

Теперь разбейте код на части:

Sub test()

 r = 1

 v2DArray = Cells(r, "A").Resize(, 25).Value
 index1DArray = Application.Index(v2DArray, 1, 0)
 joinString = Join(index1DArray, "|")
 stringVariable = Application.Trim(joinString)

 MsgBox stringVariable

End Sub

Это будет работать, пока вы не измените формулу на =REPT("c",256). Теперь это не удастся Application.Index.

Вместо этого Application.Indexвы можете сделать следующее:

Sub test2()

 r = 1

 v2DArray = Cells(r, "A").Resize(, 25).Value
 ReDim v1DArray(LBound(v2DArray, 2) To UBound(v2DArray, 2)) As String
 For i = LBound(v2DArray, 2) To UBound(v2DArray, 2)
  v1DArray(i) = v2DArray(1, i)
 Next
 joinString = Join(v1DArray, "|")
 stringVariable = Application.Trim(joinString)

 MsgBox stringVariable

End Sub
Автор: Axel Richter Размещён: 18.07.2016 10:37

0 плюса

63 Репутация автора

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

В конце я решил добавить значение каждой ячейки в конец строки, по одному за раз. Решение:

For i = 1 To numberOfColumns
    If i < numberOfColumns Then
        stringVariable = stringVariable & Trim(Cells(R, i).Value) & "|"
    Else
        stringVariable = stringVariable & Trim(Cells(R, i).Value)
    End If
Next i
stringVariable = stringVariable & vbNewLine
Автор: user3341082 Размещён: 30.08.2016 04:04
Вопросы из категории :
32x32