- ベストアンサー
マクロ質問 コンパイルエラー Elseに対応
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> Range("B5").Valueのように直接それぞれの条件に入力すればゴールドやシルバーなどのランクが入力されるのですがこれはどうしてでしょうか? ランク = "ゴールド" でRange("B5")に入力されないという事ですね。 Dim ランク As Variant ランク = Range("B5").Value ではランクという変数にB5のデータがはいり、ランクはRange("B5")そのものを指すわけではありませんから ランク = "ゴールド" でランクという変数にゴールドというデータを入れただけになります。 ランク = "ゴールド" Range("B5").Value = ランク とすればB5に代入されますが、今回の場合はあまり意味のあるやり方ではないと思います。 答えにある Range("B5").Value = "ゴールド" はセルそのものにデータを代入してます。 で、ランク = "ゴールド"でB5に代入したい場合は Dim ランク As Range Set ランク = Range("B5") とすればランクはB5とみなされますので ランク.Value = "ゴールド" でB5に代入されます。 この設定でランクは「オブジェクト変数」というものになります。 次回質問することがあればコードは画像ではなくコードそのものを質問内に記載してください。 また、「答え」のコードもリンクじゃなくコードを記載してください。
その他の回答 (4)
- emsuja
- ベストアンサー率50% (1085/2162)
ElseIf 命令を使うと VBA の見通しが悪くなりデバッグがしにくくなります If 条件1 Then 設定1 Else If 条件2 Then 設定2-1 Else If 条件3 Then 設定3 設定2-2 End If 設定 1-2 Endif の様に ElseIf を使わない形か Select Case Case 条件1 設定1 Case 条件2 設定2 Case Else 設定3 End Select の様に Select Case のような形に書き換えたほうがデバッグが楽です
- kkkkkm
- ベストアンサー率66% (1742/2617)
回答No.1は説明不足だったかもなので追加しておきます If 購入額 >= 100000 Then _ ランク = "ゴールド" は Thenの後に「 _」があるので If 購入額 >= 100000 Then ランク = "ゴールド" と同じことになりこの一行でこのIf文が終わり、次のElseに対応するIfがなくなります。
補足
回答ありがとうございます。コンパイルエラーは解決しました。最後のElse分も改行を挟んでコロンが出なくなりました。 今マクロの勉強をしていて下記のファイルの04syo→L13の04-13を編集して問題を解いていたのですが、B5セルに何も入力されません。 答えのようにランクの変数宣言を外して、Range("B5").Valueのように直接それぞれの条件に入力すればゴールドやシルバーなどのランクが入力されるのですがこれはどうしてでしょうか? https://book.impress.co.jp/support/aftercare/download/500523.zip
- m5048172715
- ベストアンサー率16% (860/5261)
あれはいつも分かりにくいね。もう回答がつかなかったら、 最後は、 if ランクがゴールドのときの条件 ランクゴールド処理 endif if ランクがシルバーのときの条件 ランクシルバー処理 endif if ランクがレギュラーのときの条件 ランクレギュラー処理 endif だな。条件をよく見て作れば、動作は確実でしょう。
- kkkkkm
- ベストアンサー率66% (1742/2617)
2か所のThenの後の「 _」がいりません。 Thenの後に「 _」を付けて一行にするとその一行でIf文が終わるのでElseに対応するIfがないことになります。
お礼
ありがとうございました。