Access VBA質問箱 IV

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

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


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

【5580】Re:クエリで抽出
回答  小僧  - 05/7/8(金) 15:58 -

引用なし
パスワード
   ▼buti さん:
こんにちは。
計算の速度までは考慮しておりませんが、とりあえずの解決方法を。

加入月数に使われていた「起算取得日」「起算喪失日」を
そのまま式にあてはめてあります。

加入月数:
DateDiff("m",IIf([取得日]>DateSerial(Year(DateAdd("m",-3,Now())),4,1),
[取得日],
DateSerial(Year(DateAdd("m",-3,Now())),4,1)),
IIf([喪失日]<DateSerial(Year(DateAdd("m",9,Now())),3,31),
[喪失日],
DateSerial(Year(DateAdd("m",9,Now())),3,31)))+1

これなら抽出条件を付けてもパラメータを聞かれないと思います。


-----(別方法)-------

クエリのSQLビューに下記SQLを貼り付けてみてください。
元テーブルは「T_buti」としております。

SELECT Q.取得日, Q.喪失日, Q.起算取得日, Q.起算喪失日,
DateDiff("m",[起算取得日],[起算喪失日])+1 AS 加入月数
FROM [
SELECT T_buti.取得日, T_buti.喪失日, IIf(Month(T_buti.取得日)>3,
T_buti.取得日,CDate(Year(取得日) & "/4/1")) AS 起算取得日,
IIf(T_buti.喪失日<DateSerial(Year(DateAdd("m",9,Now())),3,31),
T_buti.喪失日,
DateSerial(Year(DateAdd("m",9,Now())),3,31)) AS 起算喪失日
FROM T_buti
]. AS Q
WHERE (((DateDiff("m",[起算取得日],[起算喪失日])+1)<=11));
・ツリー全体表示

【5579】クエリで抽出
質問  buti  - 05/7/8(金) 15:10 -

引用なし
パスワード
   こんにちは。

該当期間の対象者を抽出するためテーブルの取得日、喪失日を基にクエリを作りました。

取得日
起算取得日:IIf([取得日]>DateSerial(Year(DateAdd("m",-3,Now())),4,1),[取得日],DateSerial(Year(DateAdd("m",-3,Now())),4,1))

喪失日
起算喪失日:IIf([喪失日]<DateSerial(Year(DateAdd("m",9,Now())),3,31),[喪失日],DateSerial(Year(DateAdd("m",9,Now())),3,31))

加入月数: DateDiff("m",[起算取得日],[起算喪失日])+1

ここで加入月数が11ヶ月以下のものだけ抽出したいのですが、加入月数の抽出条件に、<12と入れてもパラメータが出てしまい抽出できません。

このクエリ(A)を基にクエリ(B)を作り、クエリ(B)で加入月数の抽出条件に、<12といれると抽出できるのですが、一つのクエリ(A)で抽出することは出来ないものなのでしょうか?

よろしくお願いします。
・ツリー全体表示

【5578】Re:クエリのフィールドの選択基準
お礼  なおみ  - 05/7/7(木) 22:40 -

引用なし
パスワード
   こうちゃん さん

有難うございました。
個人授業をお願いしたいです・・・(笑)
また、つまづきましたら、ご指導お願いしますm(__)m
・ツリー全体表示

【5577】Re:クエリのフィールドの選択基準
発言  こうちゃん  - 05/7/7(木) 21:23 -

引用なし
パスワード
   なおみさん、こんばんは

>T得意先テーブルの”担当者CD”(外部キー)とT担当者テーブルの”担当者CD”(主キー)に参照性合成を設定して、クエリを作成したいのですが、クエリのフィールドには、どちらのテーブルの”担当者CD”を持ってきたらいいのでしょうか?どちらのテーブルの”担当者CD”を選択してもデーターシートビューで見ると同じになります。しかし、教科書などには必ずテーブルが指定されています。説明がわかりにくいかと思いますが、宜しくお願い致します。

そのクエリでなにをしたいのかで違ってくると思いますよ。
たとえば得意先一覧を作成する際、T得意先テーブルの担当者CDをキーとして
T担当者テーブルの担当者名を表示するような場合だと、T得意先テーブル.担当者CD
を指定するべきだし、T担当者テーブルを基にして、担当者ごとに得意先数を集計する
ような場合は、T担当者テーブル.担当者CDがキーになるでしょう。

なおみさんの質問のしかただと、「何をするクエリ」かが判別できないです。

#エクセル質問箱に、こっちに移動したことを書き込んでおくほうがいいですね。
・ツリー全体表示

【5576】クエリのフィールドの選択基準
質問  なおみ  - 05/7/7(木) 16:16 -

引用なし
パスワード
   T得意先テーブルの”担当者CD”(外部キー)とT担当者テーブルの”担当者CD”(主キー)に参照性合成を設定して、クエリを作成したいのですが、クエリのフィールドには、どちらのテーブルの”担当者CD”を持ってきたらいいのでしょうか?どちらのテーブルの”担当者CD”を選択してもデーターシートビューで見ると同じになります。しかし、教科書などには必ずテーブルが指定されています。説明がわかりにくいかと思いますが、宜しくお願い致します。
・ツリー全体表示

【5575】Re:複数条件を一つのコントロールに入れて...
お礼  cya  - 05/7/7(木) 13:51 -

引用なし
パスワード
   なるほどー。
すごく検索しやすくなりました。
ご教授いただきありがとうございました!また、よろしくお願いします。
・ツリー全体表示

【5574】Re:複数条件を一つのコントロールに入れて...
回答  小僧  - 05/7/7(木) 13:25 -

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

>「OR」条件で連結
「OR」条件でなくて「AND」条件でしたか。

>カンマは半角ではなく全角のままでも検索できるようにはできますか?

全角を半角にするには StrConv 関数を使います。
…がそのまま使うと検索する文字も半角になりますね…。
(カタカナや英字・数字の場合)

という事で置換でいきましょうか。

置換をするには Replace 関数を使います。

 StrConv(文字列, 検索文字, 置換文字)

こちらの環境ですと「,」は全角でも普通に検索できたので
「、」あたりを「,」に置換すれば使いやすい検索ツールになると思います。
・ツリー全体表示

【5573】Re:複数条件を一つのコントロールに入れて...
お礼  cya  - 05/7/7(木) 12:26 -

引用なし
パスワード
   小僧さんさっそくのレスありがとうございます!!
ばっちり検索できました。

ちなみにもう一つお尋ねしてもよろしいですか?
カンマは半角ではなく全角のままでも検索できるようにはできますか?
どのように書き換えればよろしいでしょうか?
書いたコードは以下の通りです。

Private Sub 検索btn_Click()
Dim Kensaku As String
Dim S As Variant
Dim I As Long
  If InStr(1, Me.txt検索.Value, ",") > 0 Then
    S = Split(Me.txt検索.Value, ",")
      For I = 0 To UBound(S, 1)
        Kensaku = Kensaku & "([質疑] And [解答] LIKE '*" & S(I) & "*') And "
      Next
    Kensaku = Left(Kensaku, Len(Kensaku) - 4)
  Else
    Kensaku = "[質疑] and [解答] LIKE '*" & Me.txt検索.Value & "*'"
  End If
    
  Me.Filter = Kensaku
  Me.FilterOn = True
 
End Sub
・ツリー全体表示

【5572】Re:テーブルの作り方
お礼  buti  - 05/7/7(木) 11:56 -

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

>結局正規化に関しては、「可能」「不可能」の問題ではなくて
>「効率的」「非効率的」の問題だと思います。
>複雑にテーブルを分割してもSQL や VBA を駆使すれば結果を返す事は可能ですが、
>メンテナンスや他の人が使用する事を考えると「正規化をしましょう」という事になるのでしょう。

そうですね。この辺を良く考えて見ることにします。

>具体的にbuti さんがどのような業務でどのような運用をされるのかが解らないので
>(いや、教えて頂いてもですけど)「これが最適です」というアドバイスができなくて申し訳ないです。

とんでもありません。
こちらこそ抽象的な質問にも関わらず回答いただき感謝しております。
小僧さん、ありがとうございました。
・ツリー全体表示

【5571】Re:複数条件を一つのコントロールに入れて...
回答  小僧  - 05/7/7(木) 11:46 -

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

カンマを区切り文字として Split関数で配列にして
「OR」条件で連結

すれば可能だと思われます。

フォーム上に

txt検索:テキストボックス
検索ボタン:コマンドボタン

を配置してイミディエトウィンドウで結果を確認してみて下さい。

Private Sub 検索ボタン_Click()
Dim Kensaku As String
Dim S As Variant
Dim I As Long
  If InStr(1, Me.txt検索.Value, ",") > 0 Then
    S = Split(Me.txt検索.Value, ",")
      For I = 0 To UBound(S, 1)
        Kensaku = Kensaku & "[質問] LIKE '*" & S(I) & "*' Or "
      Next
    Kensaku = Left(Kensaku, Len(Kensaku) - 3)
  Else
    Kensaku = "[質問] LIKE '*" & Me.txt検索.Value & "*'"
  End If
  
  Debug.Print Kensaku
End Sub

外していたらすみません。
・ツリー全体表示

【5570】複数条件を一つのコントロールに入れて検索
質問  cya  - 05/7/7(木) 11:04 -

引用なし
パスワード
   Access初心者です。
会社に寄せられた業務の質問−解答の内容の文章から、閲覧したい質問−解答を検索できるシステムをつくってます。2つのテキストボックスに入力した用語であいまい検索を行って抽出することはできたんですが、一つのテキストボックスに、検索wordをカンマで区切って入力していくようなことってできますか?たとえば、テキストボックスの中に、(お茶,コーヒー,コーラ)などのようにいれてそれぞれの用語が含まれる質問−解答を抽出したいということです。
まったくやり方が思いつかないので、具体的なことがご説明できなくてすいません。
ご教授おねがいします
・ツリー全体表示

【5569】Re:テーブルの作り方
発言  小僧  - 05/7/7(木) 10:20 -

引用なし
パスワード
   ▼buti さん:
おはようございます。

>>例えば会社の同僚の住所録テーブルを作成するとすると、
>>会社の情報(社員コード、部署、役職など)と
>>プライベートな情報(血液型、住所、電話番号など)は別テーブルになります。
>
>この場合は、両方に社員コードを持つと考えて良いのでしょうか?

ユニークな(そのテーブルで重複しない)値であれば何でも良いと思います。
例えば「社員名」を両方のテーブルに持たせてリレーションを張ることもできますが、
同姓同名の人がいる可能性は0ではないのでやはり「社員コード」が適当かと思われます。

>一つのIDでいくつものテーブルとつなげるというのはテーブル作成を行う上では
>あまりない事なのでしょうか?

>これは選択クエリで全部参照してしまうという方法で解決できないものなの
>でしょうか?

結局正規化に関しては、「可能」「不可能」の問題ではなくて
「効率的」「非効率的」の問題だと思います。
複雑にテーブルを分割してもSQL や VBA を駆使すれば結果を返す事は可能ですが、
メンテナンスや他の人が使用する事を考えると「正規化をしましょう」という事になるのでしょう。

具体的にbuti さんがどのような業務でどのような運用をされるのかが解らないので
(いや、教えて頂いてもですけど)「これが最適です」というアドバイスができなくて申し訳ないです。
・ツリー全体表示

【5568】Re:データの切捨てについて教えてください...
お礼  NEMOTAKE  - 05/7/7(木) 8:12 -

引用なし
パスワード
   ▼Gin_II さん

ご意見ありがとうございます。
またなにかありましたらよろしくお願いします。
・ツリー全体表示

【5567】Re:テーブルの作り方
質問  buti  - 05/7/6(水) 22:25 -

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

こんばんは。返信ありがとうございます。

>ご質問の内容は「テーブルの正規化」という事ですね。
>Web で検索すると色々出てきますので参照してみて下さい。

正規化についてはMS社他のwebでの例題ではなんとなくわかるのですが
自分のテーブルで考えると難しいです(ToT)

一応、T家族、T銀行、T支店、T地区のようにIDを別につけられるものは
出来るだけ分けています。
それでもT会員のフィールドが多いです。

>例えば会社の同僚の住所録テーブルを作成するとすると、
>会社の情報(社員コード、部署、役職など)と
>プライベートな情報(血液型、住所、電話番号など)は別テーブルになります。

この場合は、両方に社員コードを持つと考えて良いのでしょうか?

ちょっと意味合いは違いますが、今回の質問もちょっと似ている?
と(何となく)思います。

>1つのテーブルに全ての情報を持たせてしまうと、
>その人の会社に関するデータを更新したくても
>全てのデータを引っ張ってきてしまうので、
>あまり効率的ではありません。

似たような思いからテーブルを分けてみようかなと思ったわけです。
が、webで見た例題でも今回の質問のように
 テーブル1 ID ------ テーブル2 ID
 テーブル1 ID ------ テーブル3 ID
 テーブル1 ID ------ テーブル3 ID
と一つのIDでいくつものテーブルとつなげているものが見当たりませんでした。
他にもT会員とリレーションで結んでいるものがあるので、実際にはもっと
増えます。

webの例題であまり見かけないことなので、同じIDをそれぞれにもたせて
テーブルを分割する方法はどうなのか?(まずいのか?)という思いから
質問をさせていただきました。

一つのIDでいくつものテーブルとつなげるというのはテーブル作成を行う上では
あまりない事なのでしょうか?

>逆に「社員番号xxxxのデータを全て見たい」などの場合には
>同じIDで結び付けられた社員をテーブル毎に参照しにいくので
>この場合は1つの大きなテーブルがあった方が効率が良くなります。

これは選択クエリで全部参照してしまうという方法で解決できないものなの
でしょうか?

>適度(これが一番難しいですよね…)な所まで正規化を進めていきましょう。

難しいです。正規化。きっとまだ良く理解していないのだ思います。
・ツリー全体表示

【5566】Re:データの切捨てについて教えてください...
回答  Gin_II  - 05/7/6(水) 18:08 -

引用なし
パスワード
   >INT(データ*10)/10 結果12345.6になります。
>算式でない方法はないのでしょうか?
>このやりかた以外ないのか教えてください。

Access には、Excelの RoundDown ワークシート関数のようなものは存在しません。
という回答でいいのでしょうか?

Round というVBA関数はありますが、こちらは銀行式丸め処理ですね。
・ツリー全体表示

【5565】データの切捨てについて教えてください。
質問  NEMOTAKE  - 05/7/6(水) 17:52 -

引用なし
パスワード
   データの切捨てでいい方法があったら教えてください。
今小数点以下を切り捨てる場合、私は、
例)データ 12345.6789のとき、
INT(データ)  結果12345
小数点2桁目を切り捨てる場合は
INT(データ*10)/10 結果12345.6になります。
算式でない方法はないのでしょうか?
このやりかた以外ないのか教えてください。
よろしくお願いします。
・ツリー全体表示

【5564】Re:テーブルの作り方
発言  小僧  - 05/7/6(水) 17:27 -

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

ご質問の内容は「テーブルの正規化」という事ですね。
Web で検索すると色々出てきますので参照してみて下さい。


テーブルを設計する際には、関連づけられる項目ごとに
テーブルを分ける事が一般的です。

例えば会社の同僚の住所録テーブルを作成するとすると、
会社の情報(社員コード、部署、役職など)と
プライベートな情報(血液型、住所、電話番号など)は別テーブルになります。

会社で昇進や転属があった場合、部署、役職などの変更はあっても
血液型が変わる事はありませんよね?

1つのテーブルに全ての情報を持たせてしまうと、
その人の会社に関するデータを更新したくても
全てのデータを引っ張ってきてしまうので、
あまり効率的ではありません。

逆に「社員番号xxxxのデータを全て見たい」などの場合には
同じIDで結び付けられた社員をテーブル毎に参照しにいくので
この場合は1つの大きなテーブルがあった方が効率が良くなります。

一般的にですが、正規化を進めれば進めるほど
更新は早くなり検索に時間がかかると言われているようです。

適度(これが一番難しいですよね…)な所まで正規化を進めていきましょう。
・ツリー全体表示

【5563】テーブルの作り方
質問  buti  - 05/7/6(水) 16:27 -

引用なし
パスワード
   こんにちは。

ちょっと質問するのも恥ずかしいのですが

テーブル1
ID(主キー)
フィールド1
  ・
  ・
  ・
フィールド120
のようにテーブルのフィールド数が多い場合
ある程度のグループ?に分け

テーブル1     テーブル2     テーブル3     テーブル4
ID(主キー)   ID(主キー)   ID(主キー)   ID(主キー)
フィールド1    フィールド31   フィールド61   フィールド91   
  ・        ・        ・        ・
  ・        ・        ・        ・
フィールド30   フィールド60   フィールド90   フィールド120

のように分けテーブル1のIDにテーブル2〜4のIDをリレーションで結ぶという
ようなテーブルの作り方はOKなのでしょうか?

よろしくお願いします
・ツリー全体表示

【5562】Re:置換
発言  小僧  - 05/7/6(水) 10:53 -

引用なし
パスワード
   ▼スラきち さん:
おはようございます。

当方が思いつく限り3つの方法があると思われます。

1) 変換表 Excel をテーブルとみなして SQL を発行する。

2) オートメーションを使用してExcelから必要な値を引っ張ってくる。

3) 変換表 Excel をAccess に取り込んでから作業。

どの方法でもVBAで操作できます。

※こちらの掲示板ではマルチポスト(複数の掲示板にまったく同じ話題を
投稿すること)容認されてますが、他の掲示板には禁止となっている所も
もちろんあります。気をつけましょう。
・ツリー全体表示

【5561】置換
質問  スラきち  - 05/7/5(火) 17:54 -

引用なし
パスワード
   ACCESS2003でテーブルのデータ内の2つの列の文字を、Excelの変換表を用いて3つの列に変換したいのですが、どのようにすればいいのですか??



変換前

ACCESS       Excel
列1 列2     列1 列2 列3 列4 列5
1  1      1  1  1  1  2   
1  1      1  1  1  1  2
2  2      2  2  2  2  5
3  4      3  4  2  2  6

変換後

ACCESS
列3 列4 列5
1  1  2
1  1  2
2  2  5
2  2  6
・ツリー全体表示

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