Как оптимизировать мой код, исключив цикл?

sub macro() предназначен для копирования значений с другого листа и извлечения только двух первых слов из каждой ячейки, затем сравнения всех ячеек и подсчета повторяющихся ячеек. Я хотел бы упростить свой код, устранив цикл, кажется, что третий цикл можно устранить.

первый цикл предназначен для копирования значений с другого листа и извлечения только двух первых слов из каждой ячейки с помощью функции getsummary.

второй и третий цикл предназначены для сравнения всех ячеек, а затем подсчета ячеек, которые повторяются

Public Function GetSummary(text As String, num_of_words As Long) As String
    If (num_of_words <= 0) Then
        GetSummary = ""
        Exit Function
    End If

    Dim words() As String
    words = Split(text, " ")
    
    Dim wordCount As Long
    wordCount = UBound(words) + 1

    Dim result As String

    Dim i As Long
    i = 0
    Do While (i < num_of_words And i < wordCount)
        result = result & " " & words(i)
        i = i + 1
    Loop

    GetSummary = result
End Function

sub macro()
Dim i As Long, j As Long, z As Long, cell As Range, rng As Range, rng2 As Range, A As String, k As Integer, var As String
k = 0
var = Application.InputBox(prompt: = "nom du sheet")
Sheets.Add.Name = var
If var = "" Then
Exit Sub
Else
   For i = 7 To 2585
   Set cell = Worksheets("MRT").Range("E" & i)
   A = cell.Value
     Worksheets(var).Range("C" & i).Value = GetSummary(A, 2)
     Worksheets(var).Range("B" & i) = cell
   Next i
End If
For j = 7 To 2585
    Set rng = Worksheets(var).Range("C" & j)
    If rng = "" Then
    rng.Offset(0, 1) = ""
    Else
    For z = 7 To 2585
      Set rng2 = Worksheets(var).Range("C" & z)
      If rng2 = rng Then
      k = k + 1
      End If
    Next z
    rng.Offset(0, 1) = k
    k = 0
    End If

Next j
End Sub

Что должен делать "подмакрос()"? Пожалуйста, добавьте больше деталей, возможно, скриншот или два и некоторые примеры данных в виде текста. Кроме того, мы не можем протестировать его, если вы не поделитесь функцией GetSummary. Вы можете отредактируй свой пост в любое время.

VBasic2008 10.05.2022 16:22

Загрузите значения из внешнего цикла в словарь в качестве ключа и проверьте, существуют ли они в этом словаре, используйте элемент в качестве счетчика и удалите внутренний цикл.

Warcupine 10.05.2022 16:39
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
2
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это:

Sub macro()
    Dim i As Long, j As Long, var As String, start As Long, finish As Long, countRange As Range, inCache, outCache
    start = 7: finish = 2585
    var = Application.InputBox(prompt: = "nom du sheet")
    Sheets.Add.Name = var
    If var = "" Then
        Exit Sub
    Else
        inCache = Worksheets("MRT").Cells(start, 5).Resize(finish - start + 1, 1).Value2
        outCache = Worksheets(var).Cells(start, 2).Resize(finish - start + 1, 2).Value2
        For i = start - 6 To finish - 6
            outCache(i, 1) = inCache(i, 1)
            outCache(i, 2) = GetSummary(CStr(inCache(i, 1)), 2)
        Next i
        Worksheets(var).Cells(start, 2).Resize(finish - start + 1, 2).Value2 = outCache
    End If
    
    outCache = Worksheets(var).Cells(start, 3).Resize(finish - start + 1, 2).Value2
    Set countRange = Worksheets(var).Cells(start, 3).Resize(finish - start + 1)
    For j = start - 6 To finish - 6
        If outCache(j, 1) = vbNullString Then
            outCache(j, 2) = vbNullString
        Else
            outCache(j, 2) = WorksheetFunction.CountIf(countRange, outCache(j, 1))
        End If
    Next j
    Worksheets(var).Cells(start, 3).Resize(finish - start + 1, 2).Value2 = outCache
End Sub

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