2016-01-02 16 views
-2

Я отобразил ДА, если данные столбца C> = 0.05 и НЕТ, если он не выполняется. Кроме того, я сделал то же самое с столбцом D в Excel. Код программы указан.Программирование Excel VBA: код необходимо изменить

Теперь я хочу изменить свою программу. Я хочу отобразить весь вывод в одном окне, как в Qbasic Programming, программировании на C. Кроме того, если мой вывод «ДА», просто мне нужно отобразить «ДА», а если «НЕТ», мне нужно отобразить соответствующие значения ячейки А.

Кодекс Дано

Sub ArrayLoops1() 
Dim arrCMarks() 
Dim arrDMarks() 
Dim i, j As Integer 
a = 0 
b = 0 
'For Column C 

arrCMarks = Range("C2:C1439").Value 
For i = LBound(arrCMarks, 1) To UBound(arrCMarks, 1) 
If arrCMarks(i, 1) >= 0.005 Then 
a = a + 1 
End If 
Next i 
If a = 0 Then 
MsgBox (" YES ") 
Else 
MsgBox ("NO") 
End If  

' For Column D 

arrDMarks = Range("D2:D1439").Value 
For j = LBound(arrDMarks, 1) To UBound(arrDMarks, 1) 
If arrDMarks(j, 1) >= 0.005 Then 
b = b + 1 
End If 
Next j 
If b = 0 Then 
MsgBox ("YES") 
Else 
MsgBox ("NO") 
End If 
End Sub 
+0

Что вы хотите сказать? Что вы пробовали? –

+0

Просьба привести два примера (один для да, один для нет). В каждом примере покажите небольшую сетку чисел вместе с желаемым выходом. –

+0

Если столбец C или D имеет данные 0.006 на пятой ячейке. Затем я должен напечатать NO со своим соответствующим значением в пятой ячейке столбца A. Если данные содержат 0.004, тогда распечатайте только YES. Сделайте то же самое для столбца D. Но мне нужно напечатать вывод в едином окне отображения для всех данных. I.e Поле отображения даст весь вывод в одном окне, например C, QBASIC @Ruud –

ответ

0

Хорошо этот выход один MsgBox:

Sub ArrayLoops1() 
    Dim arrCMarks() 
    Dim arrDMarks() 
    Dim i As Integer, j As Integer 
    Dim otptStr As String 

    'For Column C 

    arrCMarks = Range("C2:C1439").Value 
    For i = LBound(arrCMarks, 1) To UBound(arrCMarks, 1) 
     If arrCMarks(i, 1) >= 0.005 Then 
      otptStr = otptStr & "C: " & arrCMarks(i, 1) & " A" & i + 1 & ": " & Range("A" & i + 1).text & vbCrLf 
     End If 
    Next i 


    ' For Column D 

    arrDMarks = Range("D2:D1439").Value 
    For j = LBound(arrDMarks, 1) To UBound(arrDMarks, 1) 
     If arrDMarks(j, 1) >= 0.005 Then 
      otptStr = otptStr & "D: " & arrDMarks(j, 1) & " A" & j + 1 & ": " & Range("A" & j + 1).text & vbCrLf 
     End If 
    Next j 

    MsgBox otptStr, vbOKOnly, "Both Columns" 

End Sub 

Он будет выводить любые, которые больше, чем .005.

+0

Да, спасибо, но мне нужен Single Msgbox для двух столбцов, а не двух. –

+0

При запуске над программой отображается ошибка времени выполнения 9 (отображается сообщение «Подключить вне диапазона»), указывающее на ошибку в otptStr = otptStr & «D:» & arrDMarks (i, 1) & «A» & i + 1 & ":" & Диапазон («A» & i + 1) .Value & vbCrLf. Я не могу понять, что не так! –

+0

@adityalamichhane см. Редактирование. –

1

Чтобы убедиться, что я правильно понял вашу проблему:

Если по крайней мере один из значений в колонке C больше, чем или равно 0,005, вы хотите, чтобы отобразить MsgBox говорит «Да», если значение больше или равно тому, которое говорит «Нет» и то же самое снова для столбца D?

И теперь вы хотите объединить это в одном MsgBox?

В этом случае выполните следующие действия:

  1. Формат ваш код, чтобы иметь лучший обзор
  2. Мы не можем остановить итерация больше, потому что нам нужно найти все значения.
  3. Построить строку из нескольких элементов

Результирующий код:

Sub ArrayLoops1() 
    Dim i As Integer, j As Integer 
    Dim a As Boolean, b As Boolean 
    Dim MsgString As String 

    MsgString = "Column C: " 

    'For Column C 

    For i = 2 To 1439 
     If Range("C" & i).Value >= 0.005 Then 
      If a = False Then 
       a = True 
       MsgString = MsgString & "NO, values from coumn A are:" & vbCrLf 
      End If 

      'Add value from column A 
      MsgString = MsgString & Range("A" & i).Value & vbCrLf 

      'Can not stop iterating since we need to find all values 
     End If 
    Next i 

    If a = False Then 
     MsgString = MsgString & "YES" & vbCrLf 
    End If 

    MsgString = MsgString & "Column D: " 


    ' For Column D 

    For j = 2 To 3 
     If Range("D" & i).Value >= 0.005 Then 
      If b = False Then 
       b = True 
       MsgString = MsgString & "NO, values from coumn A are:" & vbCrLf 
      End If 

      'Add value from column A 
      MsgString = MsgString & Range("A" & i).Value & vbCrLf 

      'Can not stop iterating since we need to find all values 
     End If 
    Next j 

    If b = False Then 
     MsgString = MsgString & "YES" 
    End If 

    'Display the message 
    MsgBox MsgString 
End Sub 

BTW, нитевидные

Dim i, j As Integer 

приводит я неоспоримым вариантной (не хорошо), и только J beeing Integer. лучше:

Dim i as Integer, j as Integer 

Bye, кубовые

Edit: Если результат Нет, отображается соответствующее значение из столбца А (см комментарии ниже)

Edit 2: Код теперь не останавливает повторение, поскольку нам нужно найти все нарушающие значения. Теперь показаны все соответствующие значения из столбца A.

+0

Спасибо. Понял, что проблема была почти правильно, но если я должен напечатать НЕТ. Я также должен показать, что соответствует значению столбца A, в котором система говорит «НЕТ». Так понятно ? –

+0

Я думаю, вы хотите только одно значение, которое нарушает условие для отображения? – vatbub

+0

Нет, я хочу, чтобы все соответствующие значения столбца A нарушали условие в столбцах C и D. –

0

Если вы (или ваши пользователи) полностью одержимы всплывающими диалогами, я бы предложил вместо этого использовать фильтр. Такой фильтр скроет большинство строк, оставив только те, где столбец C или D или оба, удовлетворяют некоторому условию. Причина того, что строка останется видимой, будет представлена ​​в отдельном столбце.

Sub FilterCD() 
    ' Use column Z to report violating columns. 
    ' In this example: C = the value in column C > 0.005 
    '     D = the value in column D < 0.006 
    '     CD = both 
    Range("Z2").Formula = "=CONCATENATE(IF(C2>0.005,""C"",""""), IF(D2<0.006,""D"",""""))" 
    Range("Z2:Z6").FillDown 

    ' Hide rows where column Z is empty. 
    AutoFilterMode = False 
    Cells.AutoFilter Field:=26, Criteria1:="<>" 
End Sub 

Примечания:

  • Добавление большего количества столбцов в дополнение к C и D, является простым; CONCATENATE принимает любое количество аргументов.
  • Вам нужна строка заголовка над вашими данными, чтобы сделать эту работу. Другими словами, ваши данные должны начинаться с строки 2. Учитывая исходный код, я предполагаю, что это уже имеет место с вами.
  • Вы можете использовать Ctrl + Shift + L, чтобы впоследствии отменить фильтр.
  • На больших листах Excels я ожидаю, что этот код будет намного быстрее, чем все, используя петли For. Но я должен признать, что я не профилировал его.

Пожалуйста, дайте мне знать, если в моем ответе есть что-то, что не соответствует вашим требованиям.

+0

Да, это было бы хорошим решением. Но приведенный выше код отображал ошибку времени выполнения «1004» (метод автофильтров класса Range не удался). Я не могу понять, что случилось. Пожалуйста, помогите мне –

+0

На основании рекомендаций [this] (http://stackoverflow.com/questions/14827833/autofilter-method-of-range-class-failed) и многих других источников я отредактировал свой ответ, добавив строку 'AutoFilterMode = False'; надеюсь, это поможет. –

+0

Я нахожу этот метод лучше для своей проблемы Но я не получаю Что происходит в коде! , На самом деле мне нужно работать на 6 столбцах, где есть другое условие, например, больше 0,005, менее 0,006. Условие различно для разных столбцов.Если в столбце C было нарушено условие, оно должно показать, что столбец C нарушил условие и его соответствующее значение в столбце A и, как и для других столбцов. Пожалуйста, помогите мне –

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