Access2000で検索フォームを作っています。
フォームには、「下限」、「上限」と名前をつけたテキストボックスを2つ配置、
どちらも書式は数値型にしています。
このテキストボックスに入力した数字の範囲のレコードを抽出し、
結果を別のフォーム(「結果」)に出したいと考えてます。
そのため、以下のようなコードを書きました。

Private Sub 抽出_click()
On Error GoTo err_抽出_click
Set db = CurrentDb
Set rs = db.OpenRecordset("対象年齢", dbOpenDynaset)

rs.Filter = "対象年齢ID Between Me!下限 And Me!上限"
Set rs = rs.OpenRecordset

DoCmd.OpenForm "結果", , , , acFormReadOnly

rs.Close

exit_抽出_click:
Exit Sub

err_抽出_click:
MsgBox Err.Description
Resume exit_抽出_click

End Sub

「結果」フォームは対象年齢テーブルを基にしています。
これを実行すると、「パラメータが少なすぎます。3を指定してください。」という
メッセージが出てしまうのですが、

Private Sub 抽出_click()
On Error GoTo err_抽出_click

DoCmd.OpenForm "結果", , , "[対象年齢ID] Between [Forms]![検索]![下限] And [Forms]![検索]![上限]", acFormReadOnly

exit_抽出_click:
Exit Sub

err_抽出_click:
MsgBox Err.Description
Resume exit_抽出_click

End Sub

だと実行できます。
条件がこれ1つならば、下を使うのですが、
実際には、データ型の異なる複数の条件のAND検索を行うため、
上のようなものにしたいと考えています。
一体どうすれば、動くようになるのでしょうか?
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

Filterの値が"対象年齢ID Between Me!下限 And Me!上限" だと


対象年齢ID が'Me!下限'と'Me!上限'という文字列の間となってしまいます。
Filterの値を"対象年齢ID Between " & Me!下限 & " And " & Me!上限
としたらどうでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます!
無事に動きました。
VBAの基本的なことも分からず、プログラムを組むことになってしまい、
右往左往しているところです。
また、なにかありましたら、よろしくお願いします。

お礼日時:2001/12/16 02:47

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

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

QVBAからクエリのパラメータを設定したいです。

いつもお世話になっております。

クエリーは全く同じ内容ですが、
複数のフォームにパラメータを入力するユーザーインターフェースのため、ク
エリーを複数用意して、それぞれに
[forms]![F_TEST]![テキスト名]というパラメータを設定し、フォームの帳票やレポートの帳票に出力していま
した。

このクエリを一本にして、VBAから動的にパラメータを参照するフォームを指定
できないでしょうか?

よろしくお願いいたします。

Aベストアンサー

再びmaruru01です。
既存のクエリもVBAのSQLステートメント化をお奨めします。
それを標準モジュールに、

Public Sub myRunSQL(Para As String)

  Dim SQL As String

  SQL = "(SQL文の前の方)" & Para & "(SQL文の後ろの方)"
  DoCmd.RunSQL SQL

End Sub

という風にそれぞれのクエリを各プロシージャにしておけば、どこからでも呼び出せるわけです。
すでに作ってあるクエリを書き直すのは面倒ですが、一度書いてしまえばあとは楽です。
また、まったく同じじゃないんだけど結構似てるというクエリは、プロシージャをコピーして名前と中身をかえてやればすぐ出来るわけです。
ちなみに私は、基本的には、クエリもマクロも使用せず、すべてVBAで書いています。
では。

Qaccess レコードソースを選択し、DoCmd.OpenFormする方法

Select Caseのフレームで、レコードソース(クエリ)を選択し、
そのソースを基にDoCmd.OpenFormする方法がわかりません。
よろしくお願いします。
----------------------------------------------------
Dim strSource As String
Dim Q1, Q2 As String
Dim stDocName As String
Dim フォーム1 As Form
stDocName = "フォーム1"
Q1 = "クエリ1"
Q2 = "クエリ2"

Select Case フレーム1
Case 1
strSource = Q1
Case 2
strSource = Q2
End Select

'stDocName.RecordSource = strSource '-----この文はこの位置でよいのでしょうか?
DoCmd.OpenForm stDocName, acFormDS
----------------------------------------------------
クエリ1,クエリ2は基になるテーブルが違いますが、フィールドは同一にしてあります。
ですのでフォーム1には、対応するテキストボックスは用意してあります。

Select Caseのフレームで、レコードソース(クエリ)を選択し、
そのソースを基にDoCmd.OpenFormする方法がわかりません。
よろしくお願いします。
----------------------------------------------------
Dim strSource As String
Dim Q1, Q2 As String
Dim stDocName As String
Dim フォーム1 As Form
stDocName = "フォーム1"
Q1 = "クエリ1"
Q2 = "クエリ2"

Select Case フレーム1
Case 1
strSource = Q1
Case 2
strSource = Q2
End Select

'stDocName.RecordSo...続きを読む

Aベストアンサー

<1>

Private Sub コマンド0_Click()
  DoCmd.OpenForm "フォーム1", acFormDS
  Forms("フォーム1").RecordSource = "クエリ" & Me.フレーム1
End Sub

<2>

Private Sub コマンド1_Click()
  DoCmd.OpenForm "フォーム1", acFormDS, , , , , "クエリ" & Me.フレーム1
End Sub

' ------------------------------------------
' [フォーム1] ロード時にレコードソース設定
' ------------------------------------------
Private Sub Form_Load()
  If Len(Me.OpenArgs & "") > 0 Then
    Me.RecordSource = Me.OpenArgs
  End If
End Sub

まあ、好き好きでしょうが<2>がOKのバージョンであれば<2>がお勧めです。

<補足>

ただ、WhereCondition を使うのが一般的かと思います。
全く異なるクエリであれば、それぞれに対応したフォームを用意した方がシンプルでは・・・。

<1>

Private Sub コマンド0_Click()
  DoCmd.OpenForm "フォーム1", acFormDS
  Forms("フォーム1").RecordSource = "クエリ" & Me.フレーム1
End Sub

<2>

Private Sub コマンド1_Click()
  DoCmd.OpenForm "フォーム1", acFormDS, , , , , "クエリ" & Me.フレーム1
End Sub

' ------------------------------------------
' [フォーム1] ロード時にレコードソース設定
' ------------------------------------------
Private Sub Form_Load()
  If Len(Me.OpenArgs & "") > ...続きを読む

QAccessの演算フィールドでのパラメータ設定について教えて下さい

Accessについて質問です。クエリで「金額:[価格]*[数量]」などの演算フィールドで、パラメータを使って抽出しようと「>=[金額を入れる]」のような条件を設定しました。すると、パラメータに10000と入力すると、10000以上のものが抽出はされますが、1000以上のものまで抽出されてしまいます。どうも先頭の数字に反応しているようです。どういうことなのでしょうか?どなたかよろしくお願いします。

Aベストアンサー

>価格フィールドは通貨型、数量フィールドは数値型なのです
で、演算は掛け算だけですか?
関数を使っていたりすると戻される型が変わってしまうということもありますよ

式のほうは数値型で間違いなければ
パラメータのデータ型を指定してやってください

クエリデザインビューなら[クエリ][パラメータ]で
パラメータのデータ型指定ができます

QVBAで指定したパスが存在しなければ、アラートを表示させずにExit Subの処理をしたい

Sub s()
Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate ("X:")
End Sub

上記のVBAを実行するとXドライブがなければ
「'file:///X:' が見つかりません。パスまたはインターネットアドレスが正しいかどうかを確認してください。」と表示されます。
指定したパスが存在しなければ、このメッセージを表示させずにExit Subの処理をするようにするにはどうすればよいのでしょうか?

使用OS:Windows XP
使用ソフト:Microsoft Excel 2003

ご存知の方がおられましたらご回答をよろしくお願いします。

Aベストアンサー

こんばんは。
インターネット共用となると、以下のコードでは中途半端になりますが、以下のように区分けは出来ます。


'---------------------------
  Dim fso As Object
  Dim objIE As Object
  Dim flg As Boolean
  Const mDrive As String = "C:"
  If InStr(1, mDrive, "HTTP://", vbTextCompare) = 0 Then
    Set fso = CreateObject("Scripting.FileSystemObject")
    flg = fso.DriveExists(mDrive)
    If flg Then
      Set objIE = CreateObject("InternetExplorer.Application")
      objIE.Navigate mDrive
    End If
    Set fso = Nothing
    Set objIE = Nothing
  End If
'---------------------------

こんばんは。
インターネット共用となると、以下のコードでは中途半端になりますが、以下のように区分けは出来ます。


'---------------------------
  Dim fso As Object
  Dim objIE As Object
  Dim flg As Boolean
  Const mDrive As String = "C:"
  If InStr(1, mDrive, "HTTP://", vbTextCompare) = 0 Then
    Set fso = CreateObject("Scripting.FileSystemObject")
    flg = fso.DriveExists(mDrive)
    If flg Then
      Set objIE = CreateObject("Inte...続きを読む

Qパラメータの入力ダイアログボックスに入力規則を設定したいのですが。

WinXP,Access2002使用しています。
入力された日付以前のデータを抽出するパラメータクエリを作りました。このパラメータの入力ダイアログボックスに年月日を入力する際、「2007/02/06」と入力するのは面倒なので、(効率化のため)「070206」と入力して「2007/02/06」となるように入力規則を設定したいんです。
パラメータの入力ダイアログボックスに入力規則を設定する方法をおしえてください!!!よろしくおねがいします!!!

Aベストアンサー

そのような機能はありません
やりたければ自分で入力用のフォームを作るしかありません

そもそも
>「2007/02/06」と入力するのは面倒なので、(効率化のため)
>「070206」と入力して「2007/02/06」となるように
初心者からよくでる質問ですが、こんなところに力を注ぐのは
あまり意味のないことですね

西暦を2桁で表すのも余計なトラブルを生み出す元ですよ

QVBA Private Sub Worksheet_Calculate()

「ユーザー定義関数」で計算されるセルがセルB2にある場合、シートモジュールの
Private Sub Worksheet_Calculate()で、他の再計算は無視し、そのユーザー定義関数が計算されたことを判断するためにはどのような記述をすればいいのでしょうか?

Aベストアンサー

こんにちは。

大分梃子摺っていらっしゃいますね。
今回のコードでシート名の変更を捕らえたければ
Calculateイベントではなく
ユーザー定義関数そのものでやったらどうですか。

間違いなくする為に、新しいブックで以下のコードをテストしてください。


簡単の為に、"sheet1"だけの変更に対応。

---------------------------------------------
(標準モジュール)


Public OldName As String 'パブリック変数


Function Sheetname(ByVal Target As Range) As String

 Application.Volatile
 Sheetname = Target.Parent.Name

 If OldName = "" Then
   OldName = Sheetname
 End If

 If OldName <> Sheetname Then
  MsgBox OldName & "が " & Sheetname & " に変更されました"
  OldName = Sheetname
  End If

End Function
---------------------------------------------

コードを書いたあと、Sheet1のA1に、=sheetname(A1) を入れておく


ようは、以前のシート名を保持しておき
ユーザー定義関数が再計算されるとき比較するだけです。

もちろん、Calculateイベントで同様のことをしてもOKですよね。

何回も言うようですが、このサンプルは、ユーザー定義関数の入っている、シート1つだけに対応です。

全てのシートに対応したい場合は、ちょっと考えてみてください。
以上です。
 

こんにちは。

大分梃子摺っていらっしゃいますね。
今回のコードでシート名の変更を捕らえたければ
Calculateイベントではなく
ユーザー定義関数そのものでやったらどうですか。

間違いなくする為に、新しいブックで以下のコードをテストしてください。


簡単の為に、"sheet1"だけの変更に対応。

---------------------------------------------
(標準モジュール)


Public OldName As String 'パブリック変数


Function Sheetname(ByVal Target As Range) As String

 Application...続きを読む

QAccess2000で、パラメータの設定をしたときに。

ACCESS2000を勉強しています。
クエリを作成したときにパラメータの設定をして、たびたびの抽出を簡易にしようというところまできたのですが、疑問が出てきました。

パラメータの入力を求めるダイアログボックスが出てきたときに、そのダイアログボックスに入力する値の制限や、書式の限定をすることはできるのでしょうか?
もし、できるのならどうすればいいのでしょうか?
自分だけが入力するわけではない場合、入力値が制限外のものの場合、alertメッセージが出てくるようなカンジにしてみたいのですが。。。

ご存知でしたら教えて下さい。

Aベストアンサー

パラメータクエリーでは入力規則制限・メッセージはできないと思います。

ご自身しか使わない場合は、クエリーのパラメーターを使う方法でもいいかと思いますが、他の方も使う場合はフォームで条件を入力させてその値を抽出条件にした方がフォーム上で入力規則のチェックも出来ますし、
操作ミスが少ないのでいいと思いますよ。

クエリーの抽出条件で=Forms![F_条件指定]![条件1]
などと記述するだけです。

Q[Access VBA] DoCmd.OpenForm ...の書式について(VBAに詳しい方求む!)

仕事でAccessを使用しています。
帳票管理のデータベースを作ってて
帳票名フィールドに各種の帳票の名前が格納されています。
ここはコンボボックスにしてあり、データベース化する
対象の帳票も決まってます。
メインのフォームには帳票の基礎データを入力し
フォーム上に作ったボタン(ボタン名「詳細記録」)を押すことで
各帳票の詳細な記録を書きこむフォームが現れるように設計する予定です。

そこで、メインのフォームに設けたボタンの
「クリック時」のイベントプロシージャに以下の記述をしました。

Private Sub 詳細記録_Click()
DoCmd.OpenForm 帳票名
End Sub

ボタンをクリックした時点で帳票名フィールドに記載されている
帳票の詳細記録フォームがたちあがります。
例えば帳票名フィールドが
「AA」の時→ボタンClick→AAの詳細記録フォームが立ちあがる。
「BB」の時→ボタンClick→BBの詳細記録フォームが立ちあがる。
(企業秘密のため具体的な帳票名を書けません。)

実はこのような動作をしてくれるのが目的だったのですが
疑問があるんです。
それより前には、上述のと1箇所だけ記述がいろいろ変えてました。

DoCmd.OpenForm "帳票名"

帳票名のところがダブルクォーテーションでくくってあるかないか
の違いです。
くくるとエラーが出ますが、くくらないとうまく行きます。

[帳票名]のときもうまく行きましたが、"[帳票名]" はだめのようです。

また、" "の中を具体的な帳票の名前にすると
(例:DoCmd.OpenForm "AA")
いつでもそのAAフォームだけがたちあがります。
(帳票名フィールドの記述がBBでも)

たまたまダブルクォーテーションをはずすと
うまく反応してくれたんでよかったんですが
ダブルクオーテーションひとつで
なぜこんなに動きが違うのか?
わかる方よろしくお願いします。

仕事でAccessを使用しています。
帳票管理のデータベースを作ってて
帳票名フィールドに各種の帳票の名前が格納されています。
ここはコンボボックスにしてあり、データベース化する
対象の帳票も決まってます。
メインのフォームには帳票の基礎データを入力し
フォーム上に作ったボタン(ボタン名「詳細記録」)を押すことで
各帳票の詳細な記録を書きこむフォームが現れるように設計する予定です。

そこで、メインのフォームに設けたボタンの
「クリック時」のイベントプロシージャに以下の記述をし...続きを読む

Aベストアンサー

文字列と要素名との使い分けで混乱なさってるようですね。

ダブルクォーテーションで括るのは、「ソースコード中に直接、文字列を記述する」場合のみです。

'テキストボックスに「こんにちは」と表示する
MsgBox "こんにちは"

この例では、MsgBox命令に対して、「こんにちは」という文字列を渡しています。

Dim Message as String
Message = "こんにちは"
MsgBox Message

この例では、Message という変数に「こんにちは」という文字列を代入し、MsgBox命令にMessage という変数を渡しています。
Messageは変数であって文字列ではないため、ダブルクォーテーションで括る必要がないのです。

DoCmd.OpenForm でも同様。

DoCmd.OpenForm "帳票A"
は、「帳票A」という文字列をDoCmd.OpenForm命令に渡しています。


帳票フィールドに「帳票A」という文字が格納されているとき、

DoCmd.OpenForm Me![帳票フィールド]

とすると、DoCmd.OpenFormに渡されるのは「Me![帳票フィールド]」という文字列ではなく、帳票フィールドに格納されている「帳票A」という文字列が渡されるのです。

尚、この命令文は

Dim Chouhyou As String
Chouhyou = Me![帳票フィールド]
DoCmd.OpenForm Chouhyou

とするのと同じです。

あんまりいい説明じゃないかもしれませんが、VBA理解の一助にでもなれば幸いです。

文字列と要素名との使い分けで混乱なさってるようですね。

ダブルクォーテーションで括るのは、「ソースコード中に直接、文字列を記述する」場合のみです。

'テキストボックスに「こんにちは」と表示する
MsgBox "こんにちは"

この例では、MsgBox命令に対して、「こんにちは」という文字列を渡しています。

Dim Message as String
Message = "こんにちは"
MsgBox Message

この例では、Message という変数に「こんにちは」という文字列を代入し、MsgBox命令にMessage という変数を渡しています...続きを読む

QReportViewerでのパラメータ設定

ReportViewer を使用して、SQL Server Reporting Service
のReportsを、Webフォーム上に表示しようとしています。
サーバーレポートとして構築したReportsは、レポート
パラメータ(内部)があるため、Webフォーム上で指定
された値を、パラメータとして渡す必要があります。

MSDNのサイトには以下のような記述があり、パラメー
タを渡すことは可能なようなのですが、具体的な記述
方法の記載がなく困っています。

================================================
レポート パラメータの組み込みサポートにより、静的
な値に基づく結果セットの条件付き書式とフィルタの機
能が提供されます。

クエリ パラメータやレポート パラメータに対するユー
ザーからの入力を実行時に受け取るには、アプリケーシ
ョンでそれをサポートするためのコードを記述する必要
があります。

http://msdn.microsoft.com/ja-jp/library/ms345248.aspx

================================================

実現されている方がお見えになったら、ご教授願えない
でしょうか?

ReportViewer を使用して、SQL Server Reporting Service
のReportsを、Webフォーム上に表示しようとしています。
サーバーレポートとして構築したReportsは、レポート
パラメータ(内部)があるため、Webフォーム上で指定
された値を、パラメータとして渡す必要があります。

MSDNのサイトには以下のような記述があり、パラメー
タを渡すことは可能なようなのですが、具体的な記述
方法の記載がなく困っています。

================================================
レポート パラメータの組み込み...続きを読む

Aベストアンサー

難しくはないです。まあ、コードを見た方が早いですよね。
問題はおきてないです。

Dim parm As New Generic.List(Of ReportParameter)
parm.Add(New ReportParameter("パラメータ名", "パラメータ値", False))
parm.Add(New ReportParameter("パラメータ名", "パラメータ値", False))

With myReportViewer
.ServerReport.ReportServerUrl=(サーバURI)
.ShowParameterPrompts = False
.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote
.ServerReport.ReportPath = "レポートパス"
.ServerReport.SetParameters(parm)
End With

QVisibleとOpenFormは意味が同じ?

データベースにフォームが1つあります。

標準モジュールに
Sub Visible()
Form_フォーム1.Visible = True
End Sub

Sub OpenForm()
DoCmd.OpenForm "フォーム1"
End Sub

を作り、どちらも実行させても同じ動きをします。(フォームが開きます)
この二つは同じ動きをすると思っていいのでしょうか?

Aベストアンサー

No.1の方の回答と一部かぶりますが・・・(汗)

> この二つは同じ動きをすると思っていいのでしょうか?

私の知る限りでは、主に以下の2点で、違いが発生します:
1)OpenFormでは名前を使ってFormsコレクションに追加されるが、
 Visibleを使用した場合は、名前は使われない。
 (前者では「Forms(0)」「Forms("フォーム1")」のどちらでも
  参照可能だが、後者では「Forms(0)」でのみ参照可能)
 ※「Forms!フォーム1.Visible」がエラーになるのもこのためです:
  http://www.f3.dion.ne.jp/~element/msaccess/AcTipsVbaDotVsBangOperator.html
  (『定義』の標題以降を参照下さい)
2)Access組込の右クリックメニューを無効にしていない場合、
 OpenFormでは「デザインビュー」(Access2007以降では
 加えて「レイアウトビュー」も)が選択肢に含まれるが、
 Visibleの場合はこの選択肢が表示されない。

「1」については、コレクションのインデックスはユニークでなければ
ならないことによる制限と思われます。
つまり、No.1の方も紹介されている通り、Visibleの方では同じ
フォームを同時に複数展開できる仕様となっており、名前では
ユニークにならない可能性をはらむため、Formsコレクションに
対して名前をキーとして追加することができない、ということです。
(但し、同時に複数展開できるのは「New」キーワードを使用した
 場合のみで、今回提示されたようにVisibleのみで展開する
 場合は、1つのインスタンスしか生成できないようです)

「2」については、OpenFormでは「フォームビュー」「デザインビュー」
等の複数のビューを持つ「Formオブジェクト」そのものを直接
扱っているのに対して、Visibleの場合は「Formオブジェクト」で
定義された「フォームビュー」(又はデータシートビュー)を、メモリ
上にコピーして表示させている、ということではないかと思います。


なお、Visibleを使用した場合でも、DoCmd.Closeはエラーには
なりません。
(Closeに関しては、そのデータベースにない名前を指定した場合
 ですら、エラーになりません(汗):
 Access2003、Access2007で確認)

但し、No.1の方がご紹介の「Set Frm = New Form_フォーム1」
という構文を使用して、同一フォームのインスタンスを複数表示
させた場合、DoCmd.Closeでは意図したインスタンスを閉じること
ができない、という問題があります。
(このフォーム1上に設置したコマンドボタンで、ボタンをクリックした
 インスタンスだけを閉じるようにする場合は、そのボタンのクリック
 時イベントに、【フォーム名の指定を省略したDoCmd.Close】
 を使用します:
 「DoCmd.Close , , acSavePrompt」等)

ですので、やはり私としてもVisibleによるフォームの起動は、
その方法が必要な場合に限って採用した方がよいと思います。
(同時に複数開く場合の他、モジュールレベルで
 「Private WithEvents Frm As Form」
 といった形で宣言して別のフォームにそのフォームで発生した
 イベントに合わせて実行するコードを記述する場合も、
 この方法を採ります)

No.1の方の回答と一部かぶりますが・・・(汗)

> この二つは同じ動きをすると思っていいのでしょうか?

私の知る限りでは、主に以下の2点で、違いが発生します:
1)OpenFormでは名前を使ってFormsコレクションに追加されるが、
 Visibleを使用した場合は、名前は使われない。
 (前者では「Forms(0)」「Forms("フォーム1")」のどちらでも
  参照可能だが、後者では「Forms(0)」でのみ参照可能)
 ※「Forms!フォーム1.Visible」がエラーになるのもこのためです:
  http://www.f3.dion.ne.jp/~element/msacce...続きを読む


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

人気Q&Aランキング

おすすめ情報