Nano Hash - криптовалюты, майнинг, программирование

Excel VBA шагает по строкам быстрее

приведенный ниже код работает на 100%. Он ищет совпадения в столбце B, копирует и переименовывает группу ячеек, когда совпадение найдено. Однако это строка For lRow = Sheets("HR-Calc").Cells(Cells.Rows.count, "b").End(xlUp).Row To 7 Step -1, где step -1 будет сканировать строку за строкой снизу листа, пока не будет найдено совпадение. Было бы намного проще, если бы шаг был установлен на End.(xlUp) вместо -1. поиск каждой строки является излишним из-за того, как данные настроены End.(xlUp), это значительно сократит время выполнения. Возможно ли что-то подобное?

Sub Fill_CB_Calc()

M_Start:

Application.ScreenUpdating = True

Sheets("summary").Activate
d_input = Application.InputBox("select first cell in data column", "Column Data Check", Default:="", Type:=8).Address(ReferenceStyle:=xlA1, RowAbsolute:=True, ColumnAbsolute:=False)

data_col = Left(d_input, InStr(2, d_input, "$") - 1)
data_row = Right(d_input, Len(d_input) - InStr(2, d_input, "$"))

Application.ScreenUpdating = False

Sheets("summary").Activate
Range(d_input).End(xlDown).Select

data_last = ActiveCell.Row

If IsEmpty(Range(data_col & data_row + 1)) = True Then
    data_last = data_row

Else
End If

    For j = data_row To data_last

CBtype = Sheets("summary").Range(data_col & j)

    Sheets("HR-Calc").Activate
    For lRow = Sheets("HR-Calc").Cells(Cells.Rows.count, "b").End(xlUp).Row To 7 Step -1

    If Sheets("HR-Calc").Cells(lRow, "b") = CBtype Then

            CBend = Sheets("HR-Calc").Range("C" & lRow).End(xlDown).Row + 1
            Sheets("HR-Calc").Rows(lRow & ":" & CBend).Copy

            CBstart = Sheets("HR-Calc").Range("c50000").End(xlUp).Row + 2

            ActiveWindow.ScrollRow = CBstart - 8

            Sheets("HR-Calc").Range("A" & CBstart).Insert Shift:=xlDown

            CBold = Right(Range("c" & CBstart), Len(Range("C" & CBstart)) - 2)

                box_name = Sheets("summary").Range(data_col & j).Offset(0, -10)

                CBnew = Right(box_name, Len(box_name) - 2) & "-"  ' <--this is custom and can be changed based on CB naming structure
                If CBnew = "" Or vbCancel Then
                End If
            CBend2 = Range("c50000").End(xlUp).Row - 2

            Range("C" & CBstart + 1 & ":" & "C" & CBend2).Select
                Selection.Replace What:=CBold & "-", Replacement:=CBnew, LookAt:=xlPart, _
                SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
                ReplaceFormat:=False

            Range("C" & CBstart).FormulaR1C1 = "CB" & Left(CBnew, Len(CBnew) - 1)

            GoTo M_Start2
    Else

    End If

Next lRow
M_Start2:
            Next j

YN_result = MsgBox("Fill info for another block/inverter?", vbYesNo + vbExclamation)
If YN_result = vbYes Then GoTo M_Start
If YN_result = vbNo Then GoTo jumpout

jumpout:
'    Sheets("summary").Range(d_input).Select
    Application.ScreenUpdating = True
End Sub
13.04.2016

  • Посмотрите на выполнение .find снизу вверх. stackoverflow.com/questions/22464631/ 13.04.2016
  • Кроме того, использование .Select/.Activate может замедлить код. См. эту тему о том, как избежать их использования. 13.04.2016
  • У меня возникли проблемы с просмотром вашего кода - я скопировал и вставил его в свою книгу, и он просит определить эти переменные: d_input, data_col, data_row, data_last, j, CBtype, lRow, cBend, CBstart, CBold, box_name, CBnew, CBend2, YN_result. Хорошей практикой является добавление Option Explicit в начало каждого модуля. Вы можете получить значение для data_row, используя data_row = Range(d_input).Row. Когда вы используете End(xlDown), вы ищете последнюю строку или первую строку, содержащую данные? Должен ли он всегда смотреть на столбец B или столбец, выбранный с помощью d_input? Как сказал @MatthewD - используйте .Find. 13.04.2016
  • @MatthewD, если бы вы могли поместить это предложение в качестве ответа, я буду рад принять его. Он делает то, что мне нужно, мне просто нужно интегрировать его в мой код. 13.04.2016
  • @BruceWayne Я пытался свести к минимуму использование select и activate. Эта ссылка также очень полезна. Когда у меня будет время, я вернусь к своему коду и изменю его соответствующим образом. 13.04.2016
  • @DarrenBartrup-Cook, я смотрю снизу вверх из-за цикла, который я запускаю. найдите идентификатор шаблона, скопируйте информацию о переименовании этого шаблона в шаблон, найдите повторение следующего шаблона. что касается переменных, большинство из них генерируются из пользовательских входных данных или при поиске строки на листе HR-Calc 13.04.2016

Ответы:


1

Я не уверен, поможет ли это, но я значительно увеличил производительность, вытащив весь диапазон, который вам нужно перебрать в массив вариантов, а затем перебрать массив. Если мне нужно перебрать большие наборы данных, этот метод хорошо себя зарекомендовал.

Dim varArray as Variant
varArray = Range(....) 'set varArray to the range you're looping through
For y = 1 to uBound(varArray,1)  'loops through rows of the array
    'code for each row here
    'to loop through individual columns in that row, throw in another loop
    For x = 1 to uBound(varArray, 2) 'loop through columns of array
       'code here
    Next x
Next y

Вы также можете определить индексы столбцов до выполнения цикла. Затем вам нужно только выполнить те, которые вам нужны, чтобы вытащить их прямо в цикле.

'prior to executing the loop, define the column index of what you need to look at
Dim colRevenue as Integer
colRevenue = 5 'or a find function that searches for a header named "Revenue"

Dim varArray as Variant
    varArray = Range(....) 'set varArray to the range you're looping through
For y = 1 to uBound(varArray,1)  'loops through rows of the array
    tmpRevenue = CDbl(varArray(y, colRevenue))
Next y

Надеюсь это поможет.

14.04.2016
  • Это жизнеспособная альтернатива, но цикл все равно должен отступать назад; например For y = UBound(varArray,1) to LBound(varArray,1) Step -1 в данном конкретном случае. Если метод Range.Find был изолирован в один столбец и xlPrevious, он, вероятно, будет таким же быстрым или немного быстрее, чем цикл массива. Либо будет быстрее, чем перебирать ячейки рабочего листа. 14.04.2016

  • 2

    Посмотрите на выполнение .find снизу вверх.

    Выполните FIND в vba из нижняя часть диапазона вверх

    Это избавит от необходимости выполнять цикл for от последней строки до первого вхождения значения, которое вы хотите найти.

    14.04.2016
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..