Например, Я бы хотел, чтобы строка, такая как «Это набор слов в последовательности из 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!
и я не знаю почему. Как это исправить?
Как насчет слова, состоящего из букв и цифр .......... Мне нравится соус для стейка А1.
@ Gary'sStudent мммммм Стейк
@ Gary'sStudent Если мы хотим подсчитать количество слов, состоящих из букв и цифр?
Вы можете просто использовать 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
.
Я изменил вход на ActiveCell As String
, а затем объявил Dim text As String
и получил желаемый результат. Спасибо большое!
@AdamStaples - «Передача ByRef или ByVal указывает, передается ли фактическое значение аргумента в CalledProcedure с помощью CallingProcedure, или ссылка ... передается в CalledProcedure. Если аргумент передается ByRef, адрес памяти аргумент передается в CalledProcedure, и любые изменения этого параметра с помощью CalledProcedure вносятся в значение в CallingProcedure. Если аргумент передается ByVal, в CalledProcedure передается фактическое значение, а не ссылка на переменную ». - Чип Пирсон
@urdearboy - Ах! Я не понимал, что мне не нужен заполнитель. Я думал, что как только я установил для имени UDF (num_words
) значение, он выйдет из подпрограммы. Я оставлю это для OP здесь, но спасибо, что сказали мне это! В дальнейшем я больше не буду их использовать: D
Истинное значение не будет присвоено, пока цикл не завершится! См. Рабочий пример в решении @Jeeped :)
@urdearboy - Да, его ответ довольно умный. Итак, было ли мое мышление правильным, если бы это был нет в цикле, и я сказал бы num_words = 1 // num_words = 2
, он бы вышел из функции и вернул бы 1
?
Функция всегда будет приводить к последнему определению num_words
, поэтому в вашем примере результат будет 2.
Разделите всю строку, затем подсчитайте нечисловые элементы.
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
чем-то, как он работает, чтобы вычитать из самого себя?
В VBA Правда численно минус один, а не один, как на листе.
Разве это не прибавило бы количества числовых слов?
@BruceWayne, как и любой необъявленный var, необъявленная функция - это вариант, по умолчанию инстанцируемый в числовом виде как ноль, поэтому, если вы начнете добавлять или вычитать числа в / из варианта, вы получите числа.
@Brotato, мне плохо; логика была обратной. исправлено выше.
@Jeeped Хотя A1 является строкой, если я использую abcWords (A1) в листе Excel, это не сработает, я не верю? Разве вместо этого нам не следует использовать abcWords(ActiveCell)
?
@AdamStaples, не понимаю, почему у вас могут возникнуть проблемы. См. Добавленный выше img.
=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)))))