Слово VBA, получите отдельное количество каждого отдельного значения массива

#vba #ms-word

Вопрос:

использование VBA в MS Word. в настоящее время у меня есть группа чисел в списке массивов (пожалуйста, порекомендуйте лучший вариант для хранения списка значений). Я хочу получить отдельное количество каждого значения (так что 10 =1 и 10,5 = 4). Я попытался отфильтровать список массивов, но я не думаю, что он точно соответствует значению просто «содержит», поэтому фильтрация массива и подсчет не сработали для меня (все возвращенные значения). я попробовал другое решение, которое нашел, но не смог заставить его работать. кто-нибудь порекомендует решение.

примеры данных: 10, 10.5, 10.5, 10.5, 10.5

 arr = myarrayList.toarray
filteredArray = Filter(arr, 10, True, vbTextCompare) // does not filter, since all values 'contain' 10

count10 = Application.Count(Application.Match(arr, Array(10), 0)) //i dont think vba has Match 

occurrences = arr.lastIndexOf(10) - arr.IndexOf(10, 0)   1  //i dont think vba has lastIndexof
 

Комментарии:

1. Попробуйте поместить элементы массива в «Условное обозначение»…

Ответ №1:

Пожалуйста, попробуйте следующий код:

 Sub filterArray()
   Dim arr, dict As Object, El
   'to exemplify, I build the array as:
   arr = Split("10, 10.5, 10.5, 10.5, 10.5", ", ")
   'you should use the array extracted from your ArrayList...

   Set dict = CreateObject("Scripting.Dictionary")
   For Each El In arr
        If Not dict.Exists(El) Then
            dict.Add El, 1
        Else
            dict(El) = dict(El)   1
        End If
   Next
   Debug.Print dict(CStr(10))     'the dictionary keys are strings...
   Debug.Print dict(CStr(10.5))
End Sub
 

Отредактированный:

Пожалуйста, попробуйте следующую версию, используя целые числа (в массиве и как ключи словаря).:

 Sub filterArrayX()
   Dim arr, dict As Object, El
   arr = Array(10, 10.5, 10.5, 10.5, 10.5)
   Set dict = CreateObject("Scripting.Dictionary")
   For Each El In arr
        If Not dict.Exists(El) Then
            dict.Add El, 1
        Else
            dict(El) = dict(El)   1
        End If
   Next
   Debug.Print dict(10)   
   Debug.Print dict(10.5)
End Sub
 

Комментарии:

1. Спасибо. как это работает. но если я удалю «» и окончание «,», это не удастся. Почему «» и разделено() и пустое «,» в конце. мои значения поступают не так, как они поступают в виде целых чисел. спасибо за любые объяснения по настройке вашего решения

2. @джон Риос: Боюсь, вы не понимаете эту Split функцию… Он разбивает строку на определенный разделитель. В данном конкретном случае в строке», «. Я строю массив только таким образом, используя псевдо-строку, которую вы опубликовали. Но словарь работает точно так же с целыми числами. Я преобразовал ключи из — за такого способа построения массива. Я опубликую вариант, принимающий целые числа…

3. спасибо, v2 работает как заклинание. еще раз спасибо за продолжение

4. @джон Риос: Рад, что смог помочь!