2017-02-06 4 views
0

В основном я пытаюсь выполнить Loop через все значения в массиве и подсчитать количество значений, которые больше, чем значение, заданное пользователем, с помощью Inputbox, а также пытается использовать IF чтобы обеспечить число от 1 до 100. После этого я просто хочу просто отобразить результаты в окне сообщения после.Excel VBA как искать через массив 2d

Вот то, что я до сих пор:

Dim arr As Variant 
arr = Range("A1:J10") 

Range("A1").Resize(UBound(arr, 1), UBound(arr, 2)) = arr 

Dim val As String 
val = InputBox("Enter an integer value") 
If val < 1 Or val > 100 Then 
' tells the user to try again 
    MsgBox "You did not enter a value from 1 to 100 , try again" 
val = Inputbox("Enter an integer value") 
Else 

End If 

В основном борется с, если заявление для проверки содержимого, введенных пользователем и Перебор массива.

+0

Я предполагаю, что вы хотите, чтобы 'или' в выражении if как' val' не может быть как менее одного, так и более 100. –

+0

ah right good point! – EricCarlson

ответ

0
Dim val As String 
val = InputBox("Enter an integer value") 

Do While val < 1 Or val > 100 
' tells the user to try again 
    MsgBox "You did not enter a value from 1 to 100 , try again" 
    val = InputBox("Enter an integer value") 
Loop 

'checks array if the number is greater then input number 
Dim MyRange As Range 
Dim cell As Range 
Dim counter as integer 
counter = 0 
Set MyRange = Range("A1:J10") 
For Each cell In MyRange 
    If cell.Value > CInt(val) Then 
    counter = counter + 1 
    cell.Interior.Color = RGB(255, 0, 0) 'or cell.Interior.ColorIndex = 3 
    End If 
Next 

msgbox "Total number greater then input number is: " & counter 
+0

был бы способ проверить значение val только с помощью инструкции If/Else? – EricCarlson

+0

Почему вы настаиваете на использовании инструкции if, когда цикл будет лучше, на мой взгляд. –

+0

Потому что я собирался использовать другой цикл, который будет считать значения в массиве больше, чем введенные в val. пытался избежать цикла в цикле в этом случае – EricCarlson

1

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

Do 

    Dim val As Variant 
    val = InputBox("Enter an integer value") 

    If IsNumeric(val) And val > 1 And val < 100 Then 

     Dim bPass As Boolean 
     bPass = True 

    End If 

    If Not bPass Then MsgBox "You did not enter a value from 1 to 100 , try again" 

Loop Until bPass 

Dim lCountIf As Long 

lCountIf = WorksheetFunction.CountIf(Range("A1:J10"), ">" & val) 

MsgBox lCountIf & " values greater than " & val & "in Range." 
1

Я бы

  • использовать Application.InputBox(), который позволяет поставить цифровой ввод

  • ИЗБЕЖАТЬ массив и использовать WorksheetFunction.CountIf()

В следующей таблице:

Dim val As Integer 

Do 
    val = CInt(Application.InputBox(prompt:="Enter an integer value between 1 and 100", Type:=1)) 
Loop while val <1 And val > 100 

MsgBox WorksheetFunction.CountIf(Range("A1:J10"), ">" & val) 
+0

Я искал это ('Application.InputBox'). Моя память не помогла мне в правильном синтаксисе ... поэтому я думал, что моя память просто подвела меня на InputBox, чтобы заставить целое число :( –

+1

@ScottHoltzman, да, это что-то полезное. Я даже предпочитаю его 'IsNumeric()' поскольку этот последний не является надежным (например: '? IsNumeric (" 1..2 ")' возвращает 'True' ...) – user3598756

Смежные вопросы