【先着1,000名様!】1,000円分をプレゼント!

Access VBA 検索一致しない場合のエラー回避について

教えてください

下記のようにハイパーリンクでPDFファイルを開けるようにVBAにてコードを組んだのですが一致しない場合プログラム画面がでてエラーとなってしまいます
elseなどを使えば回避できると思うのですがACCESS初心者でコードの組み方がわかりません ご教授願えませんか

コード
Private Sub 見積書_Click()
Application.FollowHyperlink "サーバー名¥” & Me.注文書No & ".pdf"

A 回答 (1件)

sub xxx


on error goto errh
Application.FollowHyperlink "サーバー名¥” & Me.注文書No & ".pdf"
on error goto 0
・・・

exit sub
errh:
msgbox ”ハイパーリンク先が存在しません",vbokonly
end sub

http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6to …

実際にはエラートラップはどこで起きても対応させることが多いため、goto0 を使うことはあまりない。 エラーが起きた際に、その内容を識別してどのように処理するかを、errh:に書くことになる。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

QMS_AccessからPDFファイルを開く方法?

MS_Accessのメニュー画面(フォーム形式)から、PDFファイルを開く方法を教えて下さい。
因みにパソコン環境は、以下のとおりです。
 OS:WindowsXP_Professional
DB:MS_Access 2003
PDF:Word文書を「いきなりPDF_Professional」の「一括PDF出力」で    作成
以上です。よろしくお願いします。

Aベストアンサー

一番簡単なのはボタンのハイパーリンクアドレスを使う方法でしょう
ボタンを置きハイパーリンクアドレスにpdfの場所を設定してやります

QAccessのハイパーリンクをクリックしてもファイルが開かない

Accessでハイパーリンク型を設定して、そこにローカルのファイルまでの
絶対パスを記載しています。

絶対パスは作成したフォームのテキストボックスに記述されたパスを
VBAでUpdate文を利用してテーブルへ取りこんでいます。

その後、検索処理を行い作成した表形式のフォームに検索結果を表示します。
その際に、表示されたハイパーリンクをクリックすると該当ファイルが
開くようにしたいのですが、開くことができません。

文字列は青くなり、マウスカーソルも指型になっているのですが、
クリックしても何も反応がありません。

どなたか解決法を教えてください。
よろしくお願いいたします。

Aベストアンサー

> テキストボックスに記述されたパスをVBAでUpdate文を利用してテーブルへ

このUpdate文の記述はどうなっていますか。

ハイパーリンクのフィールド名を URL と仮定した時、
 ・・・ SET URL='" & Me.テキストボックス & "' ・・・・
となているところを、
 ・・・ SET URL='#" & Me.テキストボックス & "#' ・・・・

としてみるとどうなりますか。

QアクセスVBAのMe!と[ ]

基本的なことですみません。

アクセスのイベントプロシージャで、Me!ってありますけど、これはどういう意味なんでしょうか?

また、Me!の後に、Me!.~~と書く場合と、Me!.[~~]と書く場合がありますが、どこが違うのでしょうか?

Aベストアンサー

>プロシージャ内で[]を使う場合は、そのフォーム外のオブジェクトを使う場合と考えてよろしいでしょうか?
別のオブジェクトを使う場合だけではありません。
Hensu = Me![Text1]のようにHensuという変数に自身のTest1の値を代入する場合のように。
[]で括られているのがオブジェクト名やコントロール名だよという事。
クエリの抽出条件に存在しない[?]とすれば?というコントロール等が参照できないので?というダイアログが表示されるように?というオブジェクトやコントロールは何?と聞いてくるように。
>フォーム内のオブジェクトの場合はあくまでMe!で良いのでしょうか
Forms.[フォーム名]![コントロール名]やForms![フォーム名]![コントロール名]が構文。
アクティブなフォームが自分自身ならForms![フォーム名]の変わりにMeでもOKですという事。

と言う解釈の方が良いと思います。

QAccessでテーブルの値をテキストボックスに代入するには?

[ID][文字列]の2つのフィールドからなる単純なテーブルがあり、削除クエリを併用して常に最新のデータしか格納されていない状態に工夫できました。(データは常に1つ)
そこでフォーム上にあるテキストボックスにこのテーブルの[文字列]フィールドのデータを表示させたいのですが、
どうしたらよいでしょうか?

また、このテーブルの[文字列]フィールドのデータを直接変数として使いたい場合はVBAでどのように記述すればよいのでしょうか?

Aベストアンサー

テーブルに"データは常に1つ"ならコントロールソースに
「=DLOOKUP("文字列のフィールド名","テーブル名")」
IDごとに"データは常に1つ"ならコントロールソースに
「=DLOOKUP("文字列のフィールド名","テーブル名","[ID]='" & Me.ID & "'")」

Dlookup関数のヘルプ
http://office.microsoft.com/ja-jp/assistance/HP010496551041.aspx

Qレコードを保存するコード アクセスvba

アクセスですが
DoCmd.Save acForm, Me.Name
このコードはフォームを保存するコードですよね?
フォームではなく、レコードを保存するコードはありますか?

Aベストアンサー

フォームのカレントレコードの保存ということですよね。

Docmd.RunCommand acCmdSaveRecord

または、

Me.Refresh

でどうぞ。
Refresh は再読み込みも行われます。

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

Q【ACCESS】フォーム名/コントロール名を文字列型変数で指定するには

バージョン:Access2002

フォーム「frm01」にテキストボックス「tb01」が作ってある場合、
Forms.frm01.tb01.Value="あいう"
とすれば、フォームもコントロールも指定できるのですが、
Dim strTxt As String
strTxt = "tb01"
Forms.frm01.strTxt.Value="あいう"
だと、文字列型変数"strTxt"が展開されないのでフォーム「frm01」のコントロール「strTxt」を探してしまいエラーになってしまいます。

文字列型変数でフォームやコントロールを指定するには、どのようにすればよいのでしょうか?

Aベストアンサー

フォームの場合
 Forms(strFrm)

フォームのコントロールの場合
 Forms(strFrm).Controls(strTxt)


これでも参照できますが、普通ここまで省略しませんね。
 Forms(strFrm)(strTxt)

あとで見たとき、訳がわからなくなりそう。

QVBAにて、セルの内容と一致しない場合の処理

VBAを独学で学んでいる者です。
実力・知識がないながらも検索エンジンなどを頼りに頑張っています。

しかしながらどうしてもわからない事があり、煮詰まってしまいましたので、質問させていただきました。

当方、VBAにてIEを操作し、セルの内容を自動入力していくプログラムを書いています。

以下に記述しているものや、「document.body.innertext」で取得したIEの情報と書き込みたいセルの内容が一致しない場合にエラーメッセージを表示したいのですが、どうもうまくいきません。

If~Thenなどを使うことで条件分岐できるのだとはおもうのですが、当方の記述ですと条件を無視(?)してElseに飛んでしまいます。

当方が記述している内容は以下です。
(Cells(1, 1)には文字列を入力しています。)

~ここから~
'リンク情報からオブジェクトを探し.Clickする
For n = 0 To objIE.document.Links.Length - 1 'リンク数分まわす
Debug.Print objIE.document.Links(n).innertext 'デバックで表示する
'リンク先(.text)をチェックする(文字列比較する)
If objIE.document.Links(n).innertext = ActiveSheet.Cells(1, 1).Text Then
objIE.document.Links(n).Click '.Clickでクリックしてみた
Exit For '見つかったので強制的にループを抜ける
Else
MsgBox "NG!!", vbExclamation
Exit Sub
End If
Next

~ここまで~

Else
MsgBox "NG!!", vbExclamation
Exit Sub

を消すと、「For n = 0 To objIE.document.Links.Length - 1 」がinnertextを取得し、Cells(1, 1)の内容を読み取りクリックを実行してくれるのですが、Elseを入れると、Cells(1, 1)の内容と一致しているにも関わらず、Elseへ移行し、NGのメッセージボックスが出てきます。

記述が間違っているのでしょうか?
何か他の記述がございますようでしたらご教授願えますでしょうか?

宜しくお願い致します。

VBAを独学で学んでいる者です。
実力・知識がないながらも検索エンジンなどを頼りに頑張っています。

しかしながらどうしてもわからない事があり、煮詰まってしまいましたので、質問させていただきました。

当方、VBAにてIEを操作し、セルの内容を自動入力していくプログラムを書いています。

以下に記述しているものや、「document.body.innertext」で取得したIEの情報と書き込みたいセルの内容が一致しない場合にエラーメッセージを表示したいのですが、どうもうまくいきません。

If~Th...続きを読む

Aベストアンサー

またまた登場です。

少々の理解力はあるつもりなんですが、今回はどうもいまいちやりたいことがわかりかねます。。(^^;;;

ようするに次のようなことですか?

 Cells(lineIndex, 1)の内容が、Linksオブジェクトの中になければ、エラーメッセージを表示して、プロシージャを終了する。
 
'-------------------------------------------------
 For n = 0 To objIE.document.Links.Length - 1
   If objIE.document.Links(n).innertext = ActiveSheet.Cells(lineIndex, 1).Value Then

    ●有った時の処理●
    Exit Sub

   End If
 Next

'ここへ抜けたということは、該当のものがなかったということなので

   MsgBox "NG!!", vbExclamation

End Sub
'--------------------------------------

Forで、Linksコレクションの中を全部探して、Forを抜けたら、該当データはなかったことになる


コードを小出しにされてるのでアドバイスできるのはこの程度です。

こういった類の質問は、

  実際のデータを提示
  実際のコードを全て提示
  そして、やりたいことを箇条書きにする

これらのことを提示されると解決が早いと思われます。
また他の方からもよりよい回答が寄せられると思います。

やりたいことの全貌は見えませんが、何かしら面白そうなことをやっていそうなので、ちょと興味あり。
で、30分ごとに覗いて見ませう。。
 

またまた登場です。

少々の理解力はあるつもりなんですが、今回はどうもいまいちやりたいことがわかりかねます。。(^^;;;

ようするに次のようなことですか?

 Cells(lineIndex, 1)の内容が、Linksオブジェクトの中になければ、エラーメッセージを表示して、プロシージャを終了する。
 
'-------------------------------------------------
 For n = 0 To objIE.document.Links.Length - 1
   If objIE.document.Links(n).innertext = ActiveSheet.Cells(lineIndex, 1).Value Then

    ...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QAccess 条件に合うレコード数をカウントできません

下のようなクエリ結果を出す方法がわかりません。
Excelのcountif()のような関数はないのでしょうか?

●テーブル
日付 名前  売上
1/1 山口高   0
1/1 浅野   500
1/1 新美  1,000
1/2 山口高   0
1/2 浅野  1,000
1/2 新美  2,000
1/3 山口高 3,000
1/3 浅野  2,000

●クエリ: 1,000円以上売り上げた日数は?
   出勤数 1,000円以上の日数
山口高 3    1
浅野  3    2
新美  2    2

抽出条件: >= 1000
集計: カウント
としても、出勤数と同じ値で出力されてしまいます。
●正しくない現状
   出勤数 1,000円以上の日数
山口高 3    3
浅野  3    3
新美  2    2


1,000円以上の日数だけを抽出するクエリを、別に用意しなければならないのでしょうか?

Aベストアンサー

まず、「名前」の集計欄は「グループ化」、「日付」の集計欄は「カウント」のままでOKとします。
で、「売上」が1000円以上の時に"1"とするフィールドを設けて、内容を下記のようにします。

フィールド: → 「 1000以上日数: IIf([売上]>=1000,1,0) 」
集計: → 「合計」

このフィールドは[売上]が1000以上のときに"1"が立ちますので、それの合計を求めることで日数の合計とします。

こんな感じでしょうか(^^)


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング