2017-10-09 4 views
-1

J'ai une variable de plage stockée sous forme de chaîne. Je viens juste de vérifier que la plage donnée est valide ou non. Par exemple: A11:Z4, D8:H7, B112:H80, M5:P45 non valide, A5:A5 non valide (un scénario), A11:Z11, D8:H8, A5:M5 est valide. Je veux juste entrer dans la même rangée, différentes colonnes.Vérifier avec VBA si la plage donnée est valide ou non

Comment pouvons-nous faire cela?

+0

Pourquoi «M5: P45» n'est-il pas valide? – Mahesh

+0

La plage «A5, D5, G5: H5» est-elle censée être retournée comme valide ou invalide? C'est une rangée unique, et quatre colonnes différentes, donc en théorie répond à vos besoins. – YowE3K

+0

@Mahesh Je ne veux que la même ligne, donc quand M5: P45 n'est pas valide. – KaviSuja

Répondre

0

Nous vous remercions de votre aide. Je viens d'utiliser la méthode ci-dessous pour résoudre ce problème.

   Dim i As Integer 
       Dim retval As String 
       Dim retval1 As String 
       Dim colFrom As String 
       Dim colTo As String 

     'Example : FromRange = A5, ToRange =D5 
       If FromRange = ToRange Then 'For Same Column 
        MsgBox "The Input Range specified is invalid" 
        Exit Sub 
       End If 

       colFrom = FromRange 
       colTo = ToRange 
     'Get the numbers only from given range and compare it 
       For i = 1 To Len(colFrom) 
        If Mid(colFrom, i, 1) >= "0" And Mid(colFrom, i, 1) <= "9" Then 
         retval = retval + Mid(colFrom, i, 1) 
        End If 
       Next 

       For i = 1 To Len(colTo) 
        If Mid(colTo, i, 1) >= "0" And Mid(colTo, i, 1) <= "9" Then 
         retval1 = retval1 + Mid(colTo, i, 1) 
        End If 
       Next 

       If retval <> "" And retval1 <> "" And retval = retval1 Then 
        myCellRange= FromRange & ":" & ToRange 
       Else 
        MsgBox "Input Range is invalid" 
        Exit Sub 
       End If 
2

est ici un code, vous pouvez utiliser:

Sub Validate() 
Dim rng As String 
'here you can define your range 
rng = "C11:D12" 

If Range(rng).Rows.Count = 1 And Range(rng).Columns.Count > 1 And Range(rng).Areas.Count = 1 Then 
    MsgBox "Range is valid" 
Else 
    MsgBox "Range is invalid" 
End If 

End Sub 
+0

@Michal pourquoi ici Range (rng) .Rows.Count = 1 ici nous vérifions? Cela ne fonctionne pas si D5: M5. En fait j'ai besoin de copier la gamme, après D5 il y aura des lignes que j'ai copiées. Donc, dans ce cas Range (rng) .Rows.Count toujours> 1 la plupart du temps – KaviSuja

+0

@KaviSuja 'Range (" D5: M5 "). Rows.Count' sera égal à 1. (Il n'y a qu'une ligne, ligne 5, dans cette plage.) Si votre gamme comprend des rangées supplémentaires, par ex.'" D5: M10 "', alors par votre propre définition, cette plage est invalide. – YowE3K

+0

@ YowE3K Corrigé :) –

2

Si vous imprimez l'adresse d'un objet Range dans VBA, il va imprimer l'adresse dans le bon ordre. Donc, si vous le passez à A6:A5, vous saurez que vous faites réellement référence à A5:A6.

Vous pouvez l'utiliser pour créer une UDF:

Edit:

j'ai mal compris la question. J'ai donc modifié ma réponse pour faire rectifier les erreurs.

Remarque: Ceci est essentiellement Michal réponse de Turczyn, réécrite sous la forme d'une UDF:

Function IS_RANGE_VALID(s As String) As Boolean 
    IS_RANGE_VALID = (Range(s).Rows.Count = 1 And Range(s).Columns.Count > 1) 
End Function 

Le résultat:

╔═══╦══════════╦═══════╗ 
║ ║ A  ║ B ║ 
╠═══╬══════════╬═══════╣ 
║ 1 ║ A11:Z4 ║ FALSE ║ 
║ 2 ║ D8:H7 ║ FALSE ║ 
║ 3 ║ B112:H80 ║ FALSE ║ 
║ 4 ║ M5:P45 ║ FALSE ║ 
║ 5 ║ A5:A5 ║ FALSE ║ 
║ 6 ║ A11:Z11 ║ TRUE ║ 
║ 7 ║ D8:H8 ║ TRUE ║ 
║ 8 ║ A5:M5 ║ TRUE ║ 
╚═══╩══════════╩═══════╝ 

Remarque: Comme je vous ai demandé à le commentaire, pourquoi M5:P45 est-il invalide? Si c'était une faute de frappe, alors cela devrait marcher pour vous. Sinon, vous devrez être plus clair sur le critère que vous utilisez pour déterminer la validité d'une plage.

+0

Pour un scénario, le numéro de ligne doit être égal à M5: P5 ou M45: P45 – KaviSuja

+0

@ KaviSuja, je ne comprends pas. Si vous voulez dire que 'M5: P5' devrait être marqué comme valide, alors cette fonction devrait satisfaire vos besoins. Ou voulez-vous que ce soit marqué comme invalide? Ou avez-vous besoin de deux cas, dont l'un dit que c'est valide et l'autre dit que ce n'est pas? – Mahesh

+1

L'OP souhaite que «M5: P45» soit marqué comme non valide car il contient 41 lignes - leur critère est que la plage est «dans la même ligne, différentes colonnes». – YowE3K