Access VBA質問箱 IV

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

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


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

【6981】Re:エクスポートしたデータに...
回答  小僧  - 05/12/15(木) 15:10 -

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

>ここまでは簡単にできたのですが

という事で、エクスポートした CSVファイル に日付を書き込むサンプルコードです。

Sub CSVファイルに追加()
Dim csvPath As String  'CSVファイルへのフルパス
Dim csvName As String  'CSVファイル名
Dim FSO As Object
Dim F As Object

  csvPath = "C:\"
  csvName = "Test.csv"

  Set FSO = CreateObject("Scripting.FileSystemObject")
  
  Set F = FSO.CreateTextFile(csvPath & "Temp.csv")
    F.WriteLine Date
    F.Write FSO.OpenTextFile(csvPath & csvName).ReadAll
    F.Close: Set F = Nothing
    
  FSO.DeleteFile csvPath & csvName
  FSO.MoveFile csvPath & "Temp.csv", csvPath & csvName
  Set FSO = Nothing
End Sub


CSVファイル ---- IT用語辞典より

フルスペル : Comma Separated Values
別名 : コンマ区切り

データをカンマ(",")で区切って並べたファイル形式。


日付を1行目に入れてしまう時点でCSVファイルと呼べるものではなくなってしまうのですが…。
・ツリー全体表示

【6980】フォームから次のフォームに行くには
質問  にしもり  - 05/12/15(木) 12:03 -

引用なし
パスワード
   こんにちは。
vbaの質問ではないかもしれませんが教えてください。
最近フォームを使いはじめました。いまFORM01、 FORM02があります。
FORM01はウィザードで作り、開けると店コード、店名、担当者が出ます。
20000レコードくらいで帳票形式ででます。

いまFORM01の店コードをクリックすると、
FORM02が開いて、FORM01にはない詳細(住所、電話など)がでるようにしたいのです。

FORM01のプロパティでクリック時イベントにマクロか何かをビルドすればいいのでしょうか??
どなたかご教示ください。
・ツリー全体表示

【6979】エクスポートしたデータに...
質問  フク  - 05/12/15(木) 11:55 -

引用なし
パスワード
   VBA初心者です。

意味のわからない質問かもしれませんが、
レコードをcsvファイルでエクスポートする際に、
マクロとフォームを活用して、特定の日付の
レコードだけを抽出、反映させたいと思います。
ここまでは簡単にできたのですが、その日付を
csvファイルの中に記述することはできますで
しょうか?例えば、下記のような感じです。

--------------------------------------------
2005/12/14
001,ボール,10
004,ラケット,5
006,シューズ,6
--------------------------------------------

1行目がその反映させたい箇所で、2行目以降は
レコードの抽出結果です。

わかりにくい表現で申し訳ございませんが、
宜しくお願いいたします。
・ツリー全体表示

【6977】Re:コンボボックスのスペースキー操作。
回答  中西 健  - 05/12/14(水) 22:23 -

引用なし
パスワード
    まのえさんこんばんは
 やってみましたがエラーは発生しないで意図通り動いていました。
 当方Access2003 sp2 windowsXP
・ツリー全体表示

【6976】Re:前後のデータをスクロールで表示
お礼  マサ  - 05/12/14(水) 14:04 -

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

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

【6975】Re:前後のデータをスクロールで表示
回答  小僧  - 05/12/14(水) 13:50 -

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

>得意先データの表示順序が昇順になっていません。

元々、Access (に限らずデータベース) において、並び順というものは存在しません。

Microsoft サポートページより MDB のレコードの並び順について
http://support.microsoft.com/default.aspx?scid=kb;ja;834927


現在規則通りにならんでいるデータも、ある日突然狂ってしまう場合があります。


>得意先コード:テキスト型 インデックス(重複なし)
>テーブルを表示した順序

該当のテーブルをデザインビューで開き、
ツールバーの [表示] → [インデックス] でインデックスの状態を確認されてみてください。

「並び替え順序」という項目を指定しているため、
テーブルの表示においては並び順が保証されています。

ところが、先に当方が提示させて頂いたコードには何も指定せずにテーブルを開いているために、
並び順に関しては何も保証がされない事になってしまいます。

そこで Recordset を Open する前に並び順について明記してみましょう。

Private Sub 次へ_Click()
'要参照 Microsoft DAO x.x Object Library
Dim RS As DAO.Recordset
Dim strSQL As String
Dim strCode As String
  
  strSQL = "SELECT * FROM テーブル名 ORDER BY 得意先コード"
  
  Set RS = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
  strCode = Me.txt得意先コード.Value
  
  RS.FindFirst "得意先コード = '" & strCode & "'"
  RS.MoveNext
  If Not RS.EOF Then strCode = RS![得意先コード]
    Call xxx(strCode)
  RS.Close
  Set RS = Nothing
End Sub
・ツリー全体表示

【6974】Re:前後のデータをスクロールで表示
お礼  マサ  - 05/12/14(水) 13:15 -

引用なし
パスワード
   小僧さん。
 ありがとうございました。お蔭で前後のデータ表示が上手く出来るようになりました。
 因みに リストボックスは必ずしも必要はありませんネ。
 もう1つ教えて頂きたいのですが、スクロールのテストをして初めて気が付いたのでが 得意先データの表示順序が昇順になっていません。
 テーブル:得意先マスタ
 得意先コード:テキスト型 インデックス(重複なし)
 テーブルを表示した順序
 1
 11
 123
 2
 22
 3
 これをスクロールで表示すると
 1
 2
 3
 11
 123
 と なります
 何故ですか。初歩的なこてで申しわけありませんがお教え下さい
・ツリー全体表示

【6973】Re:2つのテーブルをひとつに
お礼  buti  - 05/12/14(水) 9:18 -

引用なし
パスワード
   ▼Gin_II さん:
▼かみちゃん さん:

おはようございます。

かみちゃんさんのユニオン→集計クエリ
Gin_IIさんのユニオン→集計クエリを一つにしたもの

どちらも結果を出すことが出来ました。

早々の回答に感謝いたしております。
ありがとうございました。
・ツリー全体表示

【6972】Re:抽出条件
お礼  keisuke  - 05/12/14(水) 8:53 -

引用なし
パスワード
   返事が遅くなってしまい、すみません。。。
お教えいただいたコードで無事できました。
有難うございました。
・ツリー全体表示

【6971】Re:2つのテーブルをひとつに
発言  かみちゃん  - 05/12/13(火) 23:23 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>2つのテーブルのフィールド数、項目は全て一緒です。
>
>テーブルA
>コード 項目1 項目2 項目3 項目4
>00001    0   0  100  200
>
>テーブルB
>コード 項目1 項目2 項目3 項目4
>00001   10   20   0   0
>
>の様になっています。

これをユニオンクエリで、
コード 項目1 項目2 項目3 項目4
00001    0   0  100  200
00001   10   20   0   0
のようにできませんか?
それができれば、そのクエリを元にした集計クエリにするだけだと思います。
・ツリー全体表示

【6970】Re:2つのテーブルをひとつに
回答  Gin_II  - 05/12/13(火) 23:20 -

引用なし
パスワード
   SELECT T.A AS コード
   , SUM(T.B) AS 項目1
   , SUM(T.C) AS 項目2
   , SUM(T.D) AS 項目3
   , SUM(T.E) AS 項目4
FROM (SELECT コード AS A
      , 項目1 AS B
      , 項目2 AS C
      , 項目3 AS D
      , 項目4 AS E
   FROM テーブルA
   UNION ALL
   SELECT コード
      , 項目1
      , 項目2
      , 項目3
      , 項目4
   FROM テーブルB) AS T
GROUP BY T.A

とかではどうでしょう?
・ツリー全体表示

【6969】2つのテーブルをひとつに
質問  buti  - 05/12/13(火) 22:58 -

引用なし
パスワード
   こんばんは
請求先の関係でVBAで計算処理した結果をテーブルA、テーブルBに入れてあります。
2つのテーブルのフィールド数、項目は全て一緒です。

テーブルA
コード 項目1 項目2 項目3 項目4
00001    0   0  100  200

テーブルB
コード 項目1 項目2 項目3 項目4
00001   10   20   0   0

の様になっています。
あらためて全て含めたもので計算処理してもよいのですが、クエリで

コード 項目1 項目2 項目3 項目4
00001   10   20  100  200

の様に出来ないものかとユニオンクエリで過去ログを見ましたがわかりませんでした。
よろしくお願いします。
・ツリー全体表示

【6968】Re:2年分の検索方法は?
発言  わん  - 05/12/13(火) 16:36 -

引用なし
パスワード
   早速の回答、有難うございます。

>残念ながらその通りです。
>
>D系関数(定義域集計関数…DLookupやDCountなど)は使い勝手が良いのですが
>参照するテーブルのレコード数が多くなると計算速度が落ちてしまいます。
>
>こちらのテストデータですと20件余りなので気にならなかったのですが
> わん さんが使用される環境ですと顕著に現れてしまうみたいですね…。

はい。
結果1、結果2というのはここで教えて頂くための例文のようなもので、
実際はこれに当たるものが12個あります。
ですから、
1つのフォーム又はクエリの中に
12個のDLookup関数を使用していることになります。
テスト中のデータ件数は803件しかないですから、
今のままでは、実際にはもっと遅くなるということですよね。


>>クエリ作成とフォーム上での作成と処理速度とは関係があるのでしょうか?
>
>こちらは処理速度には関係ないと思われます。
>(あくまで当方の考えですが…。)

前回教えて頂いたときに、
MDBの重さや速度のことをご指摘いただきましたので
今は少しは考えながらやっていますので、
なるべくデータ自体を減らし、できる限りフォーム内にて作成しております。

また、新たにLeftJoin句について教わりましたので、
実際のものに変更するのに時間がかかると思いますがやってみます。
出来上がりましたらご報告させていただきます。

とりあえず、お礼を申し上げます。
有難うございました。
・ツリー全体表示

【6967】Re:2年分の検索方法は?
回答  小僧  - 05/12/13(火) 15:21 -

引用なし
パスワード
   長くなりましたので、分けますね。

先ほどの結果をDLookupを使わないでやってみました。

SELECT テーブルI.日付,
テーブルI.名前,
テーブルI.結果1,
テーブルI.結果2,
IIf(Format([テーブルI].[日付],"mmdd")="0229",Null,DateAdd("yyyy",-1,[テーブルI].[日付])) AS 前年日付,
P.結果1 AS 前年結果1,
P.結果2 AS 前年結果2
FROM テーブルI LEFT JOIN [
SELECT IIf(Format(テーブルI.日付,"mmdd")="0229",Null,DateAdd("yyyy",1,テーブルI.日付)) AS 来年日付,
テーブルI.名前,
テーブルI.結果1,
テーブルI.結果2
FROM テーブルI
]. AS P
ON (テーブルI.日付 = P.来年日付) AND (テーブルI.名前 = P.名前)
ORDER BY テーブルI.日付;


DLookUPよりは速い結果が出ると良いのですが…。
・ツリー全体表示

【6966】Re:2年分の検索方法は?
発言  小僧  - 05/12/13(火) 15:17 -

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

>今回教えて頂いたことで1つわかったのですが、
>DLookUp関数を使うとフォーム上での速度が非常に遅くなるのですが、
>DLookUp関数は処理速度を遅くしてしまう関数なのですか?

残念ながらその通りです。

D系関数(定義域集計関数…DLookupやDCountなど)は使い勝手が良いのですが
参照するテーブルのレコード数が多くなると計算速度が落ちてしまいます。

こちらのテストデータですと20件余りなので気にならなかったのですが
わん さんが使用される環境ですと顕著に現れてしまうみたいですね…。


>クエリ作成とフォーム上での作成と処理速度とは関係があるのでしょうか?

こちらは処理速度には関係ないと思われます。
(あくまで当方の考えですが…。)


当方が作っている MDB は殆どクエリが存在しません。
先にご提示されている様にフォーム内に埋め込んでしまったり、

アクションクエリ(DELETE や INSERT など)については VBA にて

Docmd オブジェクトの RunSQL メソッド
DAO や ADO の Execute メソッド

にて実行してしまう為です。

作成段階で視覚的に SQL の実行結果を確認する場合などにクエリを作ったりしますが、
完成時には全て消去してしまいます。

ですが、複数人で MDB を製作したり後々の人のメンテナンスを考えると

Q_メインフォームの基
Q_前年度分結果

など、解りやすい名前でクエリを保存しておく方が良い場合もあると思います。
・ツリー全体表示

【6965】Re:前後のデータをスクロールで表示
回答  小僧  - 05/12/13(火) 14:43 -

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

フォームに以下のものを用意して下さい。

リストボックス:lst得意先コード
値集合ソース :SELECT テーブル名.得意先コード FROM テーブル名;

テキストボックス:txt得意先コード
         txt得意先名
         txt住所

コマンドボタン : 次へ
         前へ

フォームの読み込み時の右側の「…」をクリックしてコードビルダを選択。
表示された画面に

Private Sub Form_Load()
  Call xxx(DLookup("得意先コード", "テーブル名"))
End Sub

Private Sub lst得意先コード_AfterUpdate()
  Call xxx(Me.lst得意先コード.value)
End Sub

Private Sub 次へ_Click()
'要参照 Microsoft DAO x.x Object Library
Dim RS As DAO.Recordset
Dim strCode As String
  
  Set RS = CurrentDb.OpenRecordset("テーブル名", dbOpenSnapshot)
  strCode = Me.txt得意先コード.value
  
  RS.FindFirst "得意先コード = '" & strCode & "'"
  RS.MoveNext
  If Not RS.EOF Then strCode = RS![得意先コード]
    Call xxx(strCode)
  RS.Close
  Set RS = Nothing
End Sub


Private Sub 前へ_Click()
'要参照 Microsoft DAO x.x Object Library
Dim RS As DAO.Recordset
Dim strCode As String

  Set RS = CurrentDb.OpenRecordset("テーブル名", dbOpenSnapshot)
  strCode = Me.txt得意先コード.value
  
  RS.FindFirst "得意先コード = '" & strCode & "'"
  RS.MovePrevious
  If Not RS.BOF Then strCode = RS![得意先コード]
    Call xxx(strCode)
  RS.Close
  Set RS = Nothing
End Sub

Private Function xxx(strCode As String)
  Me.lst得意先コード = strCode
  Me.txt得意先コード = strCode
  Me.txt得意先名 = DLookup("得意先名", "テーブル名", "得意先コード ='" & strCode & "'")
  Me.txt住所 = DLookup("住所", "テーブル名", "得意先コード ='" & strCode & "'")
End Function


以上を記述して、動作を確認されてみて下さい。
・ツリー全体表示

【6964】Re:2年分の検索方法は?
発言  わん  - 05/12/13(火) 14:21 -

引用なし
パスワード
   お見事です!!
有難うございました。
これで完璧です。

今回教えて頂いたことで1つわかったのですが、
DLookUp関数を使うとフォーム上での速度が非常に遅くなるのですが、
DLookUp関数は処理速度を遅くしてしまう関数なのですか?

立ち上がるまでに1分ほど掛かってしまいます。
フィルタ検索をするときは5秒掛かるかどうかなで構わないと思いますが、
これは、私のやり方が悪いのでしょうか?

あと、SQL文はクエリ作成だけでなく同じものをフォーム上でも
作成できることがわかりました。
クエリ作成とフォーム上での作成と処理速度とは関係があるのでしょうか?
クエリ内での計算式はデータとして別利用しないものは、
フォーム上での作成の方が良いのでしょうか?

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

【6963】Re:前後のデータをスクロールで表示
質問  マサ  - 05/12/13(火) 13:45 -

引用なし
パスワード
   小僧さん。
お手数をお掛けします。
フォームは非連結のフォームです。得意先のテーブルは次の通りです
得意先コード:テキスト型
得意先名  :テキスト型
住所    : ↑


以上のようになっています。どうぞ宜しくお願いします。
・ツリー全体表示

【6962】Re:2年分の検索方法は?
発言  小僧  - 05/12/13(火) 13:15 -

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

>お世話になっています。
>恥ずかしながら、もう壁にぶつかってしまいました。

当方も壁にぶつかっては Help や MS の技術者情報のページと格闘してますよ^^;

>上記を利用すると例えばうるう年を含めた前後の年度、
>つまり2月29日が存在する年度では前年結果が非表示ではなく、
>前年の2月28日の結果が表示されてしまいます。

>DLookUp("結果1","テーブルI","Year([日付]) = " &
>Year([日付])-1 & "AND 名前 = '" & [名前] & "'") AS 前年結果1

こちらは、

・名前が一致して
・日付が去年のデータ

のうち、一番初めに見つかったものを返す式です。
したがって前年結果1 は月日に関係なく前年であれば値を引っ張ってきてしまいます。

>どうやったら未記入にできるのでしょうか?

日付まで意識して前年のものを取ってくるとすると、こんな感じでしょうか。

SELECT テーブルI.日付,
テーブルI.名前,
テーブルI.結果1,
テーブルI.結果2,
IIf(Format([日付],"mmdd")="0229",Null,DateAdd("yyyy",-1,[日付])) AS 前年度日付,
DLookUp("結果1","テーブルI","[日付] = #" &
Nz([前年度日付],CDate(0)) & " # AND 名前 = '" & [名前] & "'") AS 前年結果1,
DLookUp("結果2","テーブルI","[日付] = #" &
Nz([前年度日付],CDate(0)) & " # AND 名前 = '" & [名前] & "'") AS 前年結果2
FROM テーブルI;
・ツリー全体表示

【6961】Re:2年分の検索方法は?
質問  わん  - 05/12/13(火) 11:26 -

引用なし
パスワード
   お世話になっています。
恥ずかしながら、もう壁にぶつかってしまいました。

現在は、
以前に教えて頂いたDLookUp関数を使うことにして
以下のSQLを利用しています。

SELECT テーブルI.日付,
テーブルI.名前,
テーブルI.結果1,
テーブルI.結果2,
DateAdd("yyyy",-1,[日付]) AS 前年度日付,
DLookUp("結果1","テーブルI","Year([日付]) = " &
Year([日付])-1 & "AND 名前 = '" & [名前] & "'") AS 前年結果1,
DLookUp("結果2","テーブルI","Year([日付]) = " &
Year([日付])-1 & "AND 名前 = '" & [名前] & "'") AS 前年結果2
FROM テーブルI;

そこで1つ問題が発生しました。
上記を利用すると例えばうるう年を含めた前後の年度、
つまり2月29日が存在する年度では前年結果が非表示ではなく、
前年の2月28日の結果が表示されてしまいます。

例)2003年2月28日
   2004年2月29日 → 未記入ではなく2003年2月28日の結果が表示

どうやったら未記入にできるのでしょうか?
ちなみにデータが無い年度に関しては未記入になります。
自分では、IIfを使うのか?Nullチェックか?それともYearじゃないのか?
とも考えてみたのですが上手くいきません。

上手く解決する方法はありますでしょうか。
度々ですが宜しくお願いします。
・ツリー全体表示

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