Как создать функцию Excel, которая выводит содержимое диапазона ячеек - PullRequest
3 голосов
/ 18 мая 2019

Я пытаюсь создать функцию Excel, которая объединяет текст, содержащийся в диапазоне ячеек C4: K9.

Хотя приведенный ниже код объединяет текст в диапазоне ячеек, я не могу вставитьвозврат каретки (vbCrLF) между каждой строкой.Поэтому, когда я набираю функцию в ячейке, я хочу видеть выходное значение, я хочу, чтобы это было содержимое C4: K4, возврат каретки, C5: K5, возврат каретки и т. Д. До C9: K9, все в одной ячейке.

Function Join(rng As Range, delimiter As String) As String
Dim cell As Range, rowIndex As Long
 For rowIndex = 1 To rng.Rows.Count
   For Each cell in rng(cells(rowIndex,3), cells(rowIndex,11))
    Join = Join & cell.Text & delimiter
   Next cell
   Join = Left(Join, Len(Join) - Len(delimiter)) & vbCrLF
 Next rowIndex
End Function

У кого-нибудь есть идеи, как заставить эту функцию работать?

Ответы [ 3 ]

1 голос
/ 18 мая 2019

Поскольку вы хотите перебрать каждую ячейку подряд, вы можете сделать это следующим образом: For Each cell In rng.Rows(rowIndex).Cells.

Чтобы отобразить несколько строк в ячейке, вам нужно vbLf в качестве последнего символа каждой строки (и "Wrap Text" как формат ячейки).

Function Join(rng As Range, delimiter As String) As String
    Dim cell As Range, rowIndex As Long
    For rowIndex = 1 To rng.Rows.Count
        For Each cell In rng.Rows(rowIndex).Cells
            Join = Join & cell.Text & delimiter
        Next cell
        Join = Left(Join, Len(Join) - Len(delimiter)) & vbLf
    Next rowIndex
End Function

Последний совет: старайтесь избегать внутренних имен VBA (Join, RowIndex) для своих собственных имен функций или переменных.

0 голосов
/ 20 мая 2019

Вы ошиблись адресом исходных ячеек с помощью rowIndex = 1. Попробуйте это:

Function Join(rng As Range, delimiter As String) As String
    Dim cell As Range, rowIndex As Long, colIndex As Long

    For rowIndex = rng.Row To rng.Row + rng.Rows.Count - 1
        For colIndex = rng.Column To rng.Column + rng.Columns.Count - 1
            Join = Join & Cells(rowIndex, colIndex).Text & delimiter
        Next
        Join = Left(Join, Len(Join) - Len(delimiter)) & vbCrLf
    Next rowIndex
    Join = Left(Join, Len(Join) - 1)  ' cut terminal crlf
End Function
0 голосов
/ 18 мая 2019

Я изменил строку For Each cell вашего кода, чтобы он работал:

Function Join(rng As Range, delimiter As String) As String
Dim cell As Range, rowIndex As Long
 For rowIndex = 1 To rng.Rows.Count
   For Each cell In Range(rng(rowIndex, 1), rng(rowIndex, rng.Columns.Count))
    Join = Join & cell.Text & delimiter
   Next cell
   Join = Left(Join, Len(Join) - Len(delimiter)) & vbCrLf
 Next rowIndex
End Function

Чтобы понять разницу ... Я начал с вашей строки:

For Each cell in rng(cells(rowIndex,3), cells(rowIndex,11))

-Проблема в том, что мы используем свежие Range - это подмножество rng, но они свежие, поэтому:

For Each cell In Range(rng(rowIndex, 1), rng(rowIndex, 9))

-Это работает хорошо, но затем, чтобы сделать его более динамичным, япоменялось 9 для числа столбцов:

For Each cell In Range(rng(rowIndex, 1), rng(rowIndex, rng.Columns.Count))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...