прямо сейчас я начинаю программировать с 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», когда я выбираю его значения.
Заранее спасибо!
Да, мне нужно пройти через ряд значений, чтобы найти самое высокое, не так ли? Я постараюсь установить для него значение или удалить его.
Кроме того, проверьте, что произойдет с вашим кодом, если поле ввода для teste1 или teste2 будет строкой, а не диапазоном.
Хорошее предложение, не думал использовать строку в качестве массива чисел! Спасибо Рон! Отредактирую или прокомментирую, если у меня будут какие-то результаты!! Очень благодарен за помощь, в компании никто даже не смотрит на мой код, спасибо братан!
Я вижу, что вы отредактировали свой вопрос после моего ответа и теперь спрашиваете о teste1
, а не test
. Причина, по которой teste1
требуется объект, заключается в том, что вы используете слово Set
и, вероятно, передаете ему строку.
Да, я отредактировал, потому что я сделал ошибку в первом сообщении об этом... я думаю, что teste также сломает мой код, когда я доберусь до «для каждого», но я проверю это позже, прямо сейчас я просто хочу, чтобы мой код читал значения ряда чисел...
Ну, если я поставлю teste1 в виде строки, он сломается на команду «для каждого», попытаюсь сделать с ней только for и посмотреть, работает ли она. Спасибо еще раз за помощь! Действительно ценю это!
Не используйте Set
. Тогда teste1
станет двумерным массивом значений в выбранном диапазоне, а не самим объектом диапазона. Затем вы можете изучить элементы массива, чтобы выполнить сравнение. Или вы можете просто применить Application.Worksheetfunction.Max
к массиву.
Хейя, поэтому я использовал на нем функцию max, и мне трудно понять, что ему нужно, потому что я скармливаю ему массив значений, и он даже ничего мне не выдает, говоря, что невозможно получить это.....
Отредактирую код.. но теперь он не выдает ошибку, он просто ничего не дает мне в выбранной ячейке...
Не зная ваших вводных данных или того, как вы изменили свой код, я не могу комментировать дальше. Вы можете отредактировать свой вопрос, добавив соответствующую информацию, и я буду рад взглянуть на него.
Хорошо, я попытаюсь объяснить, я также могу опубликовать некоторые данные, потому что это почти все то же самое. Это ряды весов, взятые секунда за секундой, поэтому представьте строку 0.xxx и 0.yyy.
В вашем коде есть логика, которая служит другой цели.
Это просто для целей обучения, как указано в комментариях, вы бы решили это с помощью функции или другого метода.
Также некоторые предложения:
Прочтите комментарии к коду и войдите в него с помощью клавиши 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
Большое спасибо за эти советы ... да, я знаю, что немного напортачил, я попытаюсь сделать это, как вы, назвав то, что я хочу ... Кажется, действительно лучший способ читать и писать ваш код это разбить его на логические шаги. Я ценю ваше время, оно также очень помогло мне понять ваш код, чтобы лучше писать мой. я сделаю это с нуля, руководствуясь вашим ответом!! Еще раз спасибо за ваше время и самоотверженность!!
Конечно, давайте я просто напишу свой и проверю, я с удовольствием проголосую и поставлю галочку! Из того, что я прочитал, я думаю, что он получит максимальное значение из строки, так что да, это то, что я хотел. Большое спасибо за ваше время!! Я снова ценю это!!
Поскольку вы объявили
teste
типомRange
, который является объектом