2017-10-09 17 views
-1

範囲変数が文字列として格納されています。私は与えられた範囲が有効であるかどうかを確認するだけのアリです。たとえば、A11:Z4, D8:H7, B112:H80, M5:P45が無効、A5:A5が無効(1つのシナリオ)、A11:Z11, D8:H8, A5:M5が有効です。私は同じ行、異なる列にしたいです。指定された範囲が有効かどうかVBAで確認してください

どうすればこのことができますか?ここで

+0

なぜ 'M5:P45'が有効でないのですか? – Mahesh

+0

範囲A5、D5、G5:H5 "は有効または無効として返されますか?これは単一行と4つの異なる列なので、理論上は要件を満たしています。 – 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なぜここにRange(rng).Rows.Count = 1ここでチェックしますか? D5:M5の場合は動作しません。実際には範囲をコピーする必要があります.D5の後にコピーした行があります。したがって、この場合Range(rng).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を作成するためにそれを使用することができます:

編集:

は、私が質問を誤解。だから私は間違いを訂正するために私の答えを修正しました。

:これは基本的にUDF形式で書き直すミハルTurczynの答え、次のとおりです。

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'が有効とフラグされるべきであると言うなら、この関数はあなたの必要を満たすはずです。それとも無効であるとフラグされるのですか?または、2つのケースが必要ですか?そのうちの1つは有効であり、もう1つはそうではないと言いますか? – Mahesh

+1

OPは 'M5:P45'に41行が含まれているため無効とフラグされます。その基準は範囲が"同じ行、異なる列 "であるということです。 – YowE3K

関連する問題