マンガでよめる痔のこと・薬のこと

エクセルからアクセスヘADOで接続し、レコードをエクセルに書き出しています。

アクセスのTPWIDには、
「URL」フィールド(テキスト型)
「終了」フィールド(YesNo型)
があります。
(主キーは他のフィールド)

エクセルVBAで
---------------------------------------------------------
Sub test()
Dim CN As New ADODB.Connection
Dim RS As New ADODB.Recordset

CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\テーブルのみ.mdb"

RS.Open "SELECT * FROM TPWID", CN, adOpenStatic, adLockOptimistic
RS.Filter = "終了 = " & False

RS.Close: Set RS = Nothing
End Sub
---------------------------------------------------------
とする分には問題なくできますが、実際行いたい行為は下記なのですが
RS.Filter の部分で、
「実行時エラー 3001 引数が間違った型、許容範囲外、又は競合しています」
と言うエラーになってしまいます。
---------------------------------------------------------
Sub test()
Dim CN As New ADODB.Connection
Dim RS As New ADODB.Recordset

CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\テーブルのみ.mdb"
RS.Open "SELECT * FROM TPWID", CN, adOpenStatic, adLockOptimistic
RS.Filter = "URL = '" & "www.yahoo.co.jp" & "' or URL = '" & "www.google.co.jp" & "' And 終了 = " & False

RS.Close: Set RS = Nothing
End Sub
---------------------------------------------------------

RS.Filter = "URL = '" & "www.yahoo.co.jp" & "' or URL = '" & "www.google.co.jp" & "' And 終了 = " & False

RS.Filter = "URL = '" & "www.yahoo.co.jp" & "' and URL = '" & "www.google.co.jp" & "' And 終了 = " & False
にすれば、エラーは発生しませんが
その次のコードを実行しようとすると
「実行時エラー'3021' BOFとEOFのいずれかTRUEになっていか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。」
となってしまいます。

MsgBox RS.RecordCount
で件数を取得したら0件なので、それでエラーになります。

条件としては、
URLフォールドでは
・www.yahoo.co.jp
・www.google.co.jp
のどちらかの文字列を含み、なおかつ
終了フィールドにチェックがついてない(値は0)
です。

ご教授よろしくお願いします。

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

A 回答 (3件)

フィルターに文字列として渡さなくてはいけないので


RS.Filter = ("URL = 'www.yahoo.co.jp' And 終了 = " & False) Or ("URL = 'www.google.co.jp' And 終了 = " & False)

RS.Filter = "(URL = 'www.yahoo.co.jp' And 終了 = " & False & ") Or (URL = 'www.google.co.jp' And 終了 = " & False & ")"
じゃないですか?未検証です。
    • good
    • 0
この回答へのお礼

RS.Filter = "(URL = 'www.yahoo.co.jp' And 終了 = " & False & ") Or (URL = 'www.google.co.jp' And 終了 = " & False & ")"

で出来ました!!!ありがとうございました。

お礼日時:2012/07/07 22:42

Officeのバージョンはいくつでしょう。


2010ではAccessでもExcelでもVBEの画面でヘルプ(F1キー)で
論理演算子で調べると、『演算子の優先順位』の説明が有ります。
算術演算子(+-*/)の
1+2*3 ≠ 9 、1+2*3 = 7 と同様に
論理演算子ではAnd が先に評価されその後で Or を評価します。
なので
・www.yahoo.co.jp
・www.google.co.jp
のどちらかの文字列を含み、なおかつ
終了フィールドにチェックがついてない(値は0)
はイメージ的には(手抜き回答ですが)
yahoo OR google AND false では、
google AND false の評価を行い、
『それから得たもの』 OR yahoo の評価に進みます。
ですので、
(yahoo AND false) OR (google AND false) のように組み立てる必要が有ります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

説明不足ですいません。バージョンは2007です。

演算子の優先順位をよく見て考えるべきでしたね。

ちなみに
RS.Filter = ("URL = 'www.yahoo.co.jp' And 終了 = " & False) Or ("URL = 'www.google.co.jp' And 終了 = " & False)

にしてみたのですが
「型が一致しません。(Error 13)」になってしまいます。
何が間違ってるのでしょうか?

再度ご回答頂ければ幸いです。よろしくお願いします。

お礼日時:2012/05/21 21:08

こちらが参考になると思われます。



ADOでFilter
http://oshiete.goo.ne.jp/qa/3818384.html
    • good
    • 0
この回答へのお礼

私の質問と同じような内容ですね。
よく見てみます
ありがとうございました。

お礼日時:2012/05/21 21:07

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

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

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

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

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

QADOでアクセスのレコードに複数のフィルタをかけるには?

Sub ADO()
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & アクセスファイル名
Set rs = New ADODB.Recordset

rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic

rs.Filter = ("フィールド1 = " & "'" & 変数1 & "'")
rs.Filter = ("フィールド2 = " & "'" & 変数2 & "'")

Debug.Print rs.RecordCount

Set rs = Nothing
Set cn = Nothing
End Sub

だと最終的にはフィールド2のフィルタ後の個数しか取得できません。

rs.Filter = ("案件CD = " & "'" & 案件CD & "'" And "プロセス = " & "'" & プロセス & "'")
だと「型が一致しません」になります。
どうすれば変数1と変数2のフィルタ後のレコードの個数を取得できるのでしょうか?
ご教授よろしくお願い致します。

Sub ADO()
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & アクセスファイル名
Set rs = New ADODB.Recordset

rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic

rs.Filter = ("フィールド1 = " & "'" & 変数1 & "'")
rs.Filter = ("フィールド2 = " & "'" & 変数2 & "'")

Debug.Print rs.RecordCount

Set rs = Nothing
Set cn = Nothing
End Sub

だと最終的にはフィールド2のフィルタ後の個数しか取得できません。

rs.Filter = ("案...続きを読む

Aベストアンサー

> "案件CD = " & "'" & 案件CD & "'" And "プロセス = " & "'" & プロセス & "'"

とりあえず、現状では条件式(より正確には「And」の入れ方)に問題があります。
(この「And」は、ダブルクォート内にある必要があるのに、外に出てしまっている)

案件CDが文字列型なのでしたら、
 "案件CD = '" & 案件CD & "' And プロセス = '" & プロセス & "'"
 (シングルクォート「'」やAnd演算子などは、前後の文字列の中に入れました)

また案件CDが数値型の場合も念のために書くと、
 "案件CD = " & 案件CD & " And プロセス = '" & プロセス & "'"

といった形にしてみてください。

QADOでNullフィールドの抽出

VB6.0+ADO2.7で、mdbファイルを扱っています。
.filterプロパティを使ってabcフィールドの値がnullまたは空のテーブルを抽出したく
recordset.filter="abc= null or abc=''"
としました。この場合は問題ないのですが、更にdefフィールドの条件を追加し
recordset.filter="(abc= null or abc='') AND def= 'xyz'"
としたところ
「実行時エラー3001
引数が間違った型、許容範囲外、または競合しています。」
というエラーが発生してしまいます。
また、
recordset.filter="abc= null AND def= 'xyz'"
或いは
recordset.filter="abc='' AND def= 'xyz'"
では問題ありません。
何が悪いのでしょうか?
よろしくお願いします。

Aベストアンサー

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpado260/htm/mdprofilter.asp

>次のように、OR で句を結合してできた句のグループを、AND を使ってさらに別の句と結合することはできません。
>(LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'

こちらの情報によると、ダメみたいですね。
Filter プロパティは制約が多いみたいで、where句のように自由に条件は書けないみたいですね。

> Null を使うことはできません。
さらに、こういう記述もあります。

SQL文のwhere句を利用した方が良いかも知れませんね。

Q抽出条件でデータ型が一致しません。のエラーメッセージが出る

フォームで入力された値を、
次のファイルでクエリを読み込むときに代入するASPを作成しましたが、実行しようとすると、
「データ型が一致しません。」のエラーメッセージが出ます。
DBはACCESSを使用しています。ACCESSの対象テーブルで、
データ型を「テキスト型」にすると問題ないのですが、
「数値型」にすると、「データ型が一致しません」の
エラーメッセージになります。
フォームでは、プルダウンで「数値」を選択するようになっています。
宜しくお願いします。

Aベストアンサー

Where区に指定した条件のフィールドが数値なら『'』でくくる必要がありません

Set rs = db.Execute("SELECT テーブル3.* FROM テーブル3 WHERE (テーブル3.番号)=" & bangou)
といった具合に修正してみましょう

『'』でくくる必要があるのは対象のフィールドが文字列の場合です

QVBとアクセスでSQL文に変数を使いたいのですが

したいことはレコードの挿入をSQL文で変数を使用して処理したいのですがうまく動作してくれません

StrSQL_1 = _
"insert into 行先情報テーブル (社員ID, 行先, 帰社予定時刻, 備考)" & _
"values (7,'(変数1)','(変数2)','(変数3)')"

変数の部分が置き換わりません、いろいろ調べてみたのですがどうもわかりませんvaluesでは変数を使えないのでしょうか?

もしそうだとするとどのようにすればレコードを挿入するSQL文で変数を利用できるのかをおしえていただけないでしょうか

Aベストアンサー

文字列なんで、&で連結すればOKです。

StrSQL_1 = _
"insert into 行先情報テーブル (社員ID, 行先, 帰社予定時刻, 備考)" & _
"values (7,'" & 変数1 & "','" & 変数2 & "','" &(変数3)& "')"

QFindFirst を複数条件で検索

Data1.Recordset.FindFirst "name = yamada"
は、取得できますが
Data1.Recordset.FindFirst "name = yamada & age = 35"
と、複数条件で検索すると取得できません。
何故ですか?

Aベストアンサー

Data1.Recordset.FindFirst "name = 'yamada' AND age = 35"
ですね。

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

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

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

QADOでFilter

Access 2002ですが ADOのRecordsetにVBAでフィルターをかけようと思っています。

条件は・・・

RS.Filter = "((場所 ='キッチン') OR (場所 ='台所') OR (場所 ='居間') OR (場所='寝室')) AND (予約状況 ='予約済み')"

という感じです。

キッチン、台所、居間、寝室でどれでもいいので予約済みになっている
ところを抽出したいのですがエラーになります。

エラー内容を控えてくるのを忘れましたが、これは文法的に不可能でしょうか?

なお、アクセスのクエリーだと動きます。

Aベストアンサー

AND,ORの演算子に制約があるためでしょう

(場所='居間' or 場所='台所') AND ( 予約状況='予約済み')
といった 複数フィールドでフィルターをかける場合
OR句の結果を ANDで句で結合することが出来ません

逆の AND句を OR句で結合は可能ですので
(場所='居間' AND 予約状況='予約済み') or ( 場所='台所' AND 予約状況='予約済み')
といった条件に変更しましょう

QSQLの速度をあげるには・・・

テキストファイルからキーワードを拾って
SQLをなげています
SQLの質問になってしまうかもしれません
いまはADO接続でやっています

Open ファイル as input......

SQL = select * from tbl where name like '%キーワード%'
execute(SQL)

レコードセットの値で処理をいろいろ・・・
Loop

もともとのDBの件数がものすごくおおくてselect文に結構な時間が
かかってしまいます。速度をあげるほうほうってあるのでしょうか
私にはおもいつかなくて・・・

こういったほうほうは どう? ってのがありましたら
おしえていただきたいのですが よろしくおねがいします。

Aベストアンサー

確かに・・・Like演算子・・・あまり使いたくないですね・・・
文字列比較は処理を遅くさせるし、増してや「=」ではなくLikeですから、膨大な時間がかかる恐れが・・・

ちなみにぼく自身、DB系を多くしています。今の仕事もDB系なのですが、元となるホストは他の会社が行っており、それにあわせて作らなければなりません。
で、そのホスト連携部分に文字列を比較しなければならない部分があるんですよ・・・・
自分の会社ならまだしも、他の会社がすでに設計済みのDBだから変えようがないのです。。。

まぁ愚痴っても仕方ないか・・・


なのでぼくも(不本意ながら)Like演算子を使用しています。


長い前置きはさておき・・・

本題のSQLのスピードなのですが、
http://homepage2.nifty.com/inform/vbdb/addnew.htm
こちらに面白い記述がありました。

AddNewにかかるスピードの検証で
Access データベースの場合: AddNew のほうが INSERT INTO より5倍以上速い
SQL Server の場合: INSERT INTO のほうが AddNew より 1.4倍 くらい速い
とあります。


たぶんで物を言ってはいけないと思うけど、言っちゃいます。

(1)もしDBがアクセスで
 >レコードセットの値で処理をいろいろ・・・
 のところがUpdate用のSQL文で処理を行ってる場合

 Recordsetをして、処理を行う


(2)もしDBがアクセス以外で
 >レコードセットの値で処理をいろいろ・・・
 のところがRecordsetで処理を行ってる場合

 Recordsetをせずに、UPDATE用のSQLを実行する


未検証なのですが多分イメージとして、こういうパターンが各DBに適してるのかな?

すでにこのパターンなのであれば、意味ないですね(^^;)

参考URL:http://homepage2.nifty.com/inform/vbdb/addnew.htm

確かに・・・Like演算子・・・あまり使いたくないですね・・・
文字列比較は処理を遅くさせるし、増してや「=」ではなくLikeですから、膨大な時間がかかる恐れが・・・

ちなみにぼく自身、DB系を多くしています。今の仕事もDB系なのですが、元となるホストは他の会社が行っており、それにあわせて作らなければなりません。
で、そのホスト連携部分に文字列を比較しなければならない部分があるんですよ・・・・
自分の会社ならまだしも、他の会社がすでに設計済みのDBだから変えようがないのです。。。

...続きを読む

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

QACCESS フォームをそのまま印刷について

お世話になります。
ACCESSのフォームを印刷する方法ってどうすればいいのでしょうか?レポートは使いたくなくて・・・・
ボタンをクリックしたらボタンを非表示にして印刷させたいのですが、やり方がわかりません。
また、印刷プレビューを表示させるボタンも作りたいのですが・・・

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

Aベストアンサー

>ACCESSのフォームを印刷する方法ってどうすればいいのでしょうか?
普通に[ファイル][印刷]とすれば印刷できます
どのような形で印刷されるかは印刷プレビューで確認できます

>ボタンをクリックしたらボタンを非表示にして印刷させたいのですが
VBAなら印刷はPrintformメソッドです
印刷時非表示はDisplayWhenプロパティーで設定できます

>印刷プレビューを表示させるボタンも作りたいのですが・・・
プレビューはレポートにしかないようですね
フォームは表示されているんですよね、だったら要らないのでは

>レポートは使いたくなくて・・・・
フォームと同じフォーマットのレポートなら
右クリック、名前をつけて保存でレポートを選ぶだけで簡単に作れますよ


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

人気Q&Aランキング