Как подсчитать количество нечисловых слов в Excel с помощью функции VBA

Например, Я бы хотел, чтобы строка, такая как «Это набор слов в последовательности из 13 возможных 1 слов из Словаря, или BookZZ, или Libgen.io 1876», дала мне результат 19 (потому что «13», «1876 "и" 1 являются числами и не должны считаться).

Я создал две функции, которые я пытаюсь использовать в этой функции, о которой я спрашиваю:

Первый из них следующий:

' NthWord prints out the Nth Word of a String of Text in an Excel Cell such 
' as A1 or B19.

Function NthWord(ActiveCell As String, N As Integer)

Dim X As String
X = ActiveCell

X = Trim(Mid(Replace(ActiveCell, " ", Application.WorksheetFunction.Rept(" 
", Len(ActiveCell))), (N - 1) * Len(ActiveCell) + 1, Len(ActiveCell)))

NthWord = X

' In the Excel SpreadSheet:
' Trim (Mid(Substitute(A1, " ", Rept(" ", Len(A1))), (N - 1) * Len(A1) 
' + 1, Len(A1)))

End Function 

Второй следующий:

'NumberOfWords returns the number of words in a String 

Function NumberOfWords(ActiveCell As String)

Dim X As String
X = ActiveCell
Dim i As Integer
i = 0

If Len(Trim(X)) = 0 Then
    i = 0
Else:
    i = Len(Trim(X)) - Len(Replace(X, " ", "")) + 1
End If

NumberOfWords = i


' In the Excel SpreadSheet
' IF(LEN(TRIM(A1))=0,0,LEN(TRIM(A1))-LEN(SUBSTITUTE(A1," ",""))+1)


End Function

Моя попытка распечатать NumberOfNonNumberWords

Function NumberOfNonNumberWords(ActiveCell As String)

Dim X As String
X = ActiveCell
Dim count As Integer
count = 0
Dim i As Integer

If NumberOfWords(X) > 0 Then
    For i = 1 To NumberOfWords(X)

        If Not (IsNumeric(NthWord(X, i).Value)) Then
            count = count + 1
        End If

    Next i
End If


NumberOfNonNumberWords = count

End Function

Однако, когда я применяю эту функцию в листе Excel, я получаю результат #VALUE! и я не знаю почему. Как это исправить?

=SUMPRODUCT(--NOT(ISNUMBER(--TRIM(MID(SUBSTITUTE(A1," ",REPT(" ",99)),(ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1)-LEN(SUBSTITUTE(A1‌​," ",""))+1))-1)*99+1,99)))))
Scott Craner 26.10.2018 20:52

Как насчет слова, состоящего из букв и цифр .......... Мне нравится соус для стейка А1.

Gary's Student 26.10.2018 21:00

@ Gary'sStudent мммммм Стейк

Scott Craner 26.10.2018 21:01

@ Gary'sStudent Если мы хотим подсчитать количество слов, состоящих из букв и цифр?

Adam Staples 26.10.2018 21:25
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
4
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете просто использовать SPLIT(), чтобы разделить текст на разделитель пробелов, а затем подсчитать нечисловые слова:

Function num_words(ByVal text As String)
Dim txt_split
txt_split = Split(text, " ")

Dim total_words As Long
total_words = 0

Dim i As Long
For i = LBound(txt_split) To UBound(txt_split)
    If Not IsNumeric(txt_split(i)) Then
        total_words = total_words + 1
    End If
Next i
num_words = total_words
End Function

Наши решения были в основном такими же, поэтому я удалил свое и +1, хотя я бы отказался от временного заполнителя total_words.

urdearboy 26.10.2018 20:59

Я изменил вход на ActiveCell As String, а затем объявил Dim text As String и получил желаемый результат. Спасибо большое!

Adam Staples 26.10.2018 21:07

@AdamStaples - «Передача ByRef или ByVal указывает, передается ли фактическое значение аргумента в CalledProcedure с помощью CallingProcedure, или ссылка ... передается в CalledProcedure. Если аргумент передается ByRef, адрес памяти аргумент передается в CalledProcedure, и любые изменения этого параметра с помощью CalledProcedure вносятся в значение в CallingProcedure. Если аргумент передается ByVal, в CalledProcedure передается фактическое значение, а не ссылка на переменную ». - Чип Пирсон

BruceWayne 26.10.2018 21:11

@urdearboy - Ах! Я не понимал, что мне не нужен заполнитель. Я думал, что как только я установил для имени UDF (num_words) значение, он выйдет из подпрограммы. Я оставлю это для OP здесь, но спасибо, что сказали мне это! В дальнейшем я больше не буду их использовать: D

BruceWayne 26.10.2018 21:12

Истинное значение не будет присвоено, пока цикл не завершится! См. Рабочий пример в решении @Jeeped :)

urdearboy 26.10.2018 21:14

@urdearboy - Да, его ответ довольно умный. Итак, было ли мое мышление правильным, если бы это был нет в цикле, и я сказал бы num_words = 1 // num_words = 2, он бы вышел из функции и вернул бы 1?

BruceWayne 26.10.2018 21:16

Функция всегда будет приводить к последнему определению num_words, поэтому в вашем примере результат будет 2.

urdearboy 26.10.2018 21:19
Ответ принят как подходящий

Разделите всю строку, затем подсчитайте нечисловые элементы.

function abcWords(str as string) as long

    dim i as long, arr as variant

    arr = split(str, chr(32))

    for i=lbound(arr) to ubound(arr)
        abcWords = abcWords - int(not isnumeric(arr(i)))
    next i

end function

Как работает abcWords = abcWords - int()? int() вернет 1, или 0 правильно? Когда вы сначала не объявляете abcWords чем-то, как он работает, чтобы вычитать из самого себя?

BruceWayne 26.10.2018 20:54

В VBA Правда численно минус один, а не один, как на листе.

user4039065 26.10.2018 20:55

Разве это не прибавило бы количества числовых слов?

Jchang43 26.10.2018 20:56

@BruceWayne, как и любой необъявленный var, необъявленная функция - это вариант, по умолчанию инстанцируемый в числовом виде как ноль, поэтому, если вы начнете добавлять или вычитать числа в / из варианта, вы получите числа.

user4039065 26.10.2018 20:57

@Brotato, мне плохо; логика была обратной. исправлено выше.

user4039065 26.10.2018 20:58

@Jeeped Хотя A1 является строкой, если я использую abcWords (A1) в листе Excel, это не сработает, я не верю? Разве вместо этого нам не следует использовать abcWords(ActiveCell)?

Adam Staples 26.10.2018 21:18

@AdamStaples, не понимаю, почему у вас могут возникнуть проблемы. См. Добавленный выше img.

user4039065 26.10.2018 21:27

Другие вопросы по теме