Access VBA質問箱 IV

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

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


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

【12380】Re:テーブル同士で値の変更
回答  かるびの  - 13/7/7(日) 15:49 -

引用なし
パスワード
   >氏名テーブル(元の名前です)
>ID|支払コード|金額
>1 |A0001   |300
>2 |B0002   |400
>3 |C0003   |1
>4 |C0003   |500
>5 |A0001   |300
 こういうテーブルであれば、金額フィールドを別テーブルに分ける必要はありません。


>結果クエリ
>支払コード|金額|
>B0002   |400
>C0003   |500
>支払コードと金額を変更させたい

 このクエリですが、どういうクエリなんでしょうか。
 【12372】からすれば、氏名テーブルを元にして、支払コードでグループ化して
金額の合計を出す集計クエリのように思えますが、
他方で、氏名テーブルのIDが2であるレコードとIDが4であるレコードを抽出した
選択クエリとも思えます。

 また、支払コードと金額を変更させたいということですが、
何から何に変更したいというのでしょうか。
  
 【12372】を見ると、現在の結果クエリはとりあえずできあがっているようですが、
希望する結果クエリの内容によっては、
現在の結果クエリをベースにして新たにクエリを作るのではなく、
現在の結果クエリ自体を見直す必要もあると思います。
・ツリー全体表示

【12379】Re:別ファイルのテーブルを別ファイルに...
回答  hatena  - 13/7/6(土) 21:00 -

引用なし
パスワード
   ▼situmonsya さん:
>最後の方法でうまくいきました。

その後、別件を調べていて偶然気がついたのですが、
IN句を使って、テーブル作成した場合、主キーやインデックス、値要求の設定が受け継がれません。

それらの設定も受け継がせたいときは、やはり、OpenCurrentDatabase → TransferDatabase でインポートまたはエクスポートする必要があります。

念のために報告しておきます。
・ツリー全体表示

【12378】Re:VBAで一括エクスポートさせる際にレコ...
お礼  中村  - 13/7/6(土) 10:06 -

引用なし
パスワード
   かるびの さん

お世話になっております。

> TrasferTextを実行する前に、クエリのレコード数を調べたらどうですか。
>
>If DCount("主キーフィールド名","Q_1") >0 then
>  DoCmd.TransferText "", "Q_1", "C:\***" & ・・・・・・・・
>End If

教えて頂きましたこちらの内容で理想の結果が得られました。
この度はご丁寧にありがとうございました。

また何かありましたら宜しくお願いします。
・ツリー全体表示

【12377】Re:VBAで一括エクスポートさせる際にレコ...
回答  かるびの  - 13/7/6(土) 3:17 -

引用なし
パスワード
    TrasferTextを実行する前に、クエリのレコード数を調べたらどうですか。

If DCount("主キーフィールド名","Q_1") >0 then
  DoCmd.TransferText "", "Q_1", "C:\***" & ・・・・・・・・
End If
・ツリー全体表示

【12375】VBAで一括エクスポートさせる際にレコー...
質問  中村  - 13/7/5(金) 11:14 -

引用なし
パスワード
   VBAで一括エクスポートさせる際にレコード数が0の時はエクスポートさせない方法

Access ver. 2010
OS Windows7

はじめまして。お世話になります、中村と申します。

現在、1つのテーブルから複数の抽出条件でクエリを作成し、
その複数のクエリを一括でCSVにエクスポートできるようにしています。
しかし、テーブルの内容を都度リセットして更新するような使い方をしている関係で
クエリによってはレコードが0の場合も出てきます。
その場合、空白のCSVとiniファイルがエクスポートされてしまいます。

そこで、レコードが0の場合はエクスポートしないという分を追加したいのですが
自分の知識では分からず、こちらに質問させて頂きました。

現在のVBAは以下の通りです。

---

Private Sub export_Click()

Dim intReturn As Integer

intReturn = MsgBox("○○をエクスポートします" & vbNewLine & "本当によろしいですか?", vbQuestion + vbYesNo, "確認")
If intReturn = vbNo Then Exit Sub

On Error GoTo cmdエクスポート_Click_Err

  DoCmd.TransferText acExportDelim, "", "Q_1", "C:\***" & "\***_" & Forms!Menu!codef & "_" & Format(Now(), "yyyymmddhhnnss") & ".csv", False, ""
  DoCmd.TransferText acExportDelim, "", "Q_2", "C:\***" & "\***_" & Forms!Menu!codef & "_" & Format(Now(), "yyyymmddhhnnss") & ".csv", False, ""
  DoCmd.TransferText acExportDelim, "", "Q_3", "C:\***" & "\***_" & Forms!Menu!codef & "_" & Format(Now(), "yyyymmddhhnnss") & ".csv", False, ""
  DoCmd.TransferText acExportDelim, "", "Q_4", "C:\***" & "\***_" & Forms!Menu!codef & "_" & Format(Now(), "yyyymmddhhnnss") & ".csv", False, ""
  DoCmd.TransferText acExportDelim, "", "Q_5", "C:\***" & "\***_" & Forms!Menu!codef & "_" & Format(Now(), "yyyymmddhhnnss") & ".csv", False, ""
  
  MsgBox "エクスポートが完了しました" & vbNewLine & "OKをクリックすると保存されたフォルダが開きます", vbInformation, "エクスポート"
  Call Shell("Explorer /root,c:\***", 1)

cmdエクスポート_Click_Exit:
  Exit Sub

cmdエクスポート_Click_Err:
  MsgBox Error$
  Resume cmdエクスポート_Click_Exit

End Sub

---

何卒、宜しくお願いします。
・ツリー全体表示

【12374】Re:テーブル同士で値の変更
質問  ナナパパ  - 13/7/4(木) 21:23 -

引用なし
パスワード
   ▼かるびの さん:
>>希望の結果クエリ
>>|会社名 |件数
>>|太郎建設|100
>>|三郎建設|20
>
> これは、どういうことをやりたいんですか。
> 
>   SELECT 会社名,件数
>   FROM 氏名
>   WHERE ID = 1 OR ID = 4
>というクエリを実行すれば、上記の結果になりますが、
>「IDが1又は4であるレコード」なんていう抽出条件では、おそらく意味を成しませんよね。
>
>
>>氏名テーブル
>>ID |名前|会社名 |件数
>>1 |太郎|太郎建設|100
>>2 |二郎|二郎建設|300
>>3 |一郎|一郎建設|10
>>4 |三郎|三郎建設|20
> さらに、氏名テーブルに「件数」フィールドがあるというのは、かなり理解しがたいです。
> 件数は人の属性である、
>つまり、時期がいつであるかにかかわらず、人が決まれば件数が決まる
>というものなのであれば、氏名テーブルに件数フィールドを持たせてもいいと思いますが、
>おそらく、件数は、人が同じでも、時期が違えば件数が変わるというものなのでしょうから、
>件数は、別のテーブルに持たせるべきです。
> 「テーブルの正規化」ということを考えてみてください。
>
> テーブルが正規化されていないと、無駄に複雑なクエリやVBAを組むことになりますし、
>その場合、コンピュータの処理速度も遅くなるし、
>BBSで質問しようとしてももなかなか回答がつかないし、
>いいことは何もないです。
>
> 「テーブルの正規化」についての詳しいことは、ネットで検索してください。
> 私も正確なところはよくわかっていませんが、
>極めて大雑把に言うと、コンピュータにとって使いやすいようにテーブルを分けることです。
>そして、正規化されたテーブルは人間にとっては見づらいです。


お返事有難うございます
> これは、どういうことをやりたいんですか。
大変申し訳ないです
テーブルは例題です
本当のフィールド名は違います

氏名テーブル(元の名前です)
ID|支払コード|金額
1 |A0001   |300
2 |B0002   |400
3 |C0003   |1
4 |C0003   |500
5 |A0001   |300
上記のように置き返れば解りやすかったかもしれません


会社名称変換テーブル(元の名前です)
ID|変更前|変更後|
1 |C0003 |A0001
本来支払をしなければならないコードに対して

結果クエリ
支払コード|金額|
B0002   |400
C0003   |500
支払コードと金額を変更させたい

色々なご指摘有難うございます
テーブルの正規化は
名前程度ですが存知上げています
これを機会に勉強させて頂きたいと思います

ほぼ上記に近テーブル状態です
分ける必要ありますか?

質問に対して混乱を招いてしまって申し訳ありません
・ツリー全体表示

【12373】Re:テーブル同士で値の変更
回答  かるびの E-MAIL  - 13/7/4(木) 20:45 -

引用なし
パスワード
   >希望の結果クエリ
>|会社名 |件数
>|太郎建設|100
>|三郎建設|20

 これは、どういうことをやりたいんですか。
 
   SELECT 会社名,件数
   FROM 氏名
   WHERE ID = 1 OR ID = 4
というクエリを実行すれば、上記の結果になりますが、
「IDが1又は4であるレコード」なんていう抽出条件では、おそらく意味を成しませんよね。


>氏名テーブル
>ID |名前|会社名 |件数
>1 |太郎|太郎建設|100
>2 |二郎|二郎建設|300
>3 |一郎|一郎建設|10
>4 |三郎|三郎建設|20
 さらに、氏名テーブルに「件数」フィールドがあるというのは、かなり理解しがたいです。
 件数は人の属性である、
つまり、時期がいつであるかにかかわらず、人が決まれば件数が決まる
というものなのであれば、氏名テーブルに件数フィールドを持たせてもいいと思いますが、
おそらく、件数は、人が同じでも、時期が違えば件数が変わるというものなのでしょうから、
件数は、別のテーブルに持たせるべきです。
 「テーブルの正規化」ということを考えてみてください。

 テーブルが正規化されていないと、無駄に複雑なクエリやVBAを組むことになりますし、
その場合、コンピュータの処理速度も遅くなるし、
BBSで質問しようとしてももなかなか回答がつかないし、
いいことは何もないです。

 「テーブルの正規化」についての詳しいことは、ネットで検索してください。
 私も正確なところはよくわかっていませんが、
極めて大雑把に言うと、コンピュータにとって使いやすいようにテーブルを分けることです。
そして、正規化されたテーブルは人間にとっては見づらいです。
・ツリー全体表示

【12372】Re:テーブル同士で値の変更
質問  ナナパパ  - 13/7/4(木) 17:36 -

引用なし
パスワード
   ▼かるびの さん:
>方法1 
>
> SELECT T1.名前
>    ,IIF(IsNull(T2.変更後)=True
>      ,T1.会社名
>      ,T2.変更後
>      ) AS 社名
> FROM 氏名 AS T1
>   LEFT JOIN 会社名称変換 AS T2
>   ON T1.会社名=T2.変更前
>
>方法2
>
> SELECT T1.名前
>    ,T1.会社名
> FROM 氏名 AS T1
>   LEFT JOIN 会社名称変換 AS T2
>   ON T1.会社名=T2.変更前
> WHERE T2.変更後 Is Null
> UNION ALL
> SELECT T3.名前
>    ,T4.変更後
> FROM 氏名 AS T3
>   INNER JOIN 会社名称変換 AS T4
>   ON T3.会社名=T4.変更前
>
> でも、どっちの方が速いんだろうか。
> 方法1だと、IIF関数を使う点で遅そうだし、
>方法2だと、抽出条件で Is Null を使う点で遅くなりそうだし、
>また、ユニオンクエリだという点で時間が余計にかかりそうだし。
>
>
> なお、従来の氏名テーブルを分けて、
>   「名前」テーブル
>      名前ID  長整数型又はオートナンバー型(主キー)
>      名前   テキスト型
>      会社ID  長整数型
>   「会社名」テーブル
>      会社ID  長整数型又はオートナンバー型(主キー)
>      会社名  テキスト型
>というテーブル構成にした方がデータベース的です。
> 会社名の変更があった場合も、
>「会社名」テーブルの「会社名」フィールドの値を書き替えれば済むので、
>対応しやすくなります。


書いてなかったですが件数も置き換えしたいのですが
氏名テーブル
ID |名前|会社名 |件数
1 |太郎|太郎建設|100
2 |二郎|二郎建設|300
3 |一郎|一郎建設|10
4 |三郎|三郎建設|20

会社名称変換テーブル
ID|変更前 |変更後 
1 |一郎建設|太郎建設
2 |二郎建設|太郎建設

現在の結果クエリ
|会社名 |件数
|太郎建設|410
|三郎建設|20

希望の結果クエリ
|会社名 |件数
|太郎建設|100
|三郎建設|20

何度も申し訳ありませんが
ご教授頂ければ幸いです
・ツリー全体表示

【12371】Re:テーブル同士で値の変更
お礼  ナナパパ  - 13/7/4(木) 14:24 -

引用なし
パスワード
   ▼かるびの さん:
> 私の前回回答は、サンプルを作って実験してみることなく回答したものでした。
>そこで、今回サンプルを作って実験してみました。
> ちゃんと希望どおりのクエリになりました。
>
>>方法1を採用させて頂きたく
>>設定しましたが
>とのことですが、ちゃんとクエリのSQLビューにSQL文を書きましたか。


できました
すみません 勘違いしてました
名前に対して変更前、変更後を入れてました。
本当にすみません

実装までして頂きご教授有難う御座います
・ツリー全体表示

【12370】Re:テーブル同士で値の変更
質問  ナナパパ  - 13/7/4(木) 11:49 -

引用なし
パスワード
   ▼かるびの さん:
> 私の前回回答は、サンプルを作って実験してみることなく回答したものでした。
>そこで、今回サンプルを作って実験してみました。
> ちゃんと希望どおりのクエリになりました。
>
>>方法1を採用させて頂きたく
>>設定しましたが
>とのことですが、ちゃんとクエリのSQLビューにSQL文を書きましたか。

同様のテーブルでユニオンクエリも試したところ結果は同じでした

結果クエリ2
SELECT T1.名前, T1.会社名 FROM 氏名 AS T1 LEFT JOIN 会社名称変換 AS T2 ON T1.会社名=T2.変更前
WHERE T2.変更後 Is Null
UNION ALL
SELECT T3.名前,T4.変更後 FROM 氏名 AS T3 INNER JOIN 会社名称変換 AS T4 ON T3.会社名=T4.変更前;
・ツリー全体表示

【12369】Re:テーブル同士で値の変更
質問  ナナパパ  - 13/7/4(木) 11:13 -

引用なし
パスワード
   ▼かるびの さん:
> 私の前回回答は、サンプルを作って実験してみることなく回答したものでした。
>そこで、今回サンプルを作って実験してみました。
> ちゃんと希望どおりのクエリになりました。
>
>>方法1を採用させて頂きたく
>>設定しましたが
>とのことですが、ちゃんとクエリのSQLビューにSQL文を書きましたか。


再確認させてください
自分でやったことを報告します

【テーブル名】氏名
ID(オートナンバー)主キー|名前(テキスト型)|会社名(テキスト型)


【テーブル名】会社名称変換
ID(オートナンバー)主キー|変更前(テキスト型)|変更後(テキスト型)

【結果クエリ】
SELECT T1.名前,IIF(IsNull(T2.変更後)=True,T1.会社名,T2.変更後) AS 社名
FROM 氏名 AS T1 LEFT JOIN 会社名称変換 AS T2 ON T1.会社名=T2.変更前

上記方法で設定したにもかかわらず結果が得られません
何度も申し訳ありません
・ツリー全体表示

【12368】Re:テーブル同士で値の変更
回答  かるびの  - 13/7/4(木) 2:16 -

引用なし
パスワード
    私の前回回答は、サンプルを作って実験してみることなく回答したものでした。
そこで、今回サンプルを作って実験してみました。
 ちゃんと希望どおりのクエリになりました。

>方法1を採用させて頂きたく
>設定しましたが
とのことですが、ちゃんとクエリのSQLビューにSQL文を書きましたか。
・ツリー全体表示

【12367】Re:テーブル同士で値の変更
質問  ナナパパ  - 13/7/3(水) 18:24 -

引用なし
パスワード
   ▼かるびの さん:
>方法1 
>
> SELECT T1.名前
>    ,IIF(IsNull(T2.変更後)=True
>      ,T1.会社名
>      ,T2.変更後
>      ) AS 社名
> FROM 氏名 AS T1
>   LEFT JOIN 会社名称変換 AS T2
>   ON T1.会社名=T2.変更前
>
>方法2
>
> SELECT T1.名前
>    ,T1.会社名
> FROM 氏名 AS T1
>   LEFT JOIN 会社名称変換 AS T2
>   ON T1.会社名=T2.変更前
> WHERE T2.変更後 Is Null
> UNION ALL
> SELECT T3.名前
>    ,T4.変更後
> FROM 氏名 AS T3
>   INNER JOIN 会社名称変換 AS T4
>   ON T3.会社名=T4.変更前
>
> でも、どっちの方が速いんだろうか。
> 方法1だと、IIF関数を使う点で遅そうだし、
>方法2だと、抽出条件で Is Null を使う点で遅くなりそうだし、
>また、ユニオンクエリだという点で時間が余計にかかりそうだし。
>
>
> なお、従来の氏名テーブルを分けて、
>   「名前」テーブル
>      名前ID  長整数型又はオートナンバー型(主キー)
>      名前   テキスト型
>      会社ID  長整数型
>   「会社名」テーブル
>      会社ID  長整数型又はオートナンバー型(主キー)
>      会社名  テキスト型
>というテーブル構成にした方がデータベース的です。
> 会社名の変更があった場合も、
>「会社名」テーブルの「会社名」フィールドの値を書き替えれば済むので、
>対応しやすくなります。


お世話になります
方法1を採用させて頂きたく
設定しましたが
エラーも無く変換も無く
表示されました。。

もう少しご教授頂ければ幸いです
・ツリー全体表示

【12366】Re:テーブル同士で値の変更
回答  かるびの  - 13/7/3(水) 1:25 -

引用なし
パスワード
   方法1 

 SELECT T1.名前
    ,IIF(IsNull(T2.変更後)=True
      ,T1.会社名
      ,T2.変更後
      ) AS 社名
 FROM 氏名 AS T1
   LEFT JOIN 会社名称変換 AS T2
   ON T1.会社名=T2.変更前

方法2

 SELECT T1.名前
    ,T1.会社名
 FROM 氏名 AS T1
   LEFT JOIN 会社名称変換 AS T2
   ON T1.会社名=T2.変更前
 WHERE T2.変更後 Is Null
 UNION ALL
 SELECT T3.名前
    ,T4.変更後
 FROM 氏名 AS T3
   INNER JOIN 会社名称変換 AS T4
   ON T3.会社名=T4.変更前

 でも、どっちの方が速いんだろうか。
 方法1だと、IIF関数を使う点で遅そうだし、
方法2だと、抽出条件で Is Null を使う点で遅くなりそうだし、
また、ユニオンクエリだという点で時間が余計にかかりそうだし。


 なお、従来の氏名テーブルを分けて、
   「名前」テーブル
      名前ID  長整数型又はオートナンバー型(主キー)
      名前   テキスト型
      会社ID  長整数型
   「会社名」テーブル
      会社ID  長整数型又はオートナンバー型(主キー)
      会社名  テキスト型
というテーブル構成にした方がデータベース的です。
 会社名の変更があった場合も、
「会社名」テーブルの「会社名」フィールドの値を書き替えれば済むので、
対応しやすくなります。
・ツリー全体表示

【12365】テーブル同士で値の変更
質問  ナナパパ  - 13/7/2(火) 20:12 -

引用なし
パスワード
   お世話になります

access2003です。
二つのテーブルを比較して名称変更をselect文で
表示させたいのですが方法がわかりません

氏名テーブル
ID |名前|会社名
1 |太郎|太郎建設
2 |二郎|二郎建設
3 |一郎|一郎建設
4 |三郎|三郎建設

会社名称変換テーブル
ID|変更前 |変更後 
1 |一郎建設|太郎建設
2 |二郎建設|太郎建設

結果クエリ
名前|会社名
太郎|太郎建設
二郎|太郎建設
一郎|太郎建設
三郎|三郎建設

わかる方ご教授いただければ幸いです。
・ツリー全体表示

【12364】Re:データの集計
回答  hatena  - 13/7/1(月) 19:08 -

引用なし
パスワード
   ▼だいすけ さん:
>フィールドに「登録日時」、テーブル「A」、集計「グループ化」

このフィールドを下記の式に変更してください。


登録日: DateValue([登録日時])
・ツリー全体表示

【12363】データの集計
発言  だいすけ  - 13/7/1(月) 15:16 -

引用なし
パスワード
   今Aのデータとして
・ファイル
・登録日時
・担当部署
とあります。300弱データほどです。

登録日時のデータ内容は
2013/07/01 15:00
というように
yyyy/mm/dd **:**
というデータ型です。

今、日付毎の件数を出したいのですが、
フィールドに「登録日時」、テーブル「A」、集計「グループ化」
次のフィールドに「登録日時」、テーブル「A」、集計「カウント」
と設定するとデータの時間で振り分けられてしまい、日付ごとの集計が出来ません。
条件としてあとどの様にしたらうまくいきますでしょうか?
・ツリー全体表示

【12362】Re:別ファイルのテーブルを別ファイルに...
お礼  situmonsya  - 13/6/30(日) 9:51 -

引用なし
パスワード
   最後の方法でうまくいきました。
ありがとうございました。
・ツリー全体表示

【12361】Re:【御礼】複数のテキストボックスに入...
回答  hatena  - 13/6/28(金) 19:50 -

引用なし
パスワード
   ▼ちゃぴんこくん さん:
>実際に部品コードは、アルファベットを含みますのでもう一ひねりしてみます。

ということは部品コードはテキスト型なんですね。

ならば、最初の変数宣言で、

Dim V As String

とすればいいだけです。
・ツリー全体表示

【12360】【御礼】複数のテキストボックスに入力し...
お礼  ちゃぴんこくん  - 13/6/28(金) 19:19 -

引用なし
パスワード
   早速のご教示ありがとうございます。

初めてVBAのようなものを見よう見真似で手掛けてみたので
全てがイベントプロシージャーとして記述していました。

Function プロシージャーとしてこんなふうに記述できるんですね。
お蔭様で複数個のテキストボックスのイベントプロシージャーを変更せずに済んで
大助かりです。

各txt_BOX名の数値部分を増加するループで処理できるのではと考えたイメージは
あっていたみたいで、ちょびっとほっこりしています。
その取得にVal関数とMid関数で数値部分を取得するって考えには及びませんでしたけど・・・

>  N = Val(Mid(ctl.Name, 9))

また、SelStartプロパティでカーソルの位置を取得したり、位置を設定したり、
SelLengthプロパティでは、文字数を得ることができることを知りました。

CancelEventメソッドで引数Cancelを呼び出すなど、勉強させていただきました。

実際に部品コードは、アルファベットを含みますのでもう一ひねりしてみます。

この度は、誠にありがとうございました。
・ツリー全体表示

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