Access VBA質問箱 IV

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

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


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

【8475】レコードソースに重いSQLを設定するとフォ...
質問  katie  - 06/8/17(木) 13:33 -

引用なし
パスワード
   フォーム上でユーザーに検索条件を指定させ、検索ボタンが押されたらサブフォームに検索結果を表示するプログラムを作っています。

開発環境は Access2002/SQL-Server2000 です。

検索ボタンが押されたところで動的にSQL文を生成して String型変数 str_sql にセットし

    Me.クライアント検索sub.Form.RecordSource = str_sql
    Me.クライアント検索sub.Form.Requery

以上のコードを実行させています。

これでほとんどの検索は問題なくできるのですが、SQL文が重たいもの(クエリアナライザで実行して40秒くらいかかる)になると処理がうまくいかなくなります。検索結果が1行しか表示されず、その1行もデータがすべて「#Name?」という表示です。

SQL-Serverから取得したデータをサブフォームに表示させるところでタイムアウトしているのかな?と思うのですが、どう修正したらいいか分からずにいます。

connectionがタイムアウトしないようにすればよいのかと思い、
Me.クライアント検索sub.Form.RecordSource = str_sql と
Me.クライアント検索sub.Form.Requery の前に
connection.CommandTimeout = 300 を入れてみたのですが状況は変わりませんでした。

お知恵をお借りできませんか。
・ツリー全体表示

【8474】Re:フォームビューで表示されないのはなぜ...
お礼  ゆずぽん  - 06/8/17(木) 13:26 -

引用なし
パスワード
   ▼雅 さん:
回答ありがとうございます。

>可視プロパティが「いいえ」になっていませんか?
→確認してみましたが、全て「はい」でした。

ただ、フォームの元となるクエリをもう一度確認してみたらエラーが出るようになっていたので、そちらが原因かもしれません。
今から試してみて、それでもダメなら再度、投稿させていただきます。
・ツリー全体表示

【8473】Re:フォームビューで表示されないのはなぜ...
回答    - 06/8/17(木) 13:07 -

引用なし
パスワード
   こんにちわ。雅です。

>デザインビューでは見れるがフォームビューには表示されないということは、設定等に問題があるのでしょうか?

可視プロパティが「いいえ」になっていませんか?

でわ。
・ツリー全体表示

【8472】Re:価格更新について
回答    - 06/8/17(木) 13:06 -

引用なし
パスワード
   こんにちわ。雅です。

>以前、任意のcsvをフォーム上で選択してアクセスに取り込む、というものは作りましたが、今回はすでにあるテーブルを、フォーム上で選択した任意のcsvで更新する、というのが目的です。なぜアクセスのテーブルに保存するかというと、そのテーブルを支店で利用するからなのです。ですから、アクセス上で作業が完結できるようにしたいと考えています。

ワークテーブルに一度取り込んで更新クエリを実行してはだめですか?

でわ。
・ツリー全体表示

【8471】フォームビューで表示されないのはなぜ?
質問  ゆずぽん  - 06/8/17(木) 12:02 -

引用なし
パスワード
   こんにちは。
新規フォームをデザインビューで作成し、何回か編集(フォームの元となるクエリを変更したりテキストをフォームに追加)を繰り返していたら、突然フォームビューの詳細欄の全てのテキストやcmdボタンなどが表示されなくなってしまいました。デザインビュー上で追加したテキストを順番に消去しながらフォームビューを確認して行きましたが、回復しません。
デザインビューでは見れるがフォームビューには表示されないということは、設定等に問題があるのでしょうか?
・ツリー全体表示

【8470】価格更新について
質問  TB1  - 06/8/17(木) 11:15 -

引用なし
パスワード
   宜しくお願いします。
ここに、ある価格の載った商品マスターがあります。
いくつかの商品が特売で価格変更をします。
価格更新は、更新クエリで新規価格表と商品マスターがあればできますが、
この新規価格表.csvが毎月入れ替わるので、フォーム上でそのcsvを選択し、価格を変更したいと考えています。
仮にマスターファイルを新規価格を含めて全て上書きするなら問題ないのですが、
更新品目が少ない場合、膨大なマスターからピックアップするのは大変な作業になってしまうので、更新クエリのように必要な品目と価格だけが入れ替わるしくみを作りたいと考えています。

以前、任意のcsvをフォーム上で選択してアクセスに取り込む、というものは作りましたが、今回はすでにあるテーブルを、フォーム上で選択した任意のcsvで更新する、というのが目的です。なぜアクセスのテーブルに保存するかというと、そのテーブルを支店で利用するからなのです。ですから、アクセス上で作業が完結できるようにしたいと考えています。

よい方法がありましたら、どうぞ教えてください。
・ツリー全体表示

【8469】Re:CSVデータをテーブルに上書きしたい
お礼  ゆずぽん  - 06/8/16(水) 23:00 -

引用なし
パスワード
   ▼小僧 さん:
>アクションクエリの OpenQueryメソッド はCloseをしなくても大丈夫だと思われます。

Closeの文を消しても動作は変わりませんでした。
ありがとうございます。
・ツリー全体表示

【8468】Re:CSVデータをテーブルに上書きしたい
お礼  ゆずぽん  - 06/8/16(水) 22:53 -

引用なし
パスワード
   ▼小僧 さん:
できました!
ありがとうございます。
実は、今回の操作をしたく色々な本を買いましたが、いまいち理解できずに一ヶ月も費やしていたところでした。それが1日で解決してしまうなんて、小僧さんスゴイですね!
今までエクセルでデータ管理をしていましたがデータが重いので、アクセスで同じようなデータベースを作ってみようと思ったわけですが…。エクセルとアクセスでVBAの書き方が色々違うようで戸惑っていました。また何かありましたら宜しくお願いします。
今回はご親切にどうもありがとうございます。
・ツリー全体表示

【8467】Re:CSVデータをテーブルに上書きしたい
回答  小僧  - 06/8/16(水) 22:23 -

引用なし
パスワード
   ▼ゆずぽん さん:
こんばんは。

> 質問箱のルールを知らず

いえいえ。あちらに書いてあった通り、
こちらの掲示板は主催者の谷さんの「助け合いましょう」というのが基本方針です。
今回のご投稿の様に「何をしていて」「どうエラーが出たのか」が
明記されていますと、当方以外の回答者の方も返答をし易くなると思われますよ^^


>実行時エラー2391 貼り付け先の"データテーブル"には
> "F1"フィールドがありません。というエラーが出てしまいます。
> DoCmd.TransferText acImportDelim , , _
> "データテーブル", "C:\Documents and Settings\AAA\デスクトップ\データ管理

さて、既存のテーブルにデータを入れる際には
もう一工夫必要となります。

手動でインポートする際に「テキストインポートウィザード」
という画面が出ませんでしたでしょうか。
こちらを使ってインポートするテーブル名などを指定して
「完了」の一歩手前まで画面を進めます。

その状態で左下にある「設定」というボタンを押すと
「yインポート定義」という画面が出ると思います。

「保存」ボタンを押すと名前を指定するように促されるので
仮に「定義1」という名前を付けて保存します。

後は TransferTextメソッドにて、この定義を指定してあげると
お望みの動作になるかと思われます。

DoCmd.TransferText acImportDelim , "定義1", "データテーブル", …


>DoCmd.OpenQuery "データテーブル削除クエリ", acViewNormal
>DoCmd.Close acQuery, "データテーブル削除クエリ", acSaveYes

クエリは大きく分けると、選択クエリ(参照用のクエリ)と
アクションクエリ(更新用のクエリ)となります。
特別な設定をしていなければ
アクションクエリの OpenQueryメソッド はCloseをしなくても大丈夫だと思われます。
・ツリー全体表示

【8466】Re:CSVデータをテーブルに上書きしたい
質問  ゆずぽん  - 06/8/16(水) 21:25 -

引用なし
パスワード
   ▼小僧 さん:
質問箱のルールを知らず「丸投げ」な質問をしてしまいすみませんでした。
訂正前の投稿の件もありがとうございます。
インポートのメソッドが解りましたので早速書いてみましたが、
実行時エラー2391 貼り付け先の"データテーブル"には"F1"フィールドがありません。というエラーが出てしまいます。(フィールド数はテーブルCSV共に34個でズレなどはありませんでした)
ヘルプを開いても何も表示されず、試しに手動で同様の操作をしてみると、エラーは出ませんでした。
VBAは下記の通りに書いています。

Private Sub コマンド6_Click()

DoCmd.OpenQuery "データテーブル削除クエリ", acViewNormal
DoCmd.Close acQuery, "データテーブル削除クエリ", acSaveYes
DoCmd.TransferText acImportDelim, , "データテーブル", "C:\Documents and Settings\AAA\デスクトップ\データ管理\y.csv"
  
End Sub


エラーコードの意味はヘルプ意外で調べることはできるのでしょうか?
エラーの意味がわかると助かります。
・ツリー全体表示

【8464】Re:データの操作について
お礼  ゆずぽん  - 06/8/16(水) 16:25 -

引用なし
パスワード
   ご親切に回答ありがとうございます。
方法Aをまずは試してみたいと思います。
・ツリー全体表示

【8462】Re:CSVデータをテーブルに上書きしたい
発言  小僧  - 06/8/16(水) 13:08 -

引用なし
パスワード
   ▼ゆずぽん さん:

> 宜しくお願いいたします。

何をお願いするのですか?

掲示板の上の方にある基本方針のリンク先です。
http://www.vbalab.net/bbspolicy.html

「丸投げ」に相当していませんか?


…インポートに関してはVBAで行うとすると
TransferTextメソッド がヒントになるかと思われます。

全レコード削除については 削除クエリ をVBAから実行する事が可能です。

上記方法で行き詰ってしまったら現在どの様なコードを書いて、
どのようにうまくいかない(エラー箇所、エラーコード等)を提示すると
回答がつきやすくなるかと思いますよ。 
・ツリー全体表示

【8461】Re:データの操作について
回答  小僧  - 06/8/16(水) 13:00 -

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

> 「コマンドボタンを押すと初めてテーブルにデータを転記する」というような操作

意外と難しい操作になってしまうんですよね。

方法A) 非連結のフォームにする
 現在はテキストボックス等のコントロールソースに
 フィールド名が指定されていると思われますが、
 コントロールソースを空白にして
 VBAのコードでフォームに表示、テーブルへ更新の作業を行わせる。

方法B) ワークテーブルを使う
 元テーブルとまったく同じ型式のテーブル(ワークテーブル)を作り、
 そちらのテーブルを基にフォームを作成します。
 コマンドボタンを押すことにより、
 ワークテーブルのデータを元のテーブルに移す方法。

方法C) Dirty状態を判断させる
 レコードが保存されるタイミングは次の3点です。
  ・レコードの移動を行う
  ・フォームを閉じる
  ・VBAのコードで明示的にレコードを保存する

 3番目はともかく、1,2番目に関して
 レコードの移動やフォームを閉じる際に
 「レコードを保存しますか?」のようなダイアログを出して
 ユーザに選択させる方法。


どの方法も一長一短ですが、
代表的な手段としてはこの様なものがあるかと思われます。
・ツリー全体表示

【8460】CSVデータをテーブルに上書きしたい
質問  ゆずぽん  - 06/8/16(水) 11:38 -

引用なし
パスワード
   マスタテーブルに、CSVデータを上書きしたいのですが方法が良く分かりません。

 Private Sub コマンド6_Click()

 マスタテーブルの全レコードを削除
       ↓
 マスタテーブルにCSVファイルをインポートする
 (先頭行はフィールド名として使用しない)
 (区切り記号付…フィールドの区切り記号:カンマ テキストの区切り
  記号:”)
  
 End Sub

という内容です。上書きができればコピー&ペーストでも構いませんが、
CSVのレコード数は毎回多くも少なくも変わるため、インポートが一番良いのかなと思いました。
上記の操作は手動ではできましたが、コマンドボタンを押すと自動的に処理されるようにしたいので、宜しくお願いいたします。
・ツリー全体表示

【8459】データの操作について
質問  ゆずぽん  - 06/8/16(水) 11:17 -

引用なし
パスワード
   脱エクセルしたばかりです。初歩的な質問ですみません。
アクセスで入力・編集フォームを作っています、テーブルのフィールドとフォームのテキストを連結させると、フォームにデータを入力するたびにテーブルの内容も変更されてしまうようですが、例えば「コマンドボタンを押すと初めてテーブルにデータを転記する」というような操作をするには、どうしたらよいのでしょうか?
良い方法があれば、教えてください。
・ツリー全体表示

【8458】Re:動的二次配列について
発言  小僧  - 06/8/14(月) 16:24 -

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

>「Preserve で変更できるのは、
>動的配列の最後の次元だけなんですね〜。」

Excel がインストールされている PC でしたら
Excelのワークシート関数であるTranspose関数で入替えが可能です。
(ワークシート関数のため、最小添字が 1になる模様です。)

テーブル、T_Tempを用意して

ID    名前    住所
1    小野    浦和
2    川口    磐田
3    巻    千葉
4    宮本    大阪
5    松井    フランス

Sub 入替えテスト()
Dim RS As DAO.Recordset
Dim myData() As Variant
Dim i As Long
Dim j As Long
  Set RS = CurrentDb.OpenRecordset("T_Temp")
  Do Until RS.EOF
    ReDim Preserve myData(0 To 2, 0 To i)
      
    For j = 0 To 2
      myData(j, i) = RS(j)
    Next j
    i = i + 1
    RS.MoveNext
  Loop
  RS.Close
  Set RS = Nothing
  
'下記行のコメントを操作して下さい。
  'myData = CreateObject("Excel.Application").Transpose(myData)

'検証
  For i = LBound(myData, 1) To UBound(myData, 1)
    For j = LBound(myData, 2) To UBound(myData, 2)
      Debug.Print "(" & i & "," & j & "):" & myData(i, j)
    Next j
  Next i
End Sub

Excel関数を呼び出している行のコメントを外すと、
行・列が入れ替わっていることがイミディエトウィンドウにて
確認できるかと思われます。

1次元目、2次元目共に要素数を変える訳には行きませんが…。
・ツリー全体表示

【8457】Re:動的二次配列について
お礼  タロロ  - 06/8/14(月) 14:20 -

引用なし
パスワード
   ▼3 さん:
ありがとうございました。
確認出来ました。
「Preserve で変更できるのは、
動的配列の最後の次元だけなんですね〜。」
勉強になりました。
やりたい事が出来るよう改めて考えてみます。

▼小僧さん:
説明不足で申し訳ありません。
エラー箇所は、
ループ二回目での
ReDim Preserve myDATA(iCount, 1 To 30)の部分です。
内容は、9:インデックスが有効範囲にありません。でした。
myDATA() As Stringと宣言しました。
>Loopの最中に rs を全く使ってませんよね…。
rsは使用していますが、
ループ処理内で動的な二次配列を宣言したいので
質問内容とは関係ないので省きました。
・ツリー全体表示

【8456】Re:動的二次配列について
回答  3  - 06/8/14(月) 14:05 -

引用なし
パスワード
   こんにちは。
ちょっと調べたところ
「Preserve を指定した場合、変更できるのは、
動的配列の最後の次元のサイズに限られます。
また、次元数は変更できません。」
とあったので、
ループの前にPreserveなしでredimして
myDATA(iCount, 1 To 30)を
myDATA(1 To 30, iCount)
という形でいいなら動くと思います。

試しに↓の様にしたら動きました。
Sub tamesi()
  Dim i As Integer
  Dim test() As String
  ReDim test(1 To 30, 0)
  For i = 0 To 100
    ReDim Preserve test(1 To 30, i)
    test(1, i) = "a" & i
  Next i
End Sub


▼タロロ さん:
>動的な二次配列を宣言したいのですが、
>ループの二回目でエラーになってしまいます。
>どのようにすればよいのでしょうか?
>宜しくお願い致します。
>Do Until rs.EOF
>
> iCount = iCount + 1
>
> ReDim Preserve myDATA(iCount, 1 To 30)
> myDATA(iCount, 1) = 社員ID
> myDATA(iCount, 2) = 名前
>        :
> rs.MoveNext
>Loop
・ツリー全体表示

【8455】Re:ORACLE への DAO接続
お礼  CAVE1  - 06/8/14(月) 14:02 -

引用なし
パスワード
   ドライバを変えたらできました。
ありがとうございました。

▼たん さん:
>>  Set objDB = OpenDatabase("", False, False, "ODBC;Driver={Microsoft ODBC for Oracle};DATABASE=***;UID=***;PWD=***")
>
>の記述以前に、ODBCドライバ経由でリンクテーブルとしては接続出来るかどうかを
>確認できているのでしょうか?
>
>リンクテーブル接続がOKなら、リンクテーブルをデザインで開いて、リンクテーブルの
>説明プロパティを参照すれば、接続文字列が確認できます。
>
>リンクテーブル自体が接続できていないなら、Oracleクライアントの設定や、
>ドライバ自体の問題の可能性が大きいかと。
・ツリー全体表示

【8454】Re:動的二次配列について
発言  小僧  - 06/8/14(月) 13:35 -

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

>動的な二次配列を宣言したいのですが、
>ループの二回目でエラーになってしまいます。

ご提示された情報だけですと、何とも言えませんね。

エラー番号、エラー内容やどの行でエラーが発生するのかを
はっきりすると回答がつきやすくなるかもしれません。

また、myDATAのデータ型等も情報が欲しい所ですね。

> Do Until rs.EOF
>
> iCount = iCount + 1
>
> ReDim Preserve myDATA(iCount, 1 To 30)
> myDATA(iCount, 1) = 社員ID
> myDATA(iCount, 2) = 名前
>        :
> rs.MoveNext
>Loop

Loopの最中に rs を全く使ってませんよね…。
・ツリー全体表示

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