Win98SE、VB6.0+SP3からAccess97のmdbを読んで処理するプログラムで、

On Error GoTo Err_Hndr
Set db = OpenDatabase(sDatabase)

sSQL = "select * from station WHERE compare.[stationNo] = 1;"
Set rs = db.OpenRecordset(sSQL, dbOpenSnapshot)

このSet rs文のあと、エラールーチンに飛んでしまいます。
エラーコードは3061(パラメータが少なすぎます。1を指定して下さい)
です。
このエラーはどういう意味で、どうやって解決すればいいのでしょうか?

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

A 回答 (3件)

No.2で回答の自己レスです。


大変申し訳ありません。勘違いでした。
私が、解決したのは
・・・WHERE フィールド名 =" & 変数名 & ";"
というやり方でした。これならおわかりでしたよね。
今後はよく状況を把握して回答します。
    • good
    • 1

Accessはパラメータクエリーと認識しているようです。


私もこういう経験ありました。
compare.[stationNo]を変数に入れ、SQL文をちょっと面倒くさいですが
・・・ WHERE" & 変数名 & "=1;"
のようにしたところ解決しました。
試してみてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。返事が遅れてすみません。

お礼日時:2001/05/31 09:36

正確にそうだとはいえませんが、(.[stationNo] )の部分で、stationNOはパラメータだと認識していると思います。



やりたいことがはっきりわからないので正確にいえませんが、解消方法は、パラメータに値をセットするか、compareテーブルのstationNOフィールドが1のものという意味であれば、[]をとってください。(でもそれだと、SQL文自体がおかしいような気がしますが・・・)
    • good
    • 1
この回答へのお礼

ありがとうございます。返事が遅れてすみません。

お礼日時:2001/05/31 09:37

この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で書いています。
では。

QVBAで Set wb = Sheets(1).Copyができないわけ?

つい先ほどの質問 4150169 は掲示したコードが抜けておりましたので無視して、こちらにご回答ください。
ほんと抜けた話です。すみません。

以下のマクロtest01はエラーになります。

Sub test01()
Dim wb As Workbook
Set wb = Sheets(1).Copy 'エラー「オブジェクトが必要です」
End Sub

もちろん
Dim wb As Workbook
Sheets(1).Copy
Set wb = ActiveWorkbook
と修正すればエラーにならないことは存じていますが、ふと疑問がわきました。
Sheets(1).Copyの段階であたらしいWorkbookが誕生していますよね。
ならば、そのWorkbookはオブジェクトではないのでしょうか?

Workbooks.Add で誕生したWorkbookは
Set wb = Workbooks.Add
と変数wbにSetできるのに
Set wb = Sheets(1).Copy
ができないのが不思議です。

Set wb = ActiveWorkbook
としないでもSheets(1).CopyをwbにSetする書き方はないのでしょうか?

つい先ほどの質問 4150169 は掲示したコードが抜けておりましたので無視して、こちらにご回答ください。
ほんと抜けた話です。すみません。

以下のマクロtest01はエラーになります。

Sub test01()
Dim wb As Workbook
Set wb = Sheets(1).Copy 'エラー「オブジェクトが必要です」
End Sub

もちろん
Dim wb As Workbook
Sheets(1).Copy
Set wb = ActiveWorkbook
と修正すればエラーにならないことは存じていますが、ふと疑問がわきました。
Sheets(1).Copyの段階であたらしいWorkbookが誕生し...続きを読む

Aベストアンサー

こんばんは。

少し、全体的に考えさせてもらいました。ご質問の最終的な終着点がどういうところにあるのかはあまりはっきりしませんし、私が書いたところで、この手の話は、あまり分かってもらえるという自信はありません。merlionXXさん、ご自身のVBAのコーディングの問題であって、個々の問題ではないからでもあります。

今回の質問は、merlionXX さん自身が、解答した中で考えたことでしょうし、まさか、サブルーチンや特殊なコードで解決をしようと思ったわけではないと思います。

実際のコードとして、

 Set wb = Sheets(1).Copy

というのは出来ないのはご存知なわけですが、なぜ「そうしたいと思った」か、ということがポイントではないでしょうか。出来ないのは、VBAの製作者の恣意的な設計だったのか、それとも、他の要因があったのかと思います。それを、私たちユーザーレベルでは分かりません。

あえて理由を言えば、もともと、Copy メソッドには、戻り値にオブジェクトではない、ということです。

実際に、
ret = Sheets(1).Copy

で返るのは、True です。失敗すれば、実行時エラーが起こります。

質問は、前回のコード( http://oshiete1.goo.ne.jp/qa4138541.html ) から、思いついた事だとは思っていますが、Sheets(1).Copy の時点で、Application側の暗黙的な Workbookのインスタンスの生成を与えてしまっているわけで、そこで、ActiveWorkbook で、オブジェクトを取得することに、なにかしら不自然さを感じていたとしたら、その感覚は正しいのではないかと思います。私も同じように思います。

しかし、その方法で、ブックオブジェクトを取得する方法は、ActiveWorkbook をオブジェクトとして取る方法以外には、新たに Copy メソッド自体から手を加えるぐらいしか、実現する方法はないような気がします。そうすると、その親オブジェクトのSheet のClass 設定から、手を入れなくてはなりません。それは、遥か上級の話だろうし、VBAレベルで可能かどうかさえ分かりません。それに、そんなに難しいコードが、この種のもので必要だと思えません。また、一行、二行の問題で、特別なワザもなく、わざわざFunction プロシージャで取り出すというのは、理屈ではあっても、実務的にはまず考えられません。

VBAは、合理的に出来ているようでいて、はっきりとしないものがいくつもあり、「やって見なければ分からない」としかいいようがありません。本当に単純なコードでも、VBに出来て、VBAには出来ないものがあります。自分は、プロだと豪語している人に限って、こういうところでね凡ミスをするのが常です。VBAのコーディングは、よほど初歩的なこと以外は、戻り値を想定するというような「推測」で済まされるようなことはできません。

ただ、私は全体を通してみて、もし、もう一度、考える余裕があるなら、個々のメソッドやそれに関わるワザよりも、全体のプロセス自体に手を付けたほうがよいのではないか、と思います。

前のコードを、私自身で考えてみました。これは、定番のコードではあるので、私のアレンジあるものの、それ自体がオリジナルというわけではありません。シートモジュールにあるマクロコードをコピーしたいという特例の場合は、以下のコードを少し変更して可能です。これは一例ですが、こういうものは自力で編み出したわけではなく、VBAの入門時に、教わっているものです。6年経っても、そのとき覚えたものは忘れていません。

http://oshiete1.goo.ne.jp/qa4148672.html

----------------------------------------
Sub 保存3()
  Dim orgShCnt As Integer
'  Dim shName As String
  Dim fn As Variant
  'ブックのシートの規定数
  orgShCnt = Application.SheetsInNewWorkbook
  Application.SheetsInNewWorkbook = 1
  With Worksheets("Sheet1")
'    shName = .Name
    .Cells.Copy
  End With
  With Workbooks.Add  '※
    .ActiveSheet.Paste
    Range("A1").Select
    Application.CutCopyMode = False
    '規定数を戻す
    Application.SheetsInNewWorkbook = orgShCnt
    'shName → は、"" になっている
    fn = Application.GetSaveAsFilename("", "Excelブック(*.xls),*.xls", 1, "保存")
    If VarType(fn) = vbBoolean Then
      .Close False
      MsgBox "キャンセルしました。", 48
      Exit Sub
    End If
    .SaveAs fn
    .Close False
  End With
  MsgBox "終了しました。", 64
End Sub


----------------------------------------
※ Workbooks.Add というメソッドで、明示的なブックを生成していればこそ、そのオブジェクトは確実に取得できるわけです。Application の NewBook イベントで、ブックオブジェクトは取得は出来ますが、それは、ひとつのプロセスの中にはありません。

はたして、本当に、Sheets(1).Copy でオブジェクトを捕らえることが必要なのか、と思います。私は、今まで、VBAのコードを2~3千件書いていますが、ほとんど、その方法は、記録マクロを写した程度にしか、そのような方法は出てこないように思います。

失礼な言い方があったら、お許しください。

こんばんは。

少し、全体的に考えさせてもらいました。ご質問の最終的な終着点がどういうところにあるのかはあまりはっきりしませんし、私が書いたところで、この手の話は、あまり分かってもらえるという自信はありません。merlionXXさん、ご自身のVBAのコーディングの問題であって、個々の問題ではないからでもあります。

今回の質問は、merlionXX さん自身が、解答した中で考えたことでしょうし、まさか、サブルーチンや特殊なコードで解決をしようと思ったわけではないと思います。

実際のコードとし...続きを読む

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

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

Aベストアンサー

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

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

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

QDAOのrs.Filter =の使い方

Q_CCというクエリーのフィールドにIDがあります。
あるフォームのボタンのイベントプロシージャに

Set db = CurrentDb()
Set rs = db.OpenRecordset("Q_CC", dbOpenDynaset)

rs.Filter = "ID = 'Me.メールID'"

としましたけど、フィルターが働いてくれません。
" と ' の使い方がまずいと思います。
私のフォームに「メールID」というものが関連づけられていて、
このメールIDという値はMe.メールIDで求められますが、
このメールIDと同じ値のQ_CCのIDで、Q_CCにフィルタかけたい
のです。

rs.Filter = "ID =" + Me.メールID

としたらエラーです。

よろしくお願いします。

Aベストアンサー

多分、

ID=" & Nz(Me.ID, 0)

としていないことが原因です。
が、素直に、Where節を書いても事足りるのでは・・・。

Private Sub コマンド0_Click()
  Dim dbsCurrent As dao.Database
  Dim rstTest   As dao.Recordset
  Dim strQuerySQL As String
      
  strQuerySQL = "SELECT * FROM A_Query WHERE ID=" & Nz(Me.ID, 0)
  Set dbsCurrent = CurrentDb
  Set rstTest = dbsCurrent.OpenRecordset(strQuerySQL)
  With rstTest
    Do Until .EOF
      Debug.Print .Fields(0)
      .MoveNext
    Loop
  End With
  rstTest.Close
  dbsCurrent.Close
End Sub

多分、

ID=" & Nz(Me.ID, 0)

としていないことが原因です。
が、素直に、Where節を書いても事足りるのでは・・・。

Private Sub コマンド0_Click()
  Dim dbsCurrent As dao.Database
  Dim rstTest   As dao.Recordset
  Dim strQuerySQL As String
      
  strQuerySQL = "SELECT * FROM A_Query WHERE ID=" & Nz(Me.ID, 0)
  Set dbsCurrent = CurrentDb
  Set rstTest = dbsCurrent.OpenRecordset(strQuerySQL)
  With rstTest
    Do Until .EOF
     ...続きを読む

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

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

Aベストアンサー

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

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

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

Qエクセル ルーチンマクロ

以前コピー・貼り付けを停止させる為に、下記マクロを参照させて頂いたのですが、
'---------------------------------------------------------------
Sub DisableCommandButtons(Cmd_bln As Boolean)
'コピー・貼り付けを停止させるサブルーチン・マクロ
 Dim cmd As Variant
 Dim Cmdb As Object
 Dim CmdNames As Variant
 CmdNames = Array("Worksheet Menu Bar", "Cell", "Column", "Row")
 'ショートカットのインスタンス
 If Cmd_bln = False Then
  Application.OnKey "^c", ""
  Application.OnKey "^v", ""
  Application.OnKey "^x", ""
 Else
  Application.OnKey "^c"
  Application.OnKey "^v"
  Application.OnKey "^x"
 End If
 'コマンドボタンのEnable
 For Each cmd In CmdNames
 If cmd = "Worksheet Menu Bar" Then
  With Application.CommandBars(cmd).Controls(2)
   .Controls(3).Enabled = Cmd_bln
   .Controls(4).Enabled = Cmd_bln
   .Controls(5).Enabled = Cmd_bln
  End With
 Else
  With Application.CommandBars(cmd)
   .FindControl(, 19).Enabled = Cmd_bln 'Copy
   .FindControl(, 22).Enabled = Cmd_bln 'Paste
   .FindControl(, 21).Enabled = Cmd_bln 'Cut
  End With
 End If
 Next cmd

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

このマクロを実行した所、コンテキストメニュー及びショートカットキーのコピー、貼付が無効になりました。
EnableCommandButtons というマクロを別に作り
ショートカットのインスタンスの
 If Cmd_bln = False Then を
 If Cmd_bln = True Then に
書き換えて、実行した所、ショートカットキーは有効になったのですが
コンテキストメニューのコピー、貼付を有効にするやり方がわかりません。

以前、
同じ質問させていただき、ご回答頂いたのですが、別のPCでは、その方法でもダメなことが分かりました。
OSはXP Pro エクセルはは2003です

どなたか、助けていただけないでしょうか?
よろしくお願い致します。

以前コピー・貼り付けを停止させる為に、下記マクロを参照させて頂いたのですが、
'---------------------------------------------------------------
Sub DisableCommandButtons(Cmd_bln As Boolean)
'コピー・貼り付けを停止させるサブルーチン・マクロ
 Dim cmd As Variant
 Dim Cmdb As Object
 Dim CmdNames As Variant
 CmdNames = Array("Worksheet Menu Bar", "Cell", "Column", "Row")
 'ショートカットのインスタンス
 If Cmd_bln = False Then
  Application.OnKey "^c", ""
  A...続きを読む

Aベストアンサー

> 「コンパイルエラー 引数の数が一致していません。または、不正なプロパティを指定しています」

Sub DisableCommandButtons(Cmd_bln As Boolean)
の引数を変更したのでしょうか?

では、やり方を変えて、

Sub EnableCommandButtons()
'コピー・貼り付けを有効にするマクロ
 'ショートカットのインスタンス
  Application.OnKey "^c"
  Application.OnKey "^v"
  Application.OnKey "^x"
 'コマンドボタンのEnable
  With Application.CommandBars("Worksheet Menu Bar").Controls(2)
   .Controls(3).Enabled = True
   .Controls(4).Enabled = True
   .Controls(5).Enabled = True
  End With
  CommandBars("Cell").Reset
  CommandBars("Column").Reset
  CommandBars("Row").Reset
End Sub

> 「コンパイルエラー 引数の数が一致していません。または、不正なプロパティを指定しています」

Sub DisableCommandButtons(Cmd_bln As Boolean)
の引数を変更したのでしょうか?

では、やり方を変えて、

Sub EnableCommandButtons()
'コピー・貼り付けを有効にするマクロ
 'ショートカットのインスタンス
  Application.OnKey "^c"
  Application.OnKey "^v"
  Application.OnKey "^x"
 'コマンドボタンのEnable
  With Application.CommandBars("Worksheet Menu Bar").Controls(2...続きを読む

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

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

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

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

Aベストアンサー

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

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

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

QMDBのschema.iniの出し方?

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

accessのことをよく知らないのでどう質問したらいいのか
分からないので意味不明なことを言っているかもしれませんが
ご了承ください。

上司が得意先に資料を渡そうと
データベースのテーブルのリストを全てエクセルファイルとしてエクスポートしていたら
schema.iniというものが出来ていたらしく、内容が

[データリスト.txt]
ColName・・・・
Character・・・
Format・・・
Col1=・・・・



[グループリスト.txt]
ColName・・・・
Character・・・
Format・・・
Col1=・・・・



という内容のものでした。

これがどうして出来たのかわからないのですが
どうやったらschema.iniを作ることが出来ますでしょうか?
他のデータベースでもschema.iniを出そうとしたのですが
何をやっても出来ませんでした。

色々調べてみたのですが、記述をしないといけないとかで
上司は全くそういうことをしていないそうです。




意味不明なことを言っているかもしれませんがお分かりになる方
お教え願います。

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

accessのことをよく知らないのでどう質問したらいいのか
分からないので意味不明なことを言っているかもしれませんが
ご了承ください。

上司が得意先に資料を渡そうと
データベースのテーブルのリストを全てエクセルファイルとしてエクスポートしていたら
schema.iniというものが出来ていたらしく、内容が

[データリスト.txt]
ColName・・・・
Character・・・
Format・・・
Col1=・・・・



[グループリスト.txt]
ColName・・・・
Character・・・
...続きを読む

Aベストアンサー

詳しい事は分かりませんが・・・

テーブルをエクスポートする際に、
「ファイルの種類」で「Microsoft Word Merge (*.txt)」を
選択すると、schema.ini と言うファイルと、
タブ区切りのテキストデータが出力されました。

このファイルの事でしょうか?

#Access2000で確認しました。

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

Qローカルのフォルダに入れた「MDBファイルの共有

2つのLANで繋がれたPCがあります。
共有フォルダを使用せず
PC-1のDドライブにMDBファイルをいれ
PC-2からPC-1のDドライブMDBファイルを閲覧、
もしくはリンクすることは可能ですか?

Aベストアンサー

共有フォルダなんて作る必要はまったくなし
ドライブを共有してあげればよし

OSがなんだかしりませんが、糞Macなら管理者パスワードを教えてあげるだけで全てのドライブの操作ができる

また何かあったら何時でもママンに相談しなね☆


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

人気Q&Aランキング

おすすめ情報