Excel VBA Получение ошибки #Value при попытке написать функцию для массива - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь найти самую короткую строку в массиве из листа. Однако, когда я пытаюсь выполнить функцию, я получаю ошибку #Value. Что я делаю неправильно? Спасибо!

Function ShortestString(ByVal array1 As Range)

Dim nRows As Integer
Dim i As Integer
Dim cell As String
Dim cellLength As Integer
Dim string1 As String

nRows = array1.Rows.Count
cellLength = 100
cell = array1.Cells(i, 1).Value

For i = 1 To nRows
    If cellLength > Len(cell) Then
    cellLength = Len(cell)
    string1 = cell
    End If
Next i

ShortestString = string1

End Function

1 Ответ

0 голосов
/ 31 октября 2018

Несколько проблем в вашем коде.

  • Во-первых, вы никогда не назначаете 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...