Access VBA質問箱 IV

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

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


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

【10928】Re:レコードを1件ずつ読み込む
発言  neptune  - 09/1/10(土) 12:42 -

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

ようやく少しずつ情報が出てきだしましたね。小出しは止めて下さいね。
情報なしでは考える事も出来ませんから。
><テーブル>
>T_商品マスタには商品グループ番号、商品コード、商品名
>T_伝票入力には商品コード、商品名
>となっており
><フォーム>
>F_伝票入力には商品コード、商品名(T_伝票入力を基に作成しました)
ここで質問
・商品コードのコントロールはComboBox?
・商品名 のコントロールはTextBox?
この2つのコントロールはいずれも非連結?
・他にコントロールは?

>1、F_伝票入力上にあるコンボックス(txtキー)から選択された商品グループ番号を基にT_商品マスタの内容を
>F_伝票入力に表示させる。(毎回決まった注文に対応)
・comboboxのコントロール名がtxtキー

>1、については表示する事が出来ました。
・どのようにして?
>3については登録ボタンが考慮されておらず1、で表示と同時に即、T_伝票入力に反映してしまっています。
非連結ならそのような事はありえないと思いますが?連結している????

と、疑問だらけなんです。

で、最初に帰って、私なりに整理してみると以下のようになります。

使用するテーブルとその構造は以下。但し、データ型の情報が欠如している
>T_商品マスタには商品グループ番号、商品コード、商品名
>T_伝票入力には商品コード、商品名

form 非連結上に、combobox 1個、textbox 1個、commandbutton 1個を配置、
combobox  コントロール名(txtキー):商品グループ番号フィールドのデータを全て表示
textbox  コントロール名(不明):手入力
commandbutton  コントロール名(商品マスタ全て読込)
    商品マスタ全て読込をクリックする事で、T_伝票入力にcombobox とtextbox のデータを追加したい。

これで抜けているところはありますか?
後出しは困りますので、よく整理して答えてください。

・・・・・・私はサンプルは書いても全てを書く人ではないのであらかじめお断りしておきます。
・ツリー全体表示

【10927】Re:レコードを1件ずつ読み込む
発言    - 09/1/9(金) 22:35 -

引用なし
パスワード
   こんにちは。投稿の件こちらの事情でご迷惑をお掛けし申し訳ありません。
引き続きご教授頂ければ幸いです。宜しくお願い致します。

>全ての命令の終わりで良いです。サンプルソースで言うなら
>end sub の前。
これでやってみましたが、駄目でした。せっかくご教授頂きましたが、私の根本
的なコードの作りや考え方が悪いのかなと思いその後、色々な参考書等を読み漁
り、DBの構成等、やりたい事(させたい事)を再度整理してみました。
で以下のように考え、コードを再び作成してみましたが、やはりおっしゃる通り
応用編であり、初心者の私には今一歩知識が足りません。
度々のお願いですが、何卒ご教授をお願い致します。

やりたい事
注文伝票(F_伝票)の入力を行う(サブフォームは現在なし)DBで、いつも決まった
注文(例えば、ある取引先は、1回の注文時にA商品とB商品とC商品を決まって注文
し合わせてその時に違う商品も追加注文する)を効率良く入力したい。

1、F_伝票入力上にあるコンボックス(txtキー)から選択された商品グループ番号を基にT_商品マスタの内容をF_伝票入力に表示させる。(毎回決まった注文に対応)

txtキーのプロパティ値集合ソースには、
SELECT T_商品マスタ.商品グループ番号, T_商品マスタ.商品コード, T_商品マスタ.商品名 FROM T_商品マスタ ORDER BY T_商品マスタ.商品グループ番号, T_商品マスタ.商品コード;
と設定してあります。

2、1でF_伝票入力に表示させた後、毎回決まった注文商品の後に続けて直接手入
力(追加注文に対応)

3、登録ボタンをクリックし、F_伝票入力の内容をT_伝票入力に反映したい。

コードを以下のように記述しました。1、については表示する事が出来ました。3については登録ボタンが考慮されておらず1、で表示と同時に即、T_伝票入力に反映
してしまっています。2については、直接入力すると何故かT_商品マスタにデータが追加されてしまいます。この2と3の部分について(手入力で追加した分の正しい反映方法、登録ボタンの処理の記述タイミング、方法)を教えて頂きたく投稿させ
て頂きます。
長々と申し訳ありませんが、どうか宜しくお願いします。

Private Sub txtキー_AfterUpdate()
  Dim db As DAO.Database
  Dim db2 As DAO.Database
  
  Dim rs As DAO.Recordset
  Dim rs2 As DAO.Recordset
  
  Dim mySQL As String

  Set db = CurrentDb()
  Set db2 = CurrentDb()
  
  mySQL = "SELECT * FROM T_商品マスタ " _
     & "WHERE 商品グループ番号 = '" & Me!txtキー & "'"
  
  Set rs = db.OpenRecordset(mySQL)
  Set rs2 = db2.OpenRecordset("t_伝票入力", dbOpenTable)
  
  Set Me.Recordset = rs
  
  Me!商品コード.ControlSource = "商品コード"
  Me!商品名.ControlSource = "商品名"
  
  rs.MoveFirst
  
  Do Until rs.EOF
  
  With rs2
    .AddNew
    rs2!商品コード = rs!商品コード
    rs2!商品名 = rs!商品名
    .Update
  End With
   rs.MoveNext
  Loop
  
  Set rs = Nothing
  Set db = Nothing
End Sub
・ツリー全体表示

【10926】Re:エクセルからアクセスへAddNewで
お礼  ON  - 09/1/9(金) 19:28 -

引用なし
パスワード
   ▼neptune さん:
お手数かけます ありがとうございます

>それなら、バックアップは毎日取っておくのが次善の策ですね。
了解です ありがとうございます

>頑張って下さい。
ありがとうございます

兎に角、自分が楽になれればだけのQでしたが
なんとなくひんしゅく系のQだったのでしょうか・・・・

エクセルvba 
【59800】VBAによるパソコンへの攻撃について
よくわかりませんが、該当者??
で、回答頂けなかったのかと・・・
・ツリー全体表示

【10925】Re:エクセルからアクセスへAddNewで
発言  neptune  - 09/1/9(金) 15:36 -

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

ATコマンド関連については知識も経験も無いのでパスします。

>実行時エラー '-2147467259 (80004005)'
>マシン 'hogefuga' のユーザー'Admin'がデータベースを開けない状態、
>またはロックできない状態にしています
>となってしまいました
をちょっと調べてみました。多分これ
「Access 2000 の .ldb ファイルについて」
ht tp://support.microsoft.com/kb/208778/ja
の下の方の「.ldb ファイルの用途 」

処理が追いついてないとか、ローカル側で何か問題がおきたとか?
最悪はmdbファイルが壊れかかっているとか。。。

>5人1グループで、20組、1分ずらしでのセッティング程度であれば
>何とか動かせそうかな・・・と
それなら、バックアップは毎日取っておくのが次善の策ですね。
頑張って下さい。
・ツリー全体表示

【10924】Re:DATAの集約方法について
お礼  pinetree  - 09/1/9(金) 13:15 -

引用なし
パスワード
   ▼トト さん:
>▼pinetree さん:
>基本はクロス集計クエリを使用すると良いです。
>TRANSFORM Sum([TABLE-A].POINT) AS POINTの合計
>SELECT [TABLE-A].CODE
>FROM [TABLE-A]
>GROUP BY [TABLE-A].CODE
>PIVOT [TABLE-A].RANK;
>
>場合によっては、1行目は
>TRANSFORM First([TABLE-A].POINT) AS POINTの先頭
>でも良いでしょう。
>
>
>少し作成が面倒ですが、
>SELECT [TABLE-A].CODE,
>Max(IIf([TABLE-A]![RANK]=1,[TABLE-A]![POINT],Null)) AS RANK1_POINT,
>Max(IIf([TABLE-A]![RANK]=2,[TABLE-A]![POINT],Null)) AS RANK2_POINT,
>Max(IIf([TABLE-A]![RANK]=3,[TABLE-A]![POINT],Null)) AS RANK3_POINT
>FROM [TABLE-A]
>GROUP BY [TABLE-A].CODE;
>このような集計クエリであれば、より希望に近いかもしれません。
>
>
>参考までに。

ご指導ありがとうございました。
ねらい通りの結果を得ることができました。
今後ともよろしくお願いいたします。
・ツリー全体表示

【10923】Re:エクセルからアクセスへAddNewで
発言  ON  - 09/1/9(金) 12:52 -

引用なし
パスワード
   結果報告です

>>同時書き込みのテスト方法わかりませんでした
ですが

▼ 【59752】ATコマンドでファイルサーバーのブックが開けない 
ht tp://www.vbalab.net/vbaqa/c-board.cgi?id=excel
の方法で
ローカルPC6台で、同一時分指定で実行してみましたが不具合は発生しませんでした

で、ふと、1PCで、ATコマンドを同一時分で発行してみたらどうなるのかなと
1PC-20セット × 2台 で実行してみました

ローカルPCのタスクマネージャーのプロセスを見ていると
EXCEL.EXEがたぶん20個表示され・・・

途中で
cn.Openで
実行時エラー '-2147467259 (80004005)'
マシン 'hogefuga' のユーザー'Admin'がデータベースを開けない状態、
またはロックできない状態にしています
となってしまいました
テーブルへの書き込みは、37件登録されていました
更新フィールドへの書き込み時間は 11:27:02-11:27:05 の 4秒間程か・・・


>「ファイル サーバーとクライアント/サーバー」
>ht tp://msdn.microsoft.com/ja-jp/library/cc376482.aspx

>「ネットワークでの使用」
>ht tp://www.naboki.net/access/achell/achell_02.html


>あくまでも可能な数字であって、こんな使い方をする人はいないと思います。
>いても怖いもの知らずか、実体を知らないのかでしょう。

を、頂いていながら・・・・

5人1グループで、20組、1分ずらしでのセッティング程度であれば
何とか動かせそうかな・・・と

本来は
>なので、ファイルサーバーを弄くれる立場なら、Office付属のMSDN、最新では
>SQL Server 2005、2008(無償のバージョンもあります。無償のバージョンでも
>多分同時5接続は保障されているはず。)をお使いになることをお勧めします。
が望ましいことは重々承知ですが・・・

我ながらアフォだとは思いますが
何かありましたら書き込みよろしくお願いいたします
・ツリー全体表示

【10922】Re:レコードを1件ずつ読み込む
回答  neptune  - 09/1/9(金) 10:47 -

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

こんにちは
みかんさんですか。! ハンドルネームは固定した方が良いですよ。
ハンドルネームも掲示板上では人格を持ってますからね。

>ベタな質問ですが、どこに置けば良いでしょうか?
全ての命令の終わりで良いです。サンプルソースで言うなら
end sub の前。

前のスレッドですが、何がなにやらわからなかったので、書き込むのを
控えておりました。
・フィールドとはテーブルで定義されている要素で、同じようなフィールド
が重複するとは考えにくい・・・これが一番理解できなかった。
・基本的な事と思っていたようだが、恐らく応用編?当たりの事と思う。
・余りにも情報が少なかった。
・ツリー全体表示

【10921】Re:DATAの集約方法について
発言  トト  - 09/1/9(金) 8:57 -

引用なし
パスワード
   ▼pinetree さん:
基本はクロス集計クエリを使用すると良いです。
TRANSFORM Sum([TABLE-A].POINT) AS POINTの合計
SELECT [TABLE-A].CODE
FROM [TABLE-A]
GROUP BY [TABLE-A].CODE
PIVOT [TABLE-A].RANK;

場合によっては、1行目は
TRANSFORM First([TABLE-A].POINT) AS POINTの先頭
でも良いでしょう。


少し作成が面倒ですが、
SELECT [TABLE-A].CODE,
Max(IIf([TABLE-A]![RANK]=1,[TABLE-A]![POINT],Null)) AS RANK1_POINT,
Max(IIf([TABLE-A]![RANK]=2,[TABLE-A]![POINT],Null)) AS RANK2_POINT,
Max(IIf([TABLE-A]![RANK]=3,[TABLE-A]![POINT],Null)) AS RANK3_POINT
FROM [TABLE-A]
GROUP BY [TABLE-A].CODE;
このような集計クエリであれば、より希望に近いかもしれません。


参考までに。
・ツリー全体表示

【10920】Re:レコードを1件ずつ読み込む
質問  みかん  - 09/1/8(木) 23:19 -

引用なし
パスワード
   ご回答ありがとうございます

>商品マスタ全て読込ボタンがF_伝票入力にあるなら
はい。あります。
>me.refresh
>とやってみて下さい。
ベタな質問ですが、どこに置けば良いでしょうか?
申し訳ありません。
・ツリー全体表示

【10919】Re:レコードを1件ずつ読み込む
回答  neptune  - 09/1/8(木) 22:56 -

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

商品マスタ全て読込ボタンがF_伝票入力にあるなら
me.refresh
とやってみて下さい。
・ツリー全体表示

【10918】レコードを1件ずつ読み込む
質問    - 09/1/8(木) 17:24 -

引用なし
パスワード
   お世話になります。ご教授頂きたくお願い申し上げます。
フォーム上に「商品マスタ全て読込ボタン」というものがあり、クリックすると
T_商品マスタのデータをF_伝票入力に読み込むDBを作成したいのですが
F_伝票入力にデータが反映出来ず困っております。
下のコードを見てご察しの通りと思いますが、テーブルであるT_伝票入力に
はデータが反映されております。

現在構築している内容は、以下の通りです。
<テーブル>
T_商品マスタには商品グループ番号、商品コード、商品名
T_伝票入力には商品コード、商品名
となっており
<フォーム>
F_伝票入力には商品コード、商品名(T_伝票入力を基に作成しました)
とあります。

コードを以下のように書きました。

Private Sub 商品マスタ全て読込_Click()

  Dim cn As New ADODB.Connection
  Dim rs1 As ADODB.Recordset
  Dim rs2 As ADODB.Recordset
 
  Set cn = Application.CurrentProject.Connection
  Set rs1 = New ADODB.Recordset
  Set rs2 = New ADODB.Recordset
  
  rs1.Open "T_商品マスタ", cn, adOpenStatic, adLockReadOnly
  rs2.Open "T_伝票入力", cn, adOpenKeyset, adLockOptimistic
  
   rs1.MoveFirst
  
  Do Until rs1.EOF
  
     rs2.AddNew
      rs2!商品コード = rs1!商品コード
      rs2!商品名 = rs1!商品名
     rs2.Update
   
   rs1.MoveNext
  
  Loop
  
  rs1.Close
  rs2.Close
  cn.Close
  
End Sub

この状態ですと、フォーム上ではなく、直接テーブルにデータが書き込まれる
為、フォームであるF_伝票入力には何も変化が起きておりません。
T_伝票入力にデータを反映したいのは勿論なのですが、F_伝票入力にも表示
されるようにしたいのですが、どなたかご教授下さいませ。
宜しくお願い致します。
・ツリー全体表示

【10917】Re:DATAの集約方法について
お礼  pinetree  - 09/1/8(木) 16:34 -

引用なし
パスワード
   ありがとうございました。
もう少し考えてみます。
ただ、このような事が簡単にできれば、
非常に便利ではないかと思っております。
・ツリー全体表示

【10916】Re:エクセルからアクセスへAddNewで
質問  ON  - 09/1/7(水) 16:51 -

引用なし
パスワード
   ▼neptune さん:
いつもありがとうございます

詳細な説明助かります

>気になる点
ありがとうございます

>・ADOで書いておけば、SQLServerへの移行は接続を変えるだけですみます。
そーなんですか 今後のことも考え ADO で記述するようにしたいと思います
当コードにつきましては、DAO → ADO に修正しました


>・ネットワークで、レコードセットを開くようなことは極力しない。管理者に怒られそう。
> クエリ(パラメータクエリ含む)を使うべき・・・トラフィックの問題
ですね
了解ですが、スキルがないです

とりあえず昼休み、TBL量は少 ということで・・・
苦情が来て、スキルがついたら対応したいと思います

ご紹介先、ゆっくり勉強したいと思います


また
【10891】ADOでCSVの取り込み時のフィルタで"種類が一致しません"
ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=10891;id=access#10895

>サブクエリの選択リストは、INSERT ステートメントの列リストに一致している
>必要があります。列リストを指定しない場合は、選択リストは、追加される
>テーブルまたはビュー内の列に一致している必要があります。

を、あわせて、
>MSDN、最新ではSQL Server 2005、2008
で今後、チャレンジしたいと思います


時間があまり取れないので
現行で動作できれば、とりあえずそれで運用したいような・・・です


関連Q
【59752】ATコマンドでファイルサーバーのブックが開けない
ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=59752;id=excel
あります

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

【10915】Re:モジュールはこれです。 (付け忘れ...
発言  トト  - 09/1/7(水) 15:15 -

引用なし
パスワード
   ▼かわせ さん:
SQL1, SQL2 共に SNBR --> INVN としてみて下さい。

それでダメならSQL1のクエリの結果を確認してみて下さい。
・ツリー全体表示

【10914】Re:ファイル検索について
お礼  ひで  - 09/1/7(水) 12:35 -

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

ありがとうございました。

また自分でも勉強してみたいと思います。
・ツリー全体表示

【10913】Re:置換をマクロでやりたい
発言  素人考え  - 09/1/7(水) 10:39 -

引用なし
パスワード
   ▼hiro さん:
>のように変更するデータが60通りあります。
60通りの更新SQLをマクロに登録すれば可能かと思います。
・ツリー全体表示

【10912】Re:エクセルからアクセスへAddNewで
発言  neptune  - 09/1/6(火) 22:32 -

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

ネットワークは詳しくないのでRes付けんかったんですが、Resが無いようなので。
答えには多分を付けて考えて下さい。
>・同時に開いて使用するのが5人?
これは多分MSDEの間違いでは?MSDEは同時5接続の制限があります。
>・同一レコードへの書き込みはロックがかかる
以下をよく読んでみてください。疑問が解けると思います。
「ファイル サーバーとクライアント/サーバー」
ht tp://msdn.microsoft.com/ja-jp/library/cc376482.aspx
但し、以下のような記述がありますが、
//////////////////////////////////////////////////////////////////////////
ユーザー数には制限があり、Access データベースでは 255 人までの同時使用に対応しますが、
ユーザーが頻繁にデータを追加、更新する場合、ファイル サーバーにおける最適なユーザー数は、
通常 25 から 50 人までとなっています。
//////////////////////////////////////////////////////////////////////////
あくまでも可能な数字であって、こんな使い方をする人はいないと思います。
いても怖いもの知らずか、実体を知らないのかでしょう。
以下を読んでもいいし、
「ネットワークでの使用」
ht tp://www.naboki.net/access/achell/achell_02.html
「mdb マルチユーザー 接続」をキーワードにググって見ても実態は把握できると思います。

なので、ファイルサーバーを弄くれる立場なら、Office付属のMSDN、最新では
SQL Server 2005、2008(無償のバージョンもあります。無償のバージョンでも
多分同時5接続は保障されているはず。)をお使いになることをお勧めします。

>Q1)アクセス側で発生する書き込み不可のメッセージ等は、ローカルPCに出るのでしょうか
はい。ADO +SQLServerでは出ます。

>Q2)エクセルマクロは途中で停止するのでしょうか
マクロはExcelで動いている。同期処理なので多分はい。

>Q3)エクセルのメッセージで再実行とか出るのでしょうか
エラー処理にその処理を書いておけばどうですか?

>同時書き込みのテスト方法わかりませんでした
これについては知りません。

気になる点
・ADOで書いておけば、SQLServerへの移行は接続を変えるだけですみます。
・ネットワークで、レコードセットを開くようなことは極力しない。管理者に怒られそう。
 クエリ(パラメータクエリ含む)を使うべき・・・トラフィックの問題
・ツリー全体表示

【10910】Re:エクセルからアクセスへAddNewで
質問  ON  - 09/1/6(火) 18:49 -

引用なし
パスワード
   追記です

エクセル AT登録まで実行できました
・ツリー全体表示

【10909】複数バージョンが共存する中で特定のバー...
質問  yuki  - 09/1/6(火) 17:21 -

引用なし
パスワード
   [OSのVER]:WindowsXP
[AccessのVER]:ACCESS2000/2007共存

PCの中にexcel2000/2007が共存している環境でACCESS2000のVBAにてexcel2000を新規に開き、書き込みを行いたいです。
今は下記のようにvbaを動かしています。


Private Sub cmd_OK_Click()
On Error GoTo Err_cmd_OK_Click

'変数を宣言します。
  Dim strSql As String 'SQLを実行する際の処理内容を格納する変数
  Dim MyDB As Database 'データベースオブジェクトへの参照を格納する変数
  Dim TargetRecordSet As Recordset 'レコードセットオブジェクトへの参照を格納する変数
  Dim strPass As String
  Dim count_DollAC As Long
  Dim xlApp As Excel.Application


  ’マクロの実行
  strSql = "account extract"
  DoCmd.RunMacro strSql
   
  strPass = "C:\Program Files\Microsoft Office\Office\Excel.Exe"
  Shell strPass, 1
  Set xlApp = GetObject(, "Excel.Application.9")
  xlApp.Visible = True
  Set MyDB = CurrentDb

  '抽出したtblDoll_AccountレコードをExcelシートに貼り付けます。
  Set TargetRecordSet = MyDB.OpenRecordset("tblDoll_Account")
  count_DollAC = TargetRecordSet.RecordCount
  xlApp.Sheets(1).Select
  xlApp.Range("A2").CopyFromRecordset TargetRecordSet '目次次列より貼付


このようにVBAを実行すると、Shellで作成した新規のエクセルファイル(excel2000)ではなく、今開いてるexcel全て(excel2007を含む)のうち、一番最初に開いているexcelシートに書き込みがされてしまいます。
Shellで作成した新規のエクセルファイルに書き込みをするにはどのようにしたらよいのでしょうか。

どなたかご存じの方いらっしゃいましたら教えてください!!
・ツリー全体表示

【10908】Re:エクセルからアクセスへAddNewで
質問  ON  - 09/1/6(火) 17:11 -

引用なし
パスワード
   追記です

>各ローカルPCでATコマンドで毎週月曜12:00に上記のコードを自動実行
>すればいいのではと思っていますが

は、調査中です 現状は、動作できていません
・ツリー全体表示

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