Несколько проблем в вашем коде.
- Во-первых, вы никогда не назначаете
i
до того, как позвоните cell = array1.Cells(i, 1).Value
. Это будет ошибка времени выполнения 1004.
- Во-вторых, вы должны проверить ввод
Range
, чтобы убедиться, что это "массив", прежде чем делать что-либо еще. Если это одна ячейка, вы можете пропустить все остальное и просто вернуть текст этой ячейки.
- В-третьих, вы никогда не обновите значение
cell
где-либо в вашей функции - оно всегда будет неинициализированным значением vbNullString
.
- В-четвертых, максимальная длина текста ячейки составляет 32767 символов, а не 100. Вы должны использовать это в качестве исходного значения.
Полагаю, вы ищете что-то более похожее на это:
Option Explicit
Public Function ShortestString(ByVal target As Range) As String
Dim rowCount As Long, columnCount As Long
rowCount = target.Rows.Count
columnCount = target.Columns.Count
If rowCount = 1 And columnCount = 1 Then
ShortestString = target.Text
Exit Function
End If
Dim rowIdx As Long, colIdx As Long
Dim shortest As String, current As String
shortest = String(32767, " ")
For rowIdx = 1 To rowCount
For colIdx = 1 To columnCount
current = target.Cells(rowIdx, colIdx).Text
If Len(current) <= Len(shortest) Then
shortest = current
End If
Next
Next
ShortestString = shortest
End Function
Обратите внимание, что вы, вероятно, можете использовать массив вместо тестирования отдельных ячеек, но это оптимизация, которую вы можете сделать, если производительность не понизится.
Edit:
Вы можете преобразовать функцию для использования массива значений ячеек, считав весь диапазон в Variant()
:
Dim cellValues() As Variant
cellValues = target.Value
For rowIdx = 1 To rowCount
For colIdx = 1 To columnCount
current = CStr(cellValues(rowIdx, colIdx))
If Len(current) <= Len(shortest) Then
shortest = current
End If
Next
Next