2017-04-24 3 views
0

こんにちは、私はVBAを使い始めていますし、自分の範囲のすべてのヘッダーが適切かどうかをチェックしたいと思っています。だから1位は "Dana wartosc" 2位: "a"などですが、問題はすべてのループでそれが私を他に連れていくことです(ヘッダが悪いことを意味します)例えばRangeHolder(1)をチェックして、Debug.Print RangeHolder(1)でそれは私に適切な値を示しています。VBA:すべてのヘッダーが範囲内にあるかどうかを確認する

私に何が足りないのか教えていただけますか?

私が欲しいのは、スイッチの1番目のヘッダーをチェックインしているときです。メッセージは、第一のヘッダが細かいことを言っていると、それは

enter image description here

Option Explicit 
    Sub Szukanka() 
     Dim UpRow As Integer, DownRow As Integer, RangeHolder As Range 
     Dim x 
     x = 1 
     UpRow = 1 
     DownRow = 5 
     Set RangeHolder = Range(Cells(UpRow, 1), Cells(DownRow, 4)) 
     RangeHolder.Select 

     For x = 1 To 4 
      Select Case RangeHolder(x) 
      Case RangeHolder(1) = "Dana wartosc" 
       MsgBox ("Its good") 
      Case RangeHolder(2) = "a" 
       MsgBox ("Its good") 
      Case RangeHolder(3) = "b" 
       MsgBox ("Its good") 
      Case RangeHolder(4) = "c" 
       MsgBox ("Its good") 
      Case Else 
       MsgBox ("Its bad" + RangeHolder(x)) 
      End Select 
     Next x 
    End Sub 
+0

あなたはスクリーン - を投稿することができますあなたの 'RangeHolder'のショット?ヘッダーを探している「Range」を見ることができますか? –

+0

'Select Case'ステートメントは、いくつかのブール式(' RangeHolder(1)= "Dana wartosc")を 'RangeHolder(x)'の値と比較しています。 – YowE3K

答えて

2

あなたSelect Case文は間違って書かれています。また、2次元(行のX列)オブジェクトとしてRangeHolderを処理する必要があります。 (エラーが発生することはありません一次元として扱うが、あなたがやろうとしているものになることはほとんどありません。それは別のユーザーを混乱状況にthis questionを参照してください。)

Option Explicit 
Sub Szukanka() 
    Dim UpRow As Integer, DownRow As Integer, RangeHolder As Range 
    Dim x 
    x = 1 
    UpRow = 1 
    DownRow = 5 
    Set RangeHolder = Range(Cells(UpRow, 1), Cells(DownRow, 4)) 

    Dim Good As Boolean 
    For x = 1 To 4 
     Good = False 
     Select Case RangeHolder(1, x).Value 
      Case "Dana wartosc" 
       Good = x = 1 
      Case "a" 
       Good = x = 2 
      Case "b" 
       Good = x = 3 
      Case "c" 
       Good = x = 4 
     End Select 
     If Good Then 
      MsgBox "It's good" 
     Else 
      MsgBox "It's bad " & RangeHolder(1, x) 
     End If 
    Next x 
End Sub 

私が書くことを試みました上記のSelect Caseは、私があなたがやろうとしていることをしていると思います(つまり、最初の行がヘッダーとして正しい値であることを確認してください)。しかし、それは本当にSelect Case構造に向いていない、とあなたはあなたのSelect Caseが働いていなかった理由をIf声明

Option Explicit 
Sub Szukanka() 
    Dim UpRow As Integer, DownRow As Integer, RangeHolder As Range 
    Dim x 
    x = 1 
    UpRow = 1 
    DownRow = 5 
    Set RangeHolder = Range(Cells(UpRow, 1), Cells(DownRow, 4)) 

    Dim CorrectValues As Variant 
    CorrectValues = Array("Dana wartosc", "a", "b", "c") 
    For x = 1 To 4 
     If RangeHolder(1, x).Value = CorrectValues(x - 1) Then 
      MsgBox "It's good" 
     Else 
      MsgBox "It's bad " & RangeHolder(1, x) 
     End If 
    Next x 
End Sub 

理由として、それを書いたほうが良いでしょう:

元のSelect Caseの文が等価ブロックIfの文として書き直された場合、次のようになります。

If RangeHolder(x) = (RangeHolder(1) = "Dana wartosc") Then 
    MsgBox ("Its good") 
ElseIf RangeHolder(x) = (RangeHolder(2) = "a") Then 
    MsgBox ("Its good") 
ElseIf RangeHolder(x) = (RangeHolder(3) = "b") Then 
    MsgBox ("Its good") 
ElseIf RangeHolder(x) = (RangeHolder(4) = "c") Then 
    MsgBox ("Its good") 
Else 
    MsgBox ("Its bad" + RangeHolder(x)) 
End If 

RangeHolder(x)の値は"a"た場合(及びRangeHolder(1)"Dana wartosc"た、RangeHolder(2)RangeHolder(3)"b"であり、RangeHolder(4)"c"た、"a"であった)、次いでなること:それは(

If "a" = True Then 
    MsgBox ("Its good") 
ElseIf "a" = True Then 
    MsgBox ("Its good") 
ElseIf "a" = True Then 
    MsgBox ("Its good") 
ElseIf "a" = True Then 
    MsgBox ("Its good") 
Else 
    MsgBox ("Its bad" + "a") 
End If 

"a"としては= Trueないであろうこのように記述されている場合は実際に型の不一致を与えますが、Select Case構文ではない場合)、Else式が呼び出されます。

+0

ニース、もう一度仕事は私の方法であったが、あなたの答えを愛する –

+0

ありがとう男2番目の答えは、私が探していたものだった – kstroz

+0

いくつかの配列を見るためにもう一度ハッピー;)2番目の部分(+1)同じインスタンスで投稿されました。唯一のことはおそらく、配列は最初に1回だけ作成されることが望ましいでしょう。 –

0

あなたの構文は欠陥があるループ内の各ヘッダをチェックしています。これを試してください: -

Sub Szukanka() 
    Dim UpRow As Long, DownRow As Long  ' rows and columns are generally Longs 
    Dim RangeHolder As Range 
    Dim x As Long       ' it's a column, right? 

    x = 1 
    UpRow = 1 
    DownRow = 5 
    Set RangeHolder = Range(Cells(UpRow, 1), Cells(UpRow, 4)) 
' RangeHolder.Select      ' don't need to select anything 

    For x = 1 To 4 
     Select Case RangeHolder(x).Value 
      Case "Dana wartosc" 
       MsgBox ("Its good") 
      Case "a" 
       MsgBox ("Its good") 
      Case "b" 
       MsgBox ("Its good") 
      Case "c" 
       MsgBox ("Its good") 
      Case Else 
       MsgBox ("Its bad" + RangeHolder(x)) 
     End Select 
    Next x 
End Sub 
1

select文の記述が間違っています。また、オーバーラップ法は、読みにくいコードになるため、適切な方法ではありません。ラインRangeHolder.Selectからすべてを削除し、これでそれを置き換える、あなたの正しい値がreadbleとoredered方法でコードに表示されるように:、それはあなたが達成しようとしているかは明らかではありません

Dim correctValues: correctValues = Array("", _ 
     "Dana wartosc", "a", "b", "c") '<-- write correct sequence here 
    For x = 1 To UBound(correctValues) 
     If RangeHolder(x) <> correctValues(x) Then 
      msgBox (RangeHolder(x) & " is not at the correct position :(") 
      Exit Sub 
     End If 
    Next x 
    msgBox "All is good :) " 
End Sub 
+1

さらに良い:)このアプローチについても考えていませんでした –

関連する問題