Попробуйте это (работает для меня с некоторых длинных блоков Lorem Ipsum текста):
Sub Ftable()
Dim BigString As String, I As Long, J As Long, K As Long
Dim countRange As Range
Set countRange = ThisWorkbook.Sheets("Sheet1").Range("A1:A50")
BigString = ""
For Each r In countRange.Cells
BigString = BigString & " " & r.Value
Next r
BigString = Trim(BigString)
ary = Split(BigString, " ")
Dim cl As Collection
Set cl = New Collection
For Each a In ary
On Error Resume Next
cl.Add a, CStr(a)
Next a
For I = 1 To cl.Count
v = cl(I)
ThisWorkbook.Sheets("Sheet2").Cells(I, "B").Value = v
J = 0
For Each a In ary
If a = v Then J = J + 1
Next a
ThisWorkbook.Sheets("Sheet2").Cells(I, "C") = J
Next I
End Sub
Я взял его вниз, чтобы только смотреть на 50 ячеек, в которых у вас есть данные, в отличие от всех > 1 миллион в этой колонке. Я также исправил проблему, когда r получал массив длиной 1 вместо диапазона. И я переименовал «Selection» в «countRange», потому что Selection уже определен в приложении, так что это было плохое имя.
Также обратите внимание, что ваш код тянется от «Sheet1» и выводится в столбцы B и C «Sheet2». Убедитесь, что вы переименовали свои листы или отредактировали эти значения, или вы получите ошибки/повреждение данных.
Это, как я бы подойти к решению проблемы:
Sub Ftable()
Dim wordDict As New Dictionary
Dim r As Range
Dim countRange As Range
Dim str As Variant
Dim strArray() As String
Set countRange = ThisWorkbook.Sheets("Sheet1").Range("A1:A50")
For Each r In countRange
strArray = Split(Trim(r.Value), " ")
For Each str In strArray
str = LCase(str)
If wordDict.Exists(str) Then
wordDict(str) = wordDict(str) + 1
Else
wordDict.Add str, 1
End If
Next str
Next r
Set r = ThisWorkbook.Sheets("Sheet2").Range("B1")
For Each str In wordDict.Keys()
r.Value = str
r.Offset(0, 1).Value = wordDict(str)
Set r = r.Offset(1, 0)
Next str
Set wordDict = Nothing
End Sub
Он использует словарь, поэтому убедитесь, что вы добавить ссылку на библиотеку (Tools> Add Reference> Microsoft Scripting Library). Это также заставляет все делать строчные буквы - одна большая проблема старого кода заключалась в том, что он не учитывал капитализированные и некапитализированные версии правильно, то есть он пропускал много слов. Удалите str = LCase(str)
, если вы этого не хотите.
Бонус: этот метод работает на 8 раз быстрее на моем тестовом листе.
При попытке использовать этот код, что именно происходит? Мне кажется, что это теоретически может работать для вашей ситуации, но ваша BigString, вероятно, слишком велика для правильной обработки VBA (ей действительно не нравятся длинные строки). Если это так, вам, вероятно, придется значительно переписать код (по крайней мере, вам придется перебирать выбранные ячейки, а не решать их сразу). – Mikegrann