0

J'ai un programme Sub qui fonctionne bien. Je veux le convertir en une fonction personnalisée, mais quand j'utiliser cette fonction dans Excel une erreur (#VALUE!) Se produitTransformer Sub en UDF obtenir (#VALUE!)

Function ТридцатьТРи(Diapozon As Integer) 
    'для п/пр 

    Dim k, n As Integer 
    Dim parRange As Range 

    Set parRange = Range("Diapozon") 
    k = 0 
    n = 0 
    For Each Cell In parRange.Rows 
     If Cell.Offset(0, 1).Value = 1 And k = -1 Then 
      n = n - 1 
     End If 
     If Cell.Value = 1 And k = -1 Then 
      n = n + 1 
     End If 

     If Cell.Value = 1 Then 
      k = k + 1 
      If k = 2 Then 
       k = -1 

      End If 
     End If 
     If Cell.Value = 2 Or Cell.Value = 3 Then 
      k = 0 
     End If 
    Next Cell 

    ТридцатьТРи = n 

End Function 

Function

+0

Vous passez une plage à une fonction attendant un nombre entier. Vous n'utilisez jamais l'entrée de la fonction. Et y a-t-il une plage nommée "Diapozon"? –

Répondre

1

Essayez le code UDF ci-dessous (pas sûr de ce que vous essayez d'atteindre avec vos logiques à l'intérieur de l'UDF), mais il fonctionne (pas obtenir #VALUE!).

Puisque vous voulez passer un objet Range à l'UDF (en fonction de votre capture d'écran), vous devez le définir également dans votre code Function.

code

Function cyrilic(Diapozon As Range) As Long 

    Dim k As Long, n As Long 
    Dim C As Range 

    k = 0 
    n = 0 

    For Each C In Diapozon.Rows 
     If C.Offset(0, 1).Value = 1 And k = -1 Then 
      n = n - 1 
     End If 

     If C.Value = 1 And k = -1 Then 
      n = n + 1 
     End If 

     If C.Value = 1 Then 
      k = k + 1 
      If k = 2 Then 
       k = -1 
      End If 
     End If 
     If C.Value = 2 Or C.Value = 3 Then 
      k = 0 
     End If 
    Next C 

    cyrilic = n 

End Function 
1

Cela fonctionne en fonction de feuille de calcul Apperently, vous devez saisir les plage que vous avez précédemment défini avec une plage nommée "diapozon" comme plage d'entrée.

Function cyrillic(rng As Range) 

    Dim k, n As Integer 
    Dim parRange As Range 

    Set parRange = rng 
    k = 0 
    n = 0 
    For Each Cell In parRange.Rows 

    If Cell.Offset(0, 1).Value = 1 And k = -1 Then 
    n = n - 1 
    End If 

    If Cell.Value = 1 And k = -1 Then 
    n = n + 1 
    End If 

    If Cell.Value = 1 Then 
    k = k + 1 
    If k = 2 Then 
    k = -1 

    End If 
    End If 
    If Cell.Value = 2 Or Cell.Value = 3 Then 
    k = 0 
    End If 


    Next Cell 

    cyrillic = n 

End Function 

Type Just: =cyrillic("R1:RX") et cela devrait fonctionner.

+0

Je change de code comme vous l'avez dit, mais le résultat est le même (#Valeur!) – maxim465

+0

Ok, alors peut-être que le problème n'est pas la fonction mais plutôt l'entrée. A quoi ressemble votre fichier et pourrait-il y avoir quelque chose de mal ou avez-vous changé une partie de la plage nommée "Diapozon" d'une manière qui aurait influencé le code? –

+0

je édite ma question, avec PrintScreen, pourriez-vous le regarder? – maxim465