VBAは型をある程度自動変換してくれますが、今回のケースは型をしっかり意識する必要があります。
例えば以下のコードを見てzminはv~
にどんな結果(True/False)が入るか予想してみてください。
vba
1Private Sub VariantStringDoubleCompareTest()
2 Dim zmin As Variant
3 zmin = CVar("1") 'Variant型として扱わせる
4
5 Dim v As Variant
6 v = CVar(1) 'Variant型として扱わせる
7
8 Dim zminはvより小さい As Boolean
9 Dim zminはvと同じ As Boolean
10 Dim zminはvより大きい As Boolean
11
12 zminはvより小さい = (zmin < v)
13 zminはvと同じ = (zmin = v)
14 zminはvより大きい = (zmin > v)
15
16 Stop 'ブレークポイント
17End Sub
恐らく
変数 | 値 |
---|
zminはvより小さい | False |
zminはvと同じ | True |
zminはvより大きい | False |
となると予想されたかと思います。
では実際の結果を見てみると以下のようになります。
(結果の表示にはローカルウィンドウを使っています。メニューバー→表示→ローカル ウィンドウ)
このように、型を意識せず比較演算をすると、意図しない結果となることがあります。
今回の対処としては、zmin
・zmax
設定時のApplication.InputBox
の引数にType
を指定し、数値のみ入力可能にしてあげると良いでしょう。
Office TANAKA - Excel VBA Tips[実は奥が深いInputBox]
蛇足
○○.Select及び、親のないCellsを使うと今どこで作業しているかがわかりにくくなってしまいます。
そのため、親のWorksheetを変数に取っておき、その変数経由で操作するとより堅牢になります。
ただ、親のWorksheetから辿ると記述が煩雑になる場合も多いため、さらに一歩進めて、Rangeそのものを扱う手もあります。
vba
1'Range操作メインにした場合
2
3i = 5
4ii = 3
5
6'現在処理中のデータシート
7Dim dataSheet As Worksheet
8Set dataSheet = Sheets(sht_nm)
9
10Dim currentDataCell As Range '=Cells(i, 1)
11Set currentDataCell = dataSheet.Cells.Item(i, 1)
12
13Dim v As Variant '= Cells(i, 2).Value
14v = currentDataCell.Offset(, 1).Value
15
16
17'「抽出データ」ワークシート
18Dim extractSheet As Worksheet
19Set extractSheet = Sheets("抽出データ")
20
21Dim outputCell As Range 'Sheets("抽出データ").Range(Cells(ii, 1), Cells(ii, 2))
22Set outputCell = extractSheet.Cells.Item(ii, 1).Resize(, 2)
23
24Do Until IsEmpty(v)
25 If zmin < v And v < zmax Then
26 outputCell.Value = currentDataCell.Resize(, 2).Value
27 Set outputCell = outputCell.Offset(1) 'ii = ii + 1
28 End If
29 Set currentDataCell = currentDataCell.Offset(1) 'i = i + 1
30 v = currentDataCell.Offset(, 1).Value
31Loop