2017-10-09 57 views
-1

我有一個以字符串形式存儲的範圍變量。我只是螞蟻來檢查給定的範圍是否有效。例如:A11:Z4, D8:H7, B112:H80, M5:P45無效,A5:A5無效(一種情況),A11:Z11, D8:H8, A5:M5有效。我只想進入同一行,不同的列。如果給定的範圍有效,請使用VBA進行檢查

我們該怎麼做?

+0

爲什麼'M5:P45'無效? – Mahesh

+0

範圍'「A5,D5,G5:H5」'意味着返回有效或無效?它是一排,四個不同的列,理論上符合您的要求。 – YowE3K

+0

@Mahesh我只想要同一行,所以當它的M5:P45無效。 – KaviSuja

回答

0

謝謝你的幫助。我只是用下面的方法來解決這個問題。

   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

下面是一些代碼,你可以使用:

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爲什麼在這裏範圍(rng).Rows.Count = 1在這裏我們檢查?如果D5:M5,它不工作。其實我需要複製的範圍,D5後會有我複製的行。所以在這種情況下,Range(rng).Rows.Count總是> 1大部分時間 – KaviSuja

+0

@KaviSuja'Range(「D5:M5」).Rows.Count'將等於1(只有一行, 5,在這個範圍內)。如果你的範圍包含額外的行,例如'「D5:M10」',那麼根據你自己的定義,範圍是無效的。 – YowE3K

+0

@ YowE3K更正:) –

2

如果你打印出裏面VBA的Range對象的地址,它會在正確的順序打印的地址。所以,如果你通過 A6:A5,它會知道你實際上是指 A5:A6

你可以用它來創建一個UDF:

編輯:

我誤解了這個問題。所以,我修改了我的答案,以糾正錯誤。

注意:這基本上是米哈爾Turczyn的回答,在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 

結果:

╔═══╦══════════╦═══════╗ 
║ ║ 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 ║ 
╚═══╩══════════╩═══════╝ 

注意:就像我問你評論,爲什麼 M5:P45無效?如果這是一個錯字,那麼這應該適合你。否則,您必須更清楚地瞭解您用於確定範圍有效性的標準。

+0

對於一種情況,行號應該像M5:P5或M45:P45 – KaviSuja

+0

@KaviSuja,我不明白。如果你的意思是說'M5:P5'應該被標記爲有效,那麼這個函數應該滿足你的需要。或者你想讓它被標記爲無效?或者你需要兩種情況,其中一種說它是有效的,另一種說它不是? – Mahesh

+1

OP希望'M5:P45'被標記爲無效,因爲它包含41行 - 它們的標準是範圍是「在同一行,不同列」。 – YowE3K

相關問題