質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

682閲覧

VBAにおける#VALUE!の判定

SugiuraY

総合スコア317

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/04/21 03:54

編集2022/04/21 03:55

WEBAPIをエクセル上で取り扱う場合、標準関数としてWebService(URL)を利用できることを知りました。
標準関数として利用する場合に、対象となるものがなくエラーとなる場合に、セルに#VALUE!を返してくれるのですが、これをvba上で取り扱う場合、hereのようにIsErrorを利用しても特に識別することができません。
また、それが原因なのか、その後の条件分岐の最後で処理を終了するためにEndを付けると、全ての選択肢でセルは戻り値として#VALUE!を返してしまいます。

  1. VBAでこのエラーを判定する方法はあるのでしょうか?
  2. また、それぞれの分岐の選択でEndで処理を終了させる術はあるのでしょうか?

宜しくお願い申し上げます。

vba

1Function getId(reg As String, dat As String) 2Dim userid 3Dim Parse As Object 4Dim Band_Member As Variant 5Dim URL As String 6Dim parsedUrl As String 7 8 9userid = "XXXXX" 10URL = "https://web-api.invoice-kohyo.nta.go.jp/1/valid?id=" & userid & "&number=" & reg & "&day=" & dat & "&type=21" 11parsedUrl = WorksheetFunction.WebService(URL) '標準関数で対象のURLがない場合、#VALUE!を返す 12 13If IsError(parsedUrl) Then 'here 14 getId = "ERROR:01" 15Else 16 Set Parse = JsonConverter.ParseJson(parsedUrl) 17 If Parse("count") = 0 Then 18 Debug.Print (1) 19 getId = "ERROR:02" 20 'End 21 22 ElseIf Parse("count") = 1 Then 23 Debug.Print (2) 24 getId = "HIT!" 25 'End 26 27 Else 28 Debug.Print (3) 29 getId = "ERROR:03" 30 'End 31 32 End If 33 End If 34 35End Function 36

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Dim parsedUrl As String

Dim parsedUrl As Variant
にして
WorksheetFunction.WebService

Application.WebService
に変更すれば、iserrorで検出出来るかと思います。

endの件は何をしたいのかがよく分からないので分かりません。
Y.H.さんの言うように、exit functionの方が良いとは思いますが。

投稿2022/04/21 09:06

編集2022/04/21 12:24
xail2222

総合スコア1497

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y.H.

2022/04/21 15:29

> endの件は何をしたいのかがよく分からないので分かりません。 endを使うとその時点でマクロが終了してしまい、戻り値が呼び出し元へ戻らないので ワークシート関数として呼び出した際に、「#VALUE!」がセルに表示されてしまいますね。
xail2222

2022/04/21 19:35

そうですね。 処理を抜けたいだけなら、exit functionですね。 ただそれだけなのかどうかを疑問に思ってしまって良くわからない。 と記載しました。 質問文のコードだけならexit function も無くても変わらなさそうだったので。
SugiuraY

2022/04/22 06:23

コメント遅くなり申し訳ございません。 まずEndですが、単純に不要でした。ただ、処理を抜けるときにexit functionであることは存じ上げなかったため、ご教示を頂きありがとうございます。
SugiuraY

2022/04/22 06:25

加えて、仰って頂いた通り、Application.を以下の通り利用したのですが、以下の通り、特にErrorを拾ってはくれません。発想に誤りがあればご指摘願えますでしょうか? parsedUrl = Application.WebService(URL) Debug.Print (parsedUrl) '何も出力されない If IsError(parsedUrl) Then 'falseを返してくれない getId = "ERROR:01" ' Else '後略
SugiuraY

2022/04/22 06:27

申し訳ございません、Variant型への変更の箇所を見落としました、実装できました!
guest

0

VBAでこのエラーを判定する方法はあるのでしょうか?

エラー判定はこんな感じでやるしか無さそうですね

VBA

1 Dim ret As String 2 Dim isErr As Boolean 3 4 On Error Resume Next 5 ret = WorksheetFunction.WebService("http://foo.example.com/") 6 isErr = Err.Number <> 0 7 Err.Clear 8 On Error GoTo 0 9 10 If isErr Then 11 Debug.Print "エラー" 12 Else 13 Debug.Print ret 14 getId = ret 15 End If

また、それぞれの分岐の選択でEndで処理を終了させる術はあるのでしょうか?

ENDではなく Exit Functionを使用しましょう。

投稿2022/04/21 06:04

編集2022/04/21 06:05
Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SugiuraY

2022/04/22 06:32

コメントありがとうございます。返信遅くなり誠に申し訳ございません。 拾うことはできたのですが、初心者故に以下の動作がErrオブジェクトにピンときません・・ On Error Resume Next On Error GoTo 0 try-catchの中で例外をthrowしているようなものなのか、調べてみます。 また、Exit Functionについて理解できました、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問