Как применить формулу Excel в макросе VBA, чтобы найти второе-последнее слово - PullRequest
0 голосов
/ 30 мая 2018

Я новичок в VBA, но немного работал с Excel.Я создал формулу, которая делает именно то, что мне нужно: найти N-е до последнего слова (в основном, 2-е или 3-е до последнего) в ячейке.Я думаю, что моя главная проблема заключается в том, как применить формулу к диапазону ячеек без перезаписи ячейки и как использовать формулы Excel в VBA.Формула Excel, которую я использую, выглядит следующим образом:

=TRIM(LEFT(RIGHT(" "&SUBSTITUTE(TRIM(A1)," ",REPT(" ",60)),180),60))

Возможно, это не самый красноречивый способ, но в Excel он работает довольно хорошо.Изменение числа от 180 до 60 даст последнее слово, от 120 второе до последнего и так далее.Но в VBA он дает 1-ю синтаксическую ошибку, и когда я запускаю его без аргументов и только с TRIM (A1), он перезаписывает ячейку.Код, который я использую, выглядит следующим образом (для проверки используется только A1):

reportsheet.Range("A1").Formula = "=TRIM(LEFT(RIGHT(" " & SUBSTITUTE(TRIM(A1)," " ,REPT(" ",60)),180),60))"

Мой макрос выполняет поиск и извлечение определенных данных из Sheet1 в Sheet2.Теперь я хотел бы применить эту (или аналогичную) формулу к данным, которые он извлекает для Sheet2.Я пробовал много разных вещей, от использования собственной обрезки VBA до создания полностью настраиваемой функции.Кажется, ничего из этого не работает, и я думаю, что это связано с неправильным пониманием того, как формулы Excel и VBA играют вместе.

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

РЕДАКТИРОВАТЬ: Извините, ребята, я допустил ошибку в коде, который я предоставил, он должен был ссылаться на A1 в обоих случаях.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Удвоение кавычек как @Jeeped и написанных комментаторов решает вашу проблему с формулой.В качестве альтернативы вы можете написать функцию («UDF»), которая возвращает n-ное слово строки.Это довольно просто с помощью функции VBA split, которая возвращает массив строк.Поместите следующий код в модуль:

Public Function getWord(s As String, ByVal n As Integer) As String

    n = n - 1   ' Because Array index will start at 0

    Dim arr() As String
    arr = Split(s, " ")
    If UBound(arr) >= n Then
        getWord = arr(n)
    End If

End Function

В Excel вы, например, пишете =getWord(A20, 3) как формула

0 голосов
/ 30 мая 2018

Удвойте кавычки внутри строки в кавычках или используйте альтернативы.

reportsheet.Range("A1").Formula = "=TRIM(LEFT(RIGHT("" "" & SUBSTITUTE(TRIM(A20),"" "" ,REPT("" "",60)),180),60))"
'alternative
reportsheet.Range("A1").Formula = "=TRIM(LEFT(RIGHT(char(32) & SUBSTITUTE(TRIM(A20), char(32), REPT(char(32),60)),180),60))"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...