アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBAのif構文について,エラーが出てしまい何故かわからなかったので,
下式のどこが原因か,どなたか教えていただけないでしょうか。

---------------------------------------------------------------------------------
amin = 1000

For q = 1 To 1000 Step 1

a = Abs(Sheets("CALCULATE").Cells(q , 1) - 1)

If a < amin Then amin = a
Else
Sheets("CALCULATE").Cells(1, 2) = q-1
End If

Next q
---------------------------------------------------------------------------------
ある列の数値が,最も1に近い値となるセル番号を出力する。
となるようにしたつもりのマクロです。
MATCH,INDEX関数を用いれば良いだけのことらしいですが,

後学のためにも,エラー原因を教えていただけないでしょうか。

A 回答 (3件)

ちょっと口を挟んでしまいます。


全体的には間違っている部分はあっても、考え方は分かります。
単に、これは、インデントを直せば、ご自身ですぐに分かります。
ツールで、フリーのスマート・インデンターというものがありますから、それをお使いになれば、エラーの原因は炙り出せます。他のインデンターは、エラーかあると実行してくれませんが、これはしてくれるので、構文のミスが検出できます。

http://www.oaltd.co.uk/Indenter/Default.htm
(私自身、もう一つ別のものを使っていますが、そのツールは、お値段が高いのでお勧めしません)

とろこでね一体、このコードは誰が考えたものなのでしょうか。
ご質問者さんが、このコードを書けるなら、このような初歩的なミスをするとは思えないのですが。
この検索は、目的の数値に一番近いものを検索するツールですね。だから、MATCH関数と互換性はあるのかもしれません。(INDEX関数単独では、そのような機能はないはずです。)

'//標準モジュール(シート名は省略)
Sub Test1()
Dim q As Long, k As Long
Dim a As Double
Dim aMin As Double
Dim Lastrow As Long
Const target As Long = 1 '目的の値
Lastrow = Cells(Rows.Count, 1).End(xlUp).Row '最終行を見つける
aMin = 10 ^ 15  '最大値を入れるなら景気よく
For q = 1 To Lastrow
 If Cells(q, 1).Value <> "" Then
  a = Cells(q, 1).Value
  If Abs(a - target) < aMin Then
  aMin = Abs(a - target)
  k = q
  End If
 End If
Next q
Cells(1, 2).Value = "値": Cells(2, 2).Value = Cells(k, 1).Value
Cells(1, 3).Value = "行": Cells(2, 3).Value = k
End Sub

'//
もし、旧VB系のアルゴリズムを解こうとするなら、これが逐時選択の最初の入門だと思います。上記のコードには、見つかったら、離脱があるとよいのですが。
    • good
    • 0

No.1さんの指摘通りかと。


なお、コーディングとしてはIF分のはじまりと終わりが分かるようTABを上手に使うことが大切です。そうすると記述ミスが減ります。
以下のような感じに。(この掲示板でのTABの扱いがわからないのでこの場は全角の空白文字を使いますが)

If a < amin Then
  amin = a
Else
  Sheets("CALCULATE").Cells(1, 2) = q-1
End If

参考まで。
    • good
    • 0

elseを使う場合は、thenの後改行してください。


If a < amin Then
amin = a
Else
Sheets("CALCULATE").Cells(1, 2) = q-1
End If
    • good
    • 0
この回答へのお礼

早速の解答ありがとうございます。
ご指摘の通り直したところ,うまく解析できました。

ありがとうございました。

お礼日時:2018/06/25 15:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!