сколько раз слово повторяется с использованием VBA - PullRequest
0 голосов
/ 24 февраля 2019

Я работаю над проектом в VBA и хочу узнать, какой продукт является самым рецензируемым из набора данных. Я попробовал следующее:

Private Sub CommandButton1_Click()
    Dim i As Long, Ligne As Long
    Dim BCP As Workbook
    Dim fd As FileDialog, CheminBCP$



    dossierMacro = Left(ThisWorkbook.FullName, InStr(ThisWorkbook.FullName, ThisWorkbook.Name) - 1)

    Set fd = Application.FileDialog(msoFileDialogFilePicker)

    With fd
        .Title = "Choisir Base de données   "
        .InitialFileName = dossierMacro
        If .Show = -1 Then
            CheminBCP = fd.SelectedItems(1)
        End If
    End With

    Set fd = Nothing
    Set BCP = Workbooks.Open(CheminBCP)

    Ligne = BCP.Sheets(1).Range("C" & Rows.Count).End(xlUp).Row

    For i = 2 To Ligne
    a = Application.WorksheetFunction.Count(Range("A" & i))
    Next
    MsgBox a
    b = WorksheetFunction.Max(a)
    MsgBox b
    End Sub

Я попробовал этот код:

Прежде всего: я выбираю свой файл, с которым я хочу работать

Во-вторых: переменная Ligne указывает номер последней строки

Затем: я делаю для подсчета числаповторения

затем: я делаю переменную b максимально a для наиболее проверенного

Но проблема для переменных a и b я получаю 0.

Я не знаюесли бы проблема была в моей функции подсчета

Надеюсь, кто-нибудь может мне помочь, спасибо

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Хотя @Matteo NNZ хорошо объяснил, где код работает неправильно (пожалуйста, пройдите объяснение).Другой подход, встроенный в ваш код

Private Sub CommandButton1_Click()
    Dim i As Long, Ligne As Long
    Dim BCP As Workbook
    Dim fd As FileDialog, CheminBCP$
    Dim Rng As Range, Mx As Long, Cnt As Long
    Dim ProductX As String, ProductY As String

    dossierMacro = Left(ThisWorkbook.FullName, InStr(ThisWorkbook.FullName, ThisWorkbook.Name) - 1)
    Set fd = Application.FileDialog(msoFileDialogFilePicker)

    With fd
        .Title = "Choisir Base de données   "
        .InitialFileName = dossierMacro
        If .Show = -1 Then
            CheminBCP = fd.SelectedItems(1)
        End If
    End With

    Set fd = Nothing
    Set BCP = Workbooks.Open(CheminBCP)

    Ligne = BCP.Sheets(1).Range("C" & Rows.Count).End(xlUp).Row

    Mx = 0
    ProductY = ""

    For i = 2 To Ligne
    ProductX = BCP.Sheets(1).Cells(i, 1).Value
        'Test if ProductX is unique i.e. not counted before
        If i > 2 Then
        Set Rng = BCP.Sheets(1).Range("A2:A" & i - 1).Find(What:=ProductX, LookIn:=xlValues)
        End If

        If Rng Is Nothing Then     ' only when Unique product is found
        'would work only if all the values in the Column A is String
        Cnt = Application.WorksheetFunction.CountIf(Range("A2:A" & Ligne), ProductX)
            If Cnt > Mx Then
            Mx = Cnt
            ProductY = ProductX
            End If
        End If
    Next i
    MsgBox ProductY & " appeared Max " & Mx & " times in the list"

    End Sub
0 голосов
/ 24 февраля 2019

Скажем, что Ligne равно 10, ваш код:

For i = 2 To Ligne
    a = Application.WorksheetFunction.Count(Range("A" & i))
Next
MsgBox a
b = WorksheetFunction.Max(a)
MsgBox b

... сделает это:

  • От 2 до 10, переопределяет переменную a с .Count из Range("A2"), Range("A3"), ... Range("A10").Функция Count (см. Документацию здесь ) подсчитывает количество ячеек, содержащих числовые значения в диапазоне.Например, если вы скажете .Count(Range("A2:A4") и у вас есть A2="b", A3=4 и A4="c3", вы получите 1 (ячейка A2).Поскольку ваш цикл всегда переопределяет a, при выходе из цикла a - это число числовых ячеек внутри диапазона Range("A10") (т. Е. Range("A" & Ligne). Это может быть 1 или 0, в вашем случае это0 очевидно.
  • Затем вы просто пытаетесь получить .Max() числа a. Поскольку a равно 0, b обязательно будет 0 какхорошо (в общем, для того, как вы написали код, b всегда будет равно a).

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

COLUMN A
--------
PRODUCT
Apple
Android
Android
Android
Apple
Windows
Apple
Android

.. тогда вы могли бы спроектировать ваш цикл следующим образом:

Set Products = CreateObject("Scripting.Dictionary") '<-- list of products and count of occurrencies
For i = 2 To Ligne
    If Not Products.Exists(Range("A" & i).Value) Then
        'first time we count this product.
        'we add it to the dictionary with count 1
        Products.Add Range("A" & i).Value, 1
    Else
        'not first time we count this product
        'we increase its count by 1
        currentCount = Products(Range("A" & i).Value)
        currentCount = currentCount + 1
        Products(Range("A" & i).Value) = currentCount
    End If
Next i

'define mock variable for highest count
highestCount = -1
'loop through each product and get the one with highest count
For Each Product In Products.Keys
    If Products(Product) > highestCount Then
        highestCount = Products(Product)
        mostReviewedProduct = Product
    End If
Next Product

с помощью приведенного выше кода и примеров данныхЯ написал, вы получите highestCount = 4 и mostReviewedProduct = Android.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...