2016-03-12 4 views
0

Новое в vba - я стараюсь сделать этот очень длинный оператор if в пользовательской функции. Функция будет проверять, соответствует ли поле правильному формату 2 буквы, 2 числа, знак подчеркивания, 1 буква, 2 числа.Excel Пользовательская функция - поле соответствует определенным критериям

=IF(AND(AND(CODE(MID(A2,1,1))>64,CODE(MID(A2,1,1))<91),AND(CODE(MID(A2,2,1))>64,CODE(MID(A2,2,1))<91),AND(CODE(MID(A2,3,1))>47,CODE(MID(A2,3,1))<57),AND(CODE(MID(A2,4,1))>47,CODE(MID(A2,4,1))<57),CODE(MID(A2,5,1))=95,AND(CODE(MID(A2,6,1))>64,CODE(MID(A2,6,1))<91),AND(CODE(MID(A2,7,1))>47,CODE(MID(A2,7,1))<57),AND(CODE(MID(A2,8,1))>47,CODE(MID(A2,8,1))<57),"Good","Bad Syntax") 

Пример А2 будет AA01_A05

код ниже - крылатый его в конце концов. Любая помощь будет оценена по достоинству.

Function bincheck(strValue As String) As Boolean 

Dim AislePos As Integer, Rackno As Integer, Udr As Integer, ShelfPos As  Integer, BinNo As Integer 
Dim TrueAisle As Boolean, TrueRack As Boolean, TrueUdr As Boolean, TrueShelf As Boolean, TrueBin As Boolean 

For AislePos = 1 To 2 
    Select Case Asc(Mid(strValue, AislePos, 1)) 
     Case 65 To 90 
      TrueAisle = True 
     Case Else 
      TrueAisle = False 
      Exit For 
    End Select 
Next 
For Rackno = 3 To 4 
    Select Case Asc(Mid(strValue, Rackno, 1)) 
     Case 48 To 56 
      TrueRack = True 
     Case Else 
      TrueRack = False 
      Exit For 
    End Select 
Next 
For Udr = 5 To 5 
    Select Case Asc(Mid(strValue, Udr, 1)) 
     Case Is = 95 
      TrueUdr = True 
     Case Else 
      TrueUdr = False 
      Exit For 
    End Select 
Next 
For ShelfPos = 6 To 6 
    Select Case Asc(Mid(strValue, ShelfPos, 1)) 
     Case 65 To 90 
      TrueShelf = True 
     Case Else 
      TrueShelf = False 
      Exit For 
    End Select 
Next 
For BinNo = 7 To 8 
    Select Case Asc(Mid(strValue, BinNo, 1)) 
     Case 48 To 56 
      TrueBin = True 
     Case Else 
      TrueBin = False 
      Exit For 
    End Select 
Next 
Select Case bincheck 
    Case TrueRack = True And TrueAisle = True And TrueUdr = True And TrueShelf = True And TrueBin = True 
bincheck = "Good" 
    Case Else 
bincheck = "Bad" 
End Select 
End Function 
+0

Хотя это, безусловно, большое достижение, что написал свою первую собственную функцию VBA, я предполагаю, что у вас есть основания для размещения этого кода. Есть ли у меня вопрос, который у меня отсутствует, или вы сталкиваетесь с ошибкой/ошибкой/проблемой с кодом, который вы не можете решить? Как мы можем помочь вам с вашим кодом? – Ralph

+0

Ах, извините, я думаю, я должен был упомянуть об этом в начальном посте. Я предполагаю, что им нелегко (функция не работает) о том, как завершить ее в конце. Я думаю, что у меня есть штука правильно, но не та часть, которая подтверждает, что все условия выполнены. Кроме того, есть ли более эффективный способ сделать это? – belleater

+0

Считаете ли вы, что вы пересказываете заявление регулярного выражения (aka RegEx)? См. [Как использовать регулярные выражения (регулярное выражение) в Microsoft Excel как внутри, так и в цикле] (http: // stackoverflow.com/questions/22542834/how-to-use-regular-expressions-regex-in-microsoft-excel-both-in-cell-and-loops/22542835? s = 1 | 0.0000 # 22542835) – Jeeped

ответ

1

Все это может быть сведено к Как заявление

Function bincheck(strValue As String) As Boolean 
    bincheck = strValue LIKE "[A-Z][A-Z]##_[A-Z]##" 
End Function 
+0

Ха, я чувствую себя немного глупо сейчас, так как я предполагаю, что я взял живописный маршрут. Благодаря! – belleater

+0

@bellater Вы многому научились, программируя эту функцию, поэтому это была не пустая трата времени. Кроме того, ваша функция обладает гораздо большим потенциалом. Вы проверили каждую часть строки, которая поддерживает обратную связь, например: «Первые два символа должны быть номерами, пожалуйста, исправьте это. Остальная часть вашей строки верна». или «Вы пропустили, чтобы поместить _ в середине. Остальное кажется прекрасным» и т. д. Конечно, для этого вам нужно будет уточнить свой код. Но в итоге вы сможете дать лучшую обратную связь, чем просто «хорошо» или «плохо». – Ralph

1

Я, кажется, что последнее утверждение Select Case,

Select Case bincheck 
    Case TrueRack = True And TrueAisle = True And TrueUdr = True And TrueShelf = True And TrueBin = True 
bincheck = "Good" 
    Case Else 
bincheck = "Bad" 
End Select 

... было бы лучше, как,

bincheck = TrueRack And TrueAisle And TrueUdr And TrueShelf And TrueBin 

Вам не нужно проверить, если булева равен правда. Это уже правда или ложно.

Проверка длины строки, переданной в функцию, может быть лучше всего в качестве общего условия «обертывания» If. Если это не выполняется, то ни одно из булевых элементов не будет установлено после значения объявления по умолчанию False (т. Е. Когда они объявлены как логические, они начинают жизнь как False).

Function bincheck(strValue As String) As Boolean 

    Dim pos As Integer 
    Dim TrueAisle As Boolean, TrueRack As Boolean, TrueUdr As Boolean, TrueShelf As Boolean, TrueBin As Boolean 

    If Len(strValue) = 8 Then 
     For pos = 1 To 2 
      Select Case Asc(Mid(strValue, pos , 1)) 
       Case 65 To 90 
        TrueAisle = True 
       Case Else 
        TrueAisle = False 
        Exit For 
      End Select 
     Next 
     For pos = 3 To 4 
      Select Case Asc(Mid(strValue, pos , 1)) 
       Case 48 To 56 
        TrueRack = True 
       Case Else 
        TrueRack = False 
        Exit For 
      End Select 
     Next 
     For pos = 5 To 5 
      Select Case Asc(Mid(strValue, pos , 1)) 
       Case Is = 95 
        TrueUdr = True 
       Case Else 
        TrueUdr = False 
        Exit For 
      End Select 
     Next 
     For pos = 6 To 6 
      Select Case Asc(Mid(strValue, pos , 1)) 
       Case 65 To 90 
        TrueShelf = True 
       Case Else 
        TrueShelf = False 
        Exit For 
      End Select 
     Next 
     For pos = 7 To 8 
      Select Case Asc(Mid(strValue, pos , 1)) 
       Case 48 To 56 
        TrueBin = True 
       Case Else 
        TrueBin = False 
        Exit For 
      End Select 
     Next 
    End If 

    bincheck = TrueRack And TrueAisle And TrueUdr And TrueShelf And TrueBin 

End Function 
+0

Ах, спасибо! оцените быстрый ответ! – belleater

+0

После перечитания второе предложение не представляется необходимым. Я не принимал во внимание 'Exit For'. Это должно решить проблему перезаписи логического на втором проходе так же, как и предложенную выше модификацию. – Jeeped

+0

Работал! Спасибо! Если вы не возражаете, добавьте вопрос, если поле имеет менее 8 символов, функция возвращает ошибку #VALUE, очевидно, потому что она ищет определенное количество символов в каждом разделе. Есть ли способ, по которому я помещаю некоторые функции IFERROR в значение false, а значения ошибок объединяются как FALSE? – belleater

1

Если вы хотите, чтобы функция возвращала текст, например, как «хорошо» или «плохо», то вы первая линия должна быть

Function bincheck(strValue As String) As String 

Если вы хотите вернуть двоичное значение (в качестве имени переменной предполагает), то вы можете оставить первую строку как

Function bincheck(strValue As String) As Boolean 

Но переменная bincheck в конце должна быть скорректирована, чтобы вернуть двоичное значение, такое как True или False:

bincheck = True 
    Case Else 
bincheck = False 

Но имя функции является bincheck это может раздражать, и я хотел бы предложить альтернативное название для функции, такие как:

Function IsTheStringFormattedCorrectly(strValue As String) As Boolean 

Затем возвращаемое значение True или False может быть лучше понимать.

+0

Спасибо за советы и предложения - очень благодарен! – belleater

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