Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


93 / 500 ページ ←次へ | 前へ→

【11435】Re:複数の抽出条件
発言  超初心者  - 10/1/28(木) 18:11 -

引用なし
パスワード
   ▼shin さん:
>次の様なテーブルがあります。
テーブル名を仮に「aT_table」としました。

SELECT aT_table.店名, Max(aT_table.検査日) AS 検査日, First(aT_table.備考) AS 備考
FROM aT_table
WHERE (
((DCount("*","aT_table","店名='" & [店名] & "' And (備考<>10 Or 備考 is Null)"))>=1) AND
((aT_table.備考) Is Null Or (aT_table.備考)<>10)) OR
(((DCount("*","aT_table","店名='" & [店名] & "' And (備考<>10 Or 備考 is Null)"))=0) AND
((aT_table.備考)=10))
GROUP BY aT_table.店名;


こんな感じでいかがでしょう。
・ツリー全体表示

【11434】複数の抽出条件
質問  shin  - 10/1/28(木) 12:27 -

引用なし
パスワード
   サイト内を調べてみましたが、私の頭ではまとまりがつかず困っています。
次の様なテーブルがあります。

店名   検査日   備考
--------------------------
A    2009/01/01 
A    2009/01/02
B    2009/01/01 10
B    2009/01/02 
C    2009/01/02 10
【抽出条件】
1.検査日は最新
2.a)備考が10のデータは使用しない
  b)備考が10のデータのみなら使用する

【希望の抽出結果】
店名   検査日   備考
--------------------------
A    2009/01/02
B    2009/01/02 
C    2009/01/02 10 

と、したいのです。
VBAでなくても関数で出来る事なのでしょうか?
どちらにしても抽出条件2の部分が分かりません。
よろしくお願いいたします。 
・ツリー全体表示

【11433】Re:複数条件での抽出について教えて下さい
お礼  ken  - 10/1/26(火) 8:57 -

引用なし
パスワード
   ▼小僧 様:
おはようございます。

教えて頂いたコードでうまく抽出ができました。

本当にありがとうございました。
・ツリー全体表示

【11432】Re:複数条件での抽出について教えて下さい
回答  ken  - 10/1/25(月) 19:05 -

引用なし
パスワード
   ▼小僧 様:
Midの件、解決しました。

Filed_Aの抽出条件の存在をすっかり忘れていました。
失礼しました。

これから教えて頂いた内容でやってみます。
・ツリー全体表示

【11431】Re:複数条件での抽出について教えて下さい
質問  ken  - 10/1/25(月) 18:34 -

引用なし
パスワード
   ▼小僧 様:
ありがとうございます。

実際のコードでは別のコントロール名にしています。
投稿するに当たり、分かりやすいようにと思ったのですが、かえって混乱を招くような名前で申し訳ありませんでした。

ちょっと分からないところがあったので教えて下さい。

>    Me.Filter = Mid(strFilter, 5)
>    Me.FilterOn = True

ここで
  Me.filter = strFilter
ではなくてMidステートメントにするのは何故でしょうか?

勉強不足ですみません。
・ツリー全体表示

【11430】Re:複数テーブルに同時にデータ追加クエ...
お礼  ムーン E-MAIL  - 10/1/25(月) 18:21 -

引用なし
パスワード
   小僧さん

ありがとうございます。

トランザクション処理は僕の力量では厳しそうですが
やはり、1つずつするのが妥当でしたか。
横着しすぎちゃいました。


▼小僧 さん:
>▼ムーン さん:
>こんにちは。
>
>> テーブルZのデータを毎日、
>> テーブルA、B、Cに同じタイミングで追加したい
>
>> テーブルが1対1でしたら、
>> 追加クエリーで簡単に追加できる
>
>こちらを3回行ってあげましょう…。
>
>ただし、
>Aテーブルへの処理→成功
>Bテーブルへの処理→成功
>Cテーブルへの処理→なんらかの理由で失敗
>
>の時にはAテーブル、Bテーブルへの処理も
>キャンセルしてあげる必要がありそうですね。
>
>その場合にはクエリをクリックするのではなく
>AccessVBAにてトランザクション処理を行った後
>各テーブルへの追加処理を行うプログラムを行うと
>お望みの様な動作ができそうです。
・ツリー全体表示

【11429】Re:複数条件での抽出について教えて下さい
回答  小僧  - 10/1/25(月) 17:08 -

引用なし
パスワード
   ▼ken さん:
こんにちは。

> 抽出用にフォームヘッダーに
> Field_Aに対応したコンボボックスと
> Filed_Bの抽出条件を決定するためのオプショングループを配置

かしこまりました。
その様な条件ですと、初めに投稿されたコードで
ほぼ問題ないですね。申し訳ないです。


Option Compare Database
Option Explicit

Const strWordB = "語句B"
Const strWordC = "語句C"
Const strWordD = "語句D"

Sub FormFilter()
Dim strFilter As String

  If Not IsNull(Me.TextA.Value) Then
    strFilter = " AND [Field_A] ='" & Me.TextA.Value & "'"
  End If
  
  Select Case Me.Ck1.Value
    Case 1
      strFilter = strFilter & " AND (" _
                  & "  [Field_B] ='" & strWordB & "'" _
                  & " OR [Field_B] ='" & strWordC & "'" _
                  & ")"
    
    Case 2
      strFilter = strFilter & " AND (" _
                  & "  [Field_B] ='" & strWordB & "'" _
                  & " OR [Field_B] ='" & strWordC & "'" _
                  & " OR [Field_B] ='" & strWordD & "'" _
                  & ")"
    Case Else
        
  End Select

  If strFilter = "" Then
    MsgBox "全件出力"
  Else
    Me.Filter = Mid(strFilter, 5)
    Me.FilterOn = True
  End If

End Sub

の様に記述し、Text_A や Ck1 の更新後処理に

Private Sub TextA_AfterUpdate()
  
  Call FormFilter

End Sub

とする事でお望みの様な動作ができるかと思われます。


※この様な掲示版にご質問される際や
ken さん以外の方がこのAccessをメンテナンスする場合、

> TextAのコンボボックス 
> Ck1はオプショングループ

という命名規則は混乱を招く場合がありますので
元のコントロールが想像しやすい名前に変えておいた方が
無難かもしれません。

以下蛇足です。
Accessが初期で付けるオプショングループ名は「フレーム1」ですが、
これをFrm_Aなどと省略すると「FormA」の略と混同される可能性がある為、
当方は Grp_A の様な命名規則を行っています。
・ツリー全体表示

【11428】Re:複数テーブルに同時にデータ追加クエ...
発言  小僧  - 10/1/25(月) 16:39 -

引用なし
パスワード
   ▼ムーン さん:
こんにちは。

> テーブルZのデータを毎日、
> テーブルA、B、Cに同じタイミングで追加したい

> テーブルが1対1でしたら、
> 追加クエリーで簡単に追加できる

こちらを3回行ってあげましょう…。

ただし、
Aテーブルへの処理→成功
Bテーブルへの処理→成功
Cテーブルへの処理→なんらかの理由で失敗

の時にはAテーブル、Bテーブルへの処理も
キャンセルしてあげる必要がありそうですね。

その場合にはクエリをクリックするのではなく
AccessVBAにてトランザクション処理を行った後
各テーブルへの追加処理を行うプログラムを行うと
お望みの様な動作ができそうです。
・ツリー全体表示

【11427】Re:OPENROWSETでのCSVインポート
発言  小僧  - 10/1/25(月) 16:27 -

引用なし
パスワード
   ▼えうえん さん:
こんにちは。

> いろいろ調べたところ
> OPENROWSETを利用してできるということまでわかったのですが、

Accessではなく、T-SQL(SQLServer)のお話ですよね?

> 項目数が可変になっており、
> テキストと数値が混じっている列がある

面倒な流れになりますが、
CSVファイルを開き項目数をカウントし、
インポート用のテーブルを作成し
そこに取込む様な処理を自作する方が良さそうですね。
・ツリー全体表示

【11426】Re:複数条件での抽出について教えて下さい
回答  ken  - 10/1/25(月) 11:45 -

引用なし
パスワード
   ▼小僧 様:
 回答が遅くなりました。

オプショングループ内に配置したのはチェックボックスではなくてオプションボタンでした。
すみません。

仕様は下記のようにしています。
Field_A:A〜Dの語句を選択して入力
Field_B:E〜Gの語句を選択して入力
抽出用にフォームヘッダーにField_Aに対応したコンボボックスとFiled_Bの抽出条件を決定するためのオプショングループを配置

返り値が1の場合
(Field_A=コンボボックスで選択した語句) AND (Filed_B=E or G)
返り値が2の場合
(Field_A=コンボボックスで選択した語句) AND (Filed_B=E or F or G)
 ・
 ・
 ・
というような仕様で抽出したいと考えています。
・ツリー全体表示

【11425】複数テーブルに同時にデータ追加クエリー
質問  ムーン E-MAIL  - 10/1/24(日) 16:00 -

引用なし
パスワード
   いつも助けていただいております。
題名の件です。

テーブル:A、B、C

共通項目(フィールド)名:1,2,3

日時更新テーブル:Z

項目(フィールド):1,2,3

テーブルZのデータを毎日、テーブルA、B、Cに同じタイミングで追加したいのです。テーブルが1対1でしたら、追加クエリーで簡単に追加できるのですが、
1対複数テーブルの場合、同様にすれば一番効率が良いでしょうか?

ちなみに項目(フィールド)1は一意のIDみたいなものです。

例えば親テーブルをAとして、子をB,Cとし、
親テーブルAが更新されれば、子テーブルB,Cも更新されるみたいな
クエリーでもいいのですが。

簡単な名案があればご助力お願い致します。

※子テーブルは今後増えることも考えられます。
・ツリー全体表示

【11424】Re:ADPのテーブルをMDBにインポートしたい
お礼  pon  - 10/1/22(金) 19:43 -

引用なし
パスワード
   お騒がせしました

解決です

ありがとうございました
・ツリー全体表示

【11423】Re:複数条件での抽出について教えて下さい
発言  小僧  - 10/1/22(金) 17:38 -

引用なし
パスワード
   ▼ken さん:
こんにちは。

> Ck1はオプショングループの返り値になります。

オプショングループ上に配置されたチェックボックスは
1つしか選択できないのが仕様です。

> リスト内の複数語句でor抽出をしたい

チェックボックスが複数選べてしまうという事は
オプショングループとチェックボックスが
連動してない事になります。

(チェックボックスのプロパティを開いて
 「データ」のタブに「オプション値」という
 項目があれば連動しています。)

もうちょっと仕様を詳しくご提示願えればと思います。
・ツリー全体表示

【11422】OPENROWSETでのCSVインポート
質問  えうえん  - 10/1/22(金) 16:10 -

引用なし
パスワード
   CSVファイルをダイアログから選択して、
Accessにインポートしたいと思っており、
対象のCSVファイルは、項目数が可変になっており、テキストと数値が混じっている列があるので、すべてテキスト型で、Accessテーブルにインポートをしたいので、
いろいろ調べたところ

OPENROWSETを利用してできるということまでわかったのですが、
  DoCmd.RunSQL " SELECT * INTO インポートするテーブル名 FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Text;Database=ダイアログから取得した場所\;','SELECT * FROM [***.CSV]');"

でやってみたところ、From句の実行時エラー 実行エラー 3133になってしまうのですが、
何が悪いのかが知識不足で分からないので助けていただければと思います。
・ツリー全体表示

【11421】Re:ADPのテーブルをMDBにインポートしたい
発言  pon  - 10/1/22(金) 15:14 -

引用なし
パスワード
   結果報告です
下記でインポートすることが出来ました

'strSQL = "select * into FOO (dbo) IN 'C:\HOGE\FUGA.mdb' from FOO (dbo) ;"
実行時エラー '3067':
クエリの入力には、1 つ以上のテーブルまたはクエリが必要です。


'strSQL = "select * into FOO (dbo) IN 'C:\HOGE\FUGA.mdb' from FOO ;"
実行時エラー '3067':
クエリの入力には、1 つ以上のテーブルまたはクエリが必要です。

'strSQL = "select * into FOO IN 'C:\HOGE\FUGA.mdb' from FOO (dbo) ;"
実行時エラー '3131':
FROM 句の構文エラーです。

'strSQL = "select * into FOO IN 'C:\HOGE\FUGA.mdb' from FOO ;"
インポートが出来ました

手動でインポートすると
テーブル名が
FOO (dbo)
となってしまいます

この辺の動作の説明ページとご紹介頂けるとうれしいです
よろしくお願いいたします
・ツリー全体表示

【11420】Re:ADPのテーブルをMDBにインポートしたい
質問  pon  - 10/1/22(金) 14:46 -

引用なし
パスワード
   追加の質問です


上記はローカルPCのMSDEのDBからはうまくインポートできましたが
SQLサーバーからのインポートが

  db.Execute strSQL

実行時エラー '3067':
クエリの入力には、1 つ以上のテーブルまたはクエリが必要です。
とエラーとなってしまいます
strConnect
は、サーバーにあわせて変更しているので問題はないと思います

気になる点は
SQLサーバー上のテーブル名が
hoge (dbo)
のようになっているのですが
これを、右クリックで名前の変更でコピーしようとすると
後ろの (dbo) が消えてしまいます

この辺に原因があるような気もするのですがよくよくわかりません

アドバイスよろしくお願いいたします
・ツリー全体表示

【11419】Re:複数条件での抽出について教えて下さい
回答  ken  - 10/1/22(金) 13:32 -

引用なし
パスワード
   ▼小僧 様:
レスありがとうございます。
>
>> Ck1のチェックボックスに応じて複数の語句でOR抽出
>
>Ck1 はチェックボックス名で宜しいでしょうか?

Ck1はオプショングループの返り値になります。
分かりにくくてすみません。

Field_Bはリストから語句を選択するようになっており、
返り値に応じてリスト内の複数語句でor抽出をしたいと考えています。

これとField_Aの抽出条件でAND抽出を行い、

(Field_Aの抽出条件) AND (Field_Bのor抽出条件)

というようなイメージでレコードの抽出を行いたいと考えています。
・ツリー全体表示

【11418】Re:ADPのテーブルをMDBにインポートしたい
発言  pon  - 10/1/22(金) 13:26 -

引用なし
パスワード
   結果報告です
下記でインポートできました

Sub Import_TBL()

  Dim strConnect As String
  Dim strSQL As String
  Dim db As DAO.Database
  'Dim CurrentDb_Name As String
  Dim TG_JOB As String
  
  TG_JOB = "7777"
        
  strConnect = "ODBC;Driver={SQL Server};Server=(local);" & _
         "Database=DBNM;UID=HOGE;PWD=FUGA;"
        
  Set db = DBEngine.OpenDatabase("", False, False, strConnect)
  strSQL = "select * into d_Tbl_TG " & _
       "IN 'C:\FOO\BAR.mdb' from d_Tbl_TG WHERE d_Tbl_TG.FLD=""" & TG_JOB & """;"
  db.Execute strSQL
  
  Application.RefreshDatabaseWindow
  
End Sub

取りあえず希望の操作はかなっています


何かアドバイスありましたらよろしくお願いいたします
・ツリー全体表示

【11417】Re:excel出力先をデスクトップに指定する
お礼  VBA初心者  - 10/1/22(金) 12:54 -

引用なし
パスワード
   ▼超初心者 さん
記載漏れです。

Dim myDir As Stringと宣言して
myDir = CreateObject("WScript.Shell").SpecialFolders("Desktop")
xlsFileName = myDir & "\" & Format(Date, "yyyy_mm_dd") & "履歴データ一覧.xls"
          ・
          ・
          ・
xlsWkb.SaveAs xlsFileName, FileFormat:=56
  xlsWkb.Close: Set xlsWkb = Nothing
  xlsApp.Quit: Set xlsApp = Nothing

としたら成功しました。    


>▼超初心者 さん
>VBA初心者です。
>いろいろ考えてみたら、
>Dim myDir As Stringと宣言して
>xlsFileName = myDir & "\" & Format(Date, "yyyy_mm_dd") & "履歴データ一覧.xls"
>と変更したら成功しました。
>
>お手数おかけして申し訳ございません。
>有難うございました。
>
>
>>▼超初心者 さん:
>>こんにちは。
>> 自分なりに修正して
>>
>>sub
>> 
>>Dim objWShell As Object 'WScript.Shell
>>Dim strDesktopPath As String 'デスクトップの場所
>>
>>'Windows Script Hostのオブジェクトを作成する
>>Set objWShell = CreateObject("WScript.Shell")
>>
>>'スペシャルフォルダ(特殊フォルダ)の場所を返す
>>strDesktopPath = objWShell.SpecialFolders("Desktop")
>>
>>Set DB = CurrentDb
>>  xlsFileName = "strDesktop" & Format(Date, "yyyy_mm_dd") & "履歴データ一覧.xls"
>>   Debug.Print xlsFileName 
>>        .
>>        .
>>        .(途中省略)
>>xlsWkb.SaveAs xlsFileName, FileFormat:=56
>>  xlsWkb.Close: Set xlsWkb = Nothing
>>  xlsApp.Quit: Set xlsApp = Nothing
>>        
>>end sub
>>
>> としましたがユーザのデスクトップに書き出されません。
>>デバックプリントで出力してもどこをどのように修正するのか
>>わかりません。
>>どうかご教授をお願いします。 
>>
>>>▼VBA初心者 さん:
>>>>  「xlsFileName = "SpecialFolders("Desktop"):\" & Format
>>>>  (Date, "yyyy_mm_dd") & "ホストデータ.xls"」として、
>>>> 使用しているユーザのデスクトップに保存されるでしょうか。
>>>
>>>Debug.Print xlsFileName
>>>にて、xlsFileNameのデータの中身を確認してみると良いです。
>>>きちんとしたファイル名(フルパス)になっていたら出力されます。
>>>
>>>
>>>余談ですが、私のAcc2000では、デスクトップパスは、
>>>CreateObject("WScript.Shell").SpecialFolders("Desktop")
>>>このようにして取得します。
>>>
>>>2007から(?)の機能でCreateObjectなしでも使えるように
>>>なっているのかもしれませんが、一応、参考までに。。。
・ツリー全体表示

【11416】Re:excel出力先をデスクトップに指定する
お礼  VBA初心者  - 10/1/22(金) 12:48 -

引用なし
パスワード
   ▼超初心者 さん
VBA初心者です。
いろいろ考えてみたら、
Dim myDir As Stringと宣言して
xlsFileName = myDir & "\" & Format(Date, "yyyy_mm_dd") & "履歴データ一覧.xls"
と変更したら成功しました。

お手数おかけして申し訳ございません。
有難うございました。


>▼超初心者 さん:
>こんにちは。
> 自分なりに修正して
>
>sub
> 
>Dim objWShell As Object 'WScript.Shell
>Dim strDesktopPath As String 'デスクトップの場所
>
>'Windows Script Hostのオブジェクトを作成する
>Set objWShell = CreateObject("WScript.Shell")
>
>'スペシャルフォルダ(特殊フォルダ)の場所を返す
>strDesktopPath = objWShell.SpecialFolders("Desktop")
>
>Set DB = CurrentDb
>  xlsFileName = "strDesktop" & Format(Date, "yyyy_mm_dd") & "履歴データ一覧.xls"
>   Debug.Print xlsFileName 
>        .
>        .
>        .(途中省略)
>xlsWkb.SaveAs xlsFileName, FileFormat:=56
>  xlsWkb.Close: Set xlsWkb = Nothing
>  xlsApp.Quit: Set xlsApp = Nothing
>        
>end sub
>
> としましたがユーザのデスクトップに書き出されません。
>デバックプリントで出力してもどこをどのように修正するのか
>わかりません。
>どうかご教授をお願いします。 
>
>>▼VBA初心者 さん:
>>>  「xlsFileName = "SpecialFolders("Desktop"):\" & Format
>>>  (Date, "yyyy_mm_dd") & "ホストデータ.xls"」として、
>>> 使用しているユーザのデスクトップに保存されるでしょうか。
>>
>>Debug.Print xlsFileName
>>にて、xlsFileNameのデータの中身を確認してみると良いです。
>>きちんとしたファイル名(フルパス)になっていたら出力されます。
>>
>>
>>余談ですが、私のAcc2000では、デスクトップパスは、
>>CreateObject("WScript.Shell").SpecialFolders("Desktop")
>>このようにして取得します。
>>
>>2007から(?)の機能でCreateObjectなしでも使えるように
>>なっているのかもしれませんが、一応、参考までに。。。
・ツリー全体表示

93 / 500 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
1082686
(SS)C-BOARD v3.8 is Free