Найдите максимальное значение в выбранных ячейках

прямо сейчас я начинаю программировать с vba, и я испытываю трудности с пониманием логики переменных на нем.

  • Что я хотел бы сделать с этим, так это найти максимальное значение в определенной строке по выбору пользователей.
  • Из того, что я знаю о программировании, а также из интернет-исследований, я получил этот код.
Option Explicit

Sub LimiteSuperioremK4()
'
' LimiteSuperioremMaq5 Macro
'
    Dim teste As Double
    Dim teste1 As String
    Dim teste2 As String
    Dim nTamanhoCell As Integer
    Dim xTitleid As String
    Dim rcell As Double
    Dim Max As Double
    Dim x As Integer
    xTitleid = "Retirar Números de Texto"
    teste1 = Application.InputBox("Porfavor selecione a lista de argumentos que quer retirar:", xTitleid, "", Type:=10)
    ' If TypeName(teste1) = "Nothing" Then Exit Sub
    teste2 = Application.InputBox("Por favor selecione onde quer colocar, a lista de elementos retirada:", xTitleid, "", Type:=10)
    ' If TypeName(teste2) = "Nothing" Then Exit Sub
        Max = 0 'set "inital" max
            nTamanhoCell = Len(teste1)
            rcell = nTamanhoCell
        For rcell = 1 To nTamanhoCell
            If rcell > Max Then
            Max = rcell
            End If
            Next rcell
    End Sub

Данные работали: "КГ - 0,785; 0,857; 0,652 и так далее и так далее..." значения от 0 до 1.

Итак, вопрос, который я хотел бы задать, заключается в том, почему он продолжает говорить, что я не даю объект на «teste1», когда я выбираю его значения.

Заранее спасибо!

Поскольку вы объявили teste типом Range, который является объектом

Ron Rosenfeld 10.12.2020 13:10

Да, мне нужно пройти через ряд значений, чтобы найти самое высокое, не так ли? Я постараюсь установить для него значение или удалить его.

Carlos Garcia 10.12.2020 13:12

Кроме того, проверьте, что произойдет с вашим кодом, если поле ввода для teste1 или teste2 будет строкой, а не диапазоном.

Ron Rosenfeld 10.12.2020 13:28

Хорошее предложение, не думал использовать строку в качестве массива чисел! Спасибо Рон! Отредактирую или прокомментирую, если у меня будут какие-то результаты!! Очень благодарен за помощь, в компании никто даже не смотрит на мой код, спасибо братан!

Carlos Garcia 10.12.2020 13:30

Я вижу, что вы отредактировали свой вопрос после моего ответа и теперь спрашиваете о teste1, а не test. Причина, по которой teste1 требуется объект, заключается в том, что вы используете слово Set и, вероятно, передаете ему строку.

Ron Rosenfeld 10.12.2020 13:30

Да, я отредактировал, потому что я сделал ошибку в первом сообщении об этом... я думаю, что teste также сломает мой код, когда я доберусь до «для каждого», но я проверю это позже, прямо сейчас я просто хочу, чтобы мой код читал значения ряда чисел...

Carlos Garcia 10.12.2020 13:33

Ну, если я поставлю teste1 в виде строки, он сломается на команду «для каждого», попытаюсь сделать с ней только for и посмотреть, работает ли она. Спасибо еще раз за помощь! Действительно ценю это!

Carlos Garcia 10.12.2020 13:35

Не используйте Set. Тогда teste1 станет двумерным массивом значений в выбранном диапазоне, а не самим объектом диапазона. Затем вы можете изучить элементы массива, чтобы выполнить сравнение. Или вы можете просто применить Application.Worksheetfunction.Max к массиву.

Ron Rosenfeld 10.12.2020 13:36

Хейя, поэтому я использовал на нем функцию max, и мне трудно понять, что ему нужно, потому что я скармливаю ему массив значений, и он даже ничего мне не выдает, говоря, что невозможно получить это.....

Carlos Garcia 10.12.2020 13:44

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

Carlos Garcia 10.12.2020 14:03

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

Ron Rosenfeld 10.12.2020 14:18

Хорошо, я попытаюсь объяснить, я также могу опубликовать некоторые данные, потому что это почти все то же самое. Это ряды весов, взятые секунда за секундой, поэтому представьте строку 0.xxx и 0.yyy.

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

Ответы 1

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

В вашем коде есть логика, которая служит другой цели.

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

Также некоторые предложения:

  • Назовите свою процедуру и переменные чем-то осмысленным
  • Сделайте отступ в коде (можно использовать сайт Rubberduckvba.com)
  • Разделите логику на шаги

Прочтите комментарии к коду и войдите в него с помощью клавиши F8


Код:

Public Sub WriteMaxFromRange()
    
    ' Get the range of values from user
    Dim sourceRange As Range
    Dim messageTitle As String
    messageTitle = "Retirar Números de Texto"
    Set sourceRange = Application.InputBox("Por favor selecione a lista de argumentos que quer retirar:", messageTitle, "", Type:=8)
    
    ' Validate if user selected something and is more than one cell
    If sourceRange Is Nothing Then Exit Sub
    If sourceRange.Cells.CountLarge = 1 Then Exit Sub
    
    ' Get the destination cell
    Dim targetRange As Range
    Set targetRange = Application.InputBox("Por favor selecione onde quer colocar, a lista de elementos retirada:", messageTitle, "", Type:=8)
    
    ' Validate if user selected something and is just one cell
    If targetRange Is Nothing Then Exit Sub
    If targetRange.Cells.CountLarge > 1 Then Exit Sub
    
    ' Iterate through cells and find max
    Dim maxValue As Double
    Dim sourceCell As Range
    For Each sourceCell In sourceRange.Cells
        ' Skip text
        If Not Application.WorksheetFunction.IsText(sourceCell.Value) Then
            ' Compare with and update max
            If sourceCell.Value > maxValue Then
                maxValue = sourceCell.Value
            End If
        End If
    Next sourceCell
    
    ' Write max value in target cell
    targetRange.Value = maxValue
    
End Sub

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

Carlos Garcia 10.12.2020 15:30

Конечно, давайте я просто напишу свой и проверю, я с удовольствием проголосую и поставлю галочку! Из того, что я прочитал, я думаю, что он получит максимальное значение из строки, так что да, это то, что я хотел. Большое спасибо за ваше время!! Я снова ценю это!!

Carlos Garcia 10.12.2020 16:28

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