• ベストアンサー

Accessのクエリとモジュールで…

モジュールは以下のようになっています。 Public Function HanName(Han As String) If [Han] <> "" Then HanName = DLookup("[班名]", "[T_班]", "[班ID]=" & [Han]) Else HanName = "" End If End Function クエリの フィールド1に[班1]というフィールドがあり、 フィールド2に HanName([班1]) といれました。 班1が入力されているものについては、きちんと動作されるのですが、 班1が空欄の場合、#Errorとなってしまいます。 どのように直せばいいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • paz777
  • ベストアンサー率47% (77/163)
回答No.4

こんにちは。 エラーですか・・・ ではフィールド2の式を =IIf(IsNull([班1]),"",HanName([班1])) にしてみる。 または、Functionの引数の形式を[String]から[Variant]にして[IsNull]判定を入れてみる。 ではどうでしょうか? ではでは・・・

w-inty
質問者

お礼

回答ありがとうございます。 とりあえず式を入力したところ無事できたようです。 ありがとうございます。 >または、Functionの引数の形式を[String]から[Variant]にして[IsNull]判定を入れてみる。 というのは、形式を変更して後は普通にモジュールをかけばいいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • paz777
  • ベストアンサー率47% (77/163)
回答No.5

正常に動作したようで安心しました。 >>または、Functionの引数の形式を[String]から[Variant]にして[IsNull]判定を入れてみる。 > >というのは、形式を変更して後は普通にモジュールをかけばいいのでしょうか? はい。その通りです。 あれ?回答欄を読み返してみたら#3の方の回答と同じでした。 #3の方の方法はお試しになりましたでしょうか? (式の変更ではなく、モジュールの変更の方です)

w-inty
質問者

お礼

回答ありがとうございます。 >あれ?回答欄を読み返してみたら#3の方の回答と同じでした。 >#3の方の方法はお試しになりましたでしょうか? そこの部分、見落としてました…(恥) 今試してみたら無事できました! ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • Gin_F
  • ベストアンサー率63% (286/453)
回答No.3

> Public Function HanName(Han As String) > > If [Han] <> "" Then Public Function HanName(Han As Variant) If Not IsNull(Han) Then で大丈夫だと思います。 ただ、このぐらいなら、式を直接クエリに入れてもいいような。。 Nz(DLookup("[班名]", "[T_班]", "[班ID]=" & [班1]),"")

w-inty
質問者

お礼

回答ありがとうございます。 実はIsnullバージョンというか、これも自分でやってみたんですが、できなかったんです。 それと式にしなかったのは、これの後にも続くからなんです。 ありがとうございました。

w-inty
質問者

補足

状態を詳しく書くと、 合計    班1    班2  … -------------------------------------- #Error #Error #Error ○○    ○○ #Error #Error というようになっています。 この「#Error」の部分を空欄にしたいんですが…。

全文を見る
すると、全ての回答が全文表示されます。
noname#21585
noname#21585
回答No.2

Public Function HanName(Han As String)   If isNull(Han) = False Then     HanName = DLookup("[班名]", "[T_班]", "[班ID]=" & Han)   Else     HanName = ""   End If End Function 動作確認していませんので動かなかったらごめんなさい。

w-inty
質問者

お礼

回答ありがとうございます。 試してみましたが、エラーになってしまいました…。 原因が自分でもわかりません(><)

全文を見る
すると、全ての回答が全文表示されます。
  • paz777
  • ベストアンサー率47% (77/163)
回答No.1

こんにちは。 「If [Han] <> "" Then」の前にNull判定を行えば良いように思います。 例) ------------------------------------------------- If IsNull([Han]) Then HanName = "" else If [Han] <> "" Then   ・・・ End If ------------------------------------------------- お試しください。

w-inty
質問者

お礼

回答ありがとうございます。 試してみましたが、エラーになってしまいました…。 原因が自分でもわかりません(><)

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Access クエリで変数を参照するとき

    モジュールのPublic変数をクエリから参照するとき、 Public Function getdata() As Integer getdata = 1 End Function と記述しておけき、 クエリの抽出条件をgetdata()にしておくと クエリの抽出条件に 「1」 と書いたのと同じになりますが、 クエリの抽出条件の欄に「1 Or 2 Or 3」とした時と同じ状況を作りだしたい時、 モジュールの方には Public Function getdata() As Integer  getdata = 1 Or 2 Or 3 End Function 「・・・・Integer」ではマズイわけで、なんと記述したらよいか教えて下さい。

  • ACCESS2000

    Option Compare Database Public Function RoundDown(X As Double, s As Integer) As Double Dim t As Integer t = 10 ^ Abs(s) If s > 0 Then RoundDown = Int(X * t) / t Else RoundDown = Int(X / t) * t End If End Function というモジュールをつかって値の切り捨てをおこなっていましたが、マイナスの値がうまく動きません。 どなたか教えていただけないでしょうか。

  • 実行エラー 3075:クエリ式`作成日 の間#2010/10/01# 

    実行エラー 3075:クエリ式`作成日 の間#2010/10/01# AND #2010/10/30#の構文エラー:演算子というエラーの処理をどうすればいいか分かりませんので教えてほしいです。 Private Sub cmdFilter_Click() Dim strSQL As String Dim strCriteria As String With Me If Len(.cboFieldName) <> 0 Then If Len(.cboCondition) <> 0 Then strCriteria = BuildCriteria(.cboFieldName.Column(0), _ .cboFieldName.Column(1), .cboCondition, _ Nz(.txtValue1), Nz(.txtValue2)) End If End If End With With Me ここはエラー→ .Filter = strCriteria .FilterOn = True .Requery End With Private Function BuildCriteria(strFieldName As String, _ intType As Integer, _ strCondition As String, _ varValue1 As Variant, _ Optional varValue2 As Variant) As String Dim fBetween As Boolean Dim fLike As Boolean Dim strCriteria As String Const conQuotes = """" fBetween = IIf(InStr(strCondition, "の間") > 0, _ True, False) fLike = IIf(InStr(strCondition, "類似") > 0, _ True, False) strCriteria = strFieldName & " " Select Case intType Case dbText, dbMemo If InStr(1, varValue1, "*") > 0 Then strCriteria = strCriteria _ & " Like " & conQuotes & varValue1 & conQuotes Else If fLike Then strCriteria = strCriteria & " 類似 " _ & conQuotes & "*" & varValue1 & "*" & conQuotes Else strCriteria = strCriteria & strCondition _ & " " & conQuotes & varValue1 & conQuotes End If End If Case dbInteger, dbLong, dbCurrency, dbDouble, dbSingle If fBetween Then strCriteria = strCriteria _ & strCondition & " " & varValue1 & " AND " & varValue2 Else strCriteria = strCriteria _ & strCondition & " " & varValue1 End If Case dbDate If fBetween Then strCriteria = strCriteria & strCondition _ & " #" & Format(varValue1, "yyyy/mm/dd") & "# AND #" _ & Format(varValue2, "yyyy/mm/dd") & "#" Else strCriteria

  • Access Dlookup関数について

    Dlookupで悩んでいます。 ExcelのVlookと違い、“数字”のコードでなければ引っ張ってこれないのでしょうか? 以下、がその内容です。 「T_得意先マスタ」の得意先コードフィールドに aaa というコードがあり、得意先名フィールドに ○○商事 とあります。 どうやってもできないのです。 なぜか、aaa ではなく、数字(例. 123)にすると出ます。 教えてください。 Private Sub 得意先コード_AfterUpdate() Dim a As Variant, b As String b = "得意先コード = " & Me![得意先コード] a = DLookup("得意先名", "T_得意先マスタ", b) If IsNull(a) = True Then Me.テキスト1.Value = "該当がありません。": Me![得意先コード] = Null Else Me.テキスト1.Value = a End If End Sub

  • accessのvbaで中国語の印字幅取得

    accessに格納している日本語と中国語の文字列に関して 半角文字10文字分の印字幅に収まるかどうか判定したいのです 以下のような関数を作ってみて クエリからこの関数を呼び出してみたのですがうまくいきませんでした function 判定(s as string) as boolean if lenb([名称])>10 then 判定=false else 判定=true end if では判定できなかったので・・・ 何かいい手段はあるでしょうか? アドバイスお願い致します

  • AccessVBAの標準モジュール

    標準モジュール Public PSwMdel As Boolean Public Function PMsgDel() If (MsgBox("削除してよろしいですか?", 1 + 48 + 256, "削除処理確認メッセージ゛") = vbOK) Then PSwMdel = True Else PSwMdel = False End If End Function と作成し、削除前の確認処理を共通で使えるようにしています。 (メッセージボックスでOKを押すとPSwMdelがTrueになって削除モジュールが動くようにする) 普通は全く問題なくモジュール通りに動くのですがここ最近急に正しく動かないものが出てきました 普段フォーム内のモジュールで Call PMsgDel If PSwMdel = True Then  ~以下削除処理~ END IF としているのですがメッセージボックスでOKを押しても削除が実行されなかったのです おかしいと思いブレークポイントで確認するとOK押した後PMsgDel内ではPSwMdel = True フォームモジュールに戻るといきなりPSwMdel = Falseに変わってしまいIF後の削除処理を通っていませんでした また、PSwMdelをウォッチ式に入れて確認もしてみたのですがOKを押した後は ずっとTrueのまま変わっていませんでした 今まで何年も同じようなコードを使用していますがこんな事は一度も無かったので困惑しています どうすればOK押した後でも確実にPSwMdel = Trueを元のフォームモジュールに持って行けるのでしょうか?

  • 「クエリが閉じてるなら」「クエリが開いてるなら」

    Sub test() If クエリが閉じてるなら Then  DoCmd.OpenQuery "クエリ1" ElseIf クエリが開いてるなら Then  DoCmd.Close acQuery, "クエリ1" End If End Sub という事をやりたいのですが、 「クエリが閉じてるなら」 「クエリが開いてるなら」 のコードがわかりません。 よろしくお願い致します。

  • クラスモジュールの処理

    VB6.0で開発しています。 以下のようにクラスモジュールを作ったのですが フォームでコマンドボタンを押したら 処理されるようにしたいのですが どうすればいいかわかりません。 教えてください。 Class CExcel Public App Public WshShell Public ErrDescription Private WorkBook Public CurBook Private Sub Class_Initialize() Call InitSetting() End Sub Private Sub Class_Terminate() Call Quit() End Sub Public Default Function InitSetting() if IsEmpty( App ) then Set App = CreateObject("Excel.Application") end if if IsEmpty( WshShell ) then Set WshShell = CreateObject("WScript.Shell") end if App.DisplayAlerts = False Set CurBook = Nothing end function Public Function Quit() If not IsEmpty( App ) Then For Each Workbook In App.Workbooks WorkBook.Saved = True Next App.Quit Set App = Nothing App = Empty Set CurBook = Nothing End If End Function Public Property Let Visible( bFlg ) App.Visible = bFlg End Property Public Property Get Visible Visible = App.Visible End Property Public Function Open( strPath ) on error resume next Set Open = App.Workbooks.Open(strPath) if Err.Number <> 0 then Set Open = Nothing ErrDescription = Err.Description Exit Function end if on error goto 0 Set CurBook = Open ' アクティブなウィンドウを最大化 App.ActiveWindow.WindowState = xlMaximized End Function Public Function Create( strPath ) Dim nBooks App.Workbooks.Add nBooks = App.Workbooks.Count Set Create = App.Workbooks( nBooks ) Set CurBook = Create CurBook.Activate App.ActiveWindow.WindowState = xlMaximized if strPath <> "" then on error resume next CurBook.SaveAs( strPath ) if Err.Number <> 0 then MsgBox( Err.Description ) Exit Function end if on error goto 0 end if End Function Public Function Close( MyBook ) if IsObject( MyBook ) then MyBook.Saved = True MyBook.Close Set MyBook = Nothing MyBook = Empty else if CurBook is Nothing then else CurBook.Saved = True CurBook.Close Set CurBook = Nothing end if end if End Function Function Save( MyBook ) if IsObject( MyBook ) then MyBook.Save else CurBook.Save end if End Function Function SaveAs( MyBook, strPath ) if IsObject( MyBook ) then MyBook.SaveAs strPath else CurBook.SaveAs strPath end if End Function Function Load( strPath ) if not IsEmpty( App ) then MsgBox( "Excel をロードする前に、Quitを実行して下さい   " ) Exit Function end if Call WshShell.Run( _ "RunDLL32.EXE shell32.dll,ShellExec_RunDLL " & _ strPath _ ) End Function End Class

  • VBA クラスモジュールの使い方わかりません。

    為替データで検証中なのですがネットで使いたいクラスモジュールがあり、値の渡し方などわからなくて困ってます。 過去1ヶ月のデータで日付、始値、高値、安値、終値並んでいる値を標準モジュールからTRと言う名のクラスモジュールに渡して計算したいのですがわかりません。 標準モジュールのみで簡単なマクロを作れるレベルです。 下がTRクラスモジュールです。 どなたかお助けください。 Option Explicit Public Version As Long Public Description As String Public NumInSequences As Long Public NumParams As Long Private Sub Class_Initialize() Version = &H10000 Description = "TR(真のレンジ)" NumParams = 0 NumInSequences = 4 End Sub Public Sub Calc(A() As Double, O() As Double, H() As Double, L() As Double, C() As Double) Dim I As Integer Dim LastClose As Double '前日の終値 For I = LBound(A) To UBound(A) If C(I) = Invalid Then A(I) = Invalid GoTo NextElem End If Dim D1 As Double '今日の高値と安値の差 Dim D2 As Double '前日の終値から今日の高値までの差 Dim D3 As Double '前日の終値から今日の安値までの差 If LastClose = Invalid Then A(I) = Invalid LastClose = C(I) GoTo NextElem End If ' 3つのパターンのレンジを計算 D1 = H(I) - L(I) D2 = H(I) - LastClose D3 = LastClose - L(I) If D1 > D2 Then A(I) = D1 Else A(I) = D2 End If If (A(I) < D3) Then A(I) = D3 End If LastClose = C(I) NextElem: Next End Sub

  • ACCESSの抽出条件更新方法について

    アクセス素人です。 お世話になります。 質問番号:2664266で 複数のクエリーの条件を一括で変更する場合 モジュールで関数を作ることで下記のように解答されています。 >クエリーの条件に >=GetWhere() >とでもしておいて、 >モジュールのほうで、 >Public Function GetWhere() As String >Dim strWhere As String >strWhere = "#2007/1/1#" >GetWhere = strWhere >End Function 上記は日付についてでありますが クエリーの条件が数値型で、たとえば事業所コードを 複数選択したいときは"#2007/1/1#"の所は どのように記述すればいいのでしょうか。 クエリーに直に条件を入れるときのように strWhere = "1010" or "2010" or "3010" と記述してみましたがうまくいきません。 ご教授お願いします。

専門家に質問してみよう