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

Ошибка времени выполнения «1004» в WorksheetFunction.Max/Min для диапазона переменных

Я хочу получить максимальный и минимальный диапазон в цикле for (для каждой строки).

Любое решение, которое я нашел в Интернете, либо для статического диапазона, либо дает мне ту же ошибку. В настоящее время я использую следующее, что дает run-time error '1004' в строке xMax:

Dim i As Long
Dim xMax As Double
Dim ws1 As Worksheet
Set ws1 = Worksheets("Sheet1")

For i = 2 To 15
    xMax = Application.WorksheetFunction.Max(ws1.range(Cells(i, 6), Cells(i, 15)))
Next

Однако работает следующий статический диапазон:

xMax = Application.WorksheetFunction.Max(ws1.range(Cells(2, 6), Cells(2, 15)))

Я попытался упростить его до 2 ячеек:

Статический диапазон не имеет проблем:

xMax = Application.WorksheetFunction.Max(Cells(2, 6).Value, Cells(2, 7).Value)

Но динамический диапазон выдает ту же ошибку:

For i = 2 To 15
    xMax = Application.WorksheetFunction.Max(Cells(i, 6).Value, Cells(i, 7).Value)
Next

Как я могу достичь минимального/максимального диапазона переменных в цикле?

26.06.2017

  • Вы неправильно определили Cells вызовы: xMax = Application.WorksheetFunction.Max(ws1.range(ws1.Cells(i, 6), ws1.Cells(i, 15))) 26.06.2017
  • Разве вам не нужно использовать Next i? И установите его как int 26.06.2017
  • @David G: Нет, i не является обязательным, но это хорошая практика. 26.06.2017

Ответы:


1

Принимая исходное утверждение после квалификации всех диапазонов:

xMax = Application.WorksheetFunction.Max(ws1.range(ws1.Cells(i, 6), ws1.Cells(i, 15)))

Когда в некоторых ячейках внутри диапазона есть ошибки, например #NA или #DIV!0, функция Max выдает ошибку. Чтобы ваши вычисления игнорировали ошибочные ячейки в диапазоне, вы можете использовать функцию Aggregate.

xMax = Application.Aggregate(14, 6, ws1.range(ws1.Cells(i, 6), ws1.Cells(i, 15)), 1)
  • Первый параметр 14 указывает Large. Используйте 15 для Small.
  • Второй параметр 6 указывает "игнорировать ошибки при вычислении".
  • Последний параметр 1 указывает "Первый наибольший результат".

Обратите также внимание, что другая версия, которую вы пробовали, т.е.

xMax = Application.WorksheetFunction.Max(Cells(i, 6).Value, Cells(i, 7).Value)

Задает не непрерывный диапазон, а набор значений (вариантов). Это вызовет ошибку всякий раз, когда один из этих вариантов не является числовым. Но вам не нужна эта версия однако.

26.06.2017
  • Великолепно! Спасибо, что спас меня от биения головой о стену! 26.06.2017
  • Я использовал xMax = Application.Aggregate(4, 6, ws1.range(ws1.Cells(i, 6), ws1.Cells(i, 15))) для Max и xMin = Application.Aggregate(5, 6, ws1.range(ws1.Cells(i, 6), ws1.Cells(i, 15))) для Min вместо 14 для Большого и 15 для Маленького, если кто-то заинтересован в будущем. 26.06.2017

  • 2

    вы должны указать Excel, на что указывает cell, иначе он будет использовать активный лист, например

    xMax = Application.WorksheetFunction.Max(ws1.range(ws1.Cells(i, 6), ws1.Cells(i, 15)))
    

    or

    With ws1
        xMax =  Application.WorksheetFunction.Max(.Range(.Cells(i, 6), .Cells(i, 15)))
    End With
    

    лично я обычно сначала присваиваю диапазон переменной диапазона - это помогает при отладке:

    With ws1
        dim r as range
        ''' set r = .Range(.Cells(i, 6), .Cells(i, 15))  ' Fails if not all cells are numeric
        set r = .Range(.Cells(i, 6), .Cells(i, 15)).SpecialCells(xlCellTypeConstants, xlNumbers)
        xMax =  Application.WorksheetFunction.Max(r)
    End With
    
    26.06.2017
  • Спасибо, это была проблема. Однако у меня такая же ошибка, когда речь идет о ячейках, содержащих #N/A 26.06.2017

  • 3

    Я включаю функцию разделения, которая облегчает захват буквы.

    Dim i As Long
    Dim xMax As Double
    Dim ws1 As Worksheet
    Set ws1 = Worksheets("Sheet1")
    
    For i = 2 To 15
        xMax = Application.WorksheetFunction.Max(ws1.range("F" & i & ":" & Split(Cells(, i).Address, "$")(1) & "15"))
    Next
    
    26.06.2017
  • Спасибо за ваш ответ. Однако переменная i предназначена для строк, а не для столбцов. Мне нужно получить F2:O2, F3:O3... , F15:O15, обратите внимание, что xMax = Application.WorksheetFunction.Max(ws1.range("F:" & i & "O:" & i)) тоже не работает. Любые идеи? 26.06.2017
  • Новые материалы

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

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

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

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

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

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

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