Access VBA質問箱 IV

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

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


1686 / 2272 ツリー ←次へ | 前へ→

【5613】応答なしの表示がでる。 さつき 05/7/14(木) 15:31 質問[未読]
【5614】Re:応答なしの表示がでる。 てっちゃん 05/7/15(金) 8:41 発言[未読]
【5617】Re:応答なしの表示がでる。 小僧 05/7/15(金) 9:54 回答[未読]
【5627】Re:応答なしの表示がでる。 さつき 05/7/15(金) 17:24 質問[未読]
【5628】Re:応答なしの表示がでる。 小僧 05/7/15(金) 17:51 発言[未読]
【5639】Re:応答なしの表示がでる。 小僧 05/7/19(火) 14:52 発言[未読]
【5716】Re:応答なしの表示がでる。 さつき 05/8/1(月) 18:39 質問[未読]
【5721】Re:応答なしの表示がでる。 小僧 05/8/2(火) 9:12 回答[未読]
【5759】Re:応答なしの表示がでる。 さつき 05/8/5(金) 10:49 お礼[未読]
【5764】Re:応答なしの表示がでる。 さつき 05/8/5(金) 11:56 質問[未読]
【5765】Re:応答なしの表示がでる。 小僧 05/8/5(金) 12:00 発言[未読]
【5766】Re:応答なしの表示がでる。 さつき 05/8/5(金) 13:27 質問[未読]
【5767】Re:応答なしの表示がでる。 小僧 05/8/5(金) 13:48 発言[未読]
【5769】Re:応答なしの表示がでる。 さつき 05/8/5(金) 14:09 質問[未読]
【5770】Re:応答なしの表示がでる。 小僧 05/8/5(金) 14:33 発言[未読]
【5771】Re:応答なしの表示がでる。 さつき 05/8/5(金) 15:13 お礼[未読]
【5640】Re:応答なしの表示がでる。 さつき 05/7/19(火) 15:19 お礼[未読]

【5613】応答なしの表示がでる。
質問  さつき  - 05/7/14(木) 15:31 -

引用なし
パスワード
   以前こちらで、filterをかけながら、データをテーブル1からテーブル2に追加するVBAを教えて頂いたのですが、件数が少ないうちは、きちんと動いていたのですが、件数が増えたら、固まるようになってしまいました。タスクマネージャを開くと、応答なしの表示が出ます。何かよい方法はないでしょうか?
どなたかお教え下さい。よろしくお願い致します。

【5614】Re:応答なしの表示がでる。
発言  てっちゃん  - 05/7/15(金) 8:41 -

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

私の経験上、「応答なし」でも動いているようです。
(本当に固まってることもあると思いますが)

以前は動いていたのであれば、辛抱強く(!?)待てば、結果は得られると
思います。

ただ、処理に時間が掛かり過ぎると実用的に無理が出てくると思うので、
以前の質問へのリンクや、現在の状況(データ件数や、テーブルの主キー等の
情報など)を再度書き込んでみてはいかがでしょう。

他人事で申し訳ありませんが、私には回答できる自身はありませんが、
他の先生方(!?)の回答が得られやすくなると思います。

【5617】Re:応答なしの表示がでる。
回答  小僧  - 05/7/15(金) 9:54 -

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

前回ログ:
>>>[#5385]縦方向のデータを横方向へ並べる

では「Filter」を使いましたが、今度は「Find」メソッドを使った例です。



>>'フィルタを掛けて新規か追加か判断
>>    'rs2.Filter = "契約者 ='" & rs1![契約者] & "'"
→    rs2.Find "契約者 ='" & rs1![契約者] & "'"



>>'更新
>>    rs2.Update
>>  End If
>>  rs1.MoveNext
→追加 rs2.MoveFirst
>> Loop

listyoko に追加する度に1レコード目まで戻り「Find」しています。
実行速度があがればいいのですが…。

【5627】Re:応答なしの表示がでる。
質問  さつき  - 05/7/15(金) 17:24 -

引用なし
パスワード
   ▼小僧 さん、てっちゃんさん:
お答えありがとうございます。

てっちゃんさんの言われたように応答なしでも動いているようなのですが、やはり最後まではたどり着いてくれませんでした。

そこで、
Findメソッドを使って、書き直してみましたが、

rs2.Find "契約者 ='" & rs1![契約者] & "'"

上のrs1![契約者] & "'"のところで、
「コンパイルエラー 引数は省略できません」と出ます。

どのようにしたらよいでしょうか?

【5628】Re:応答なしの表示がでる。
発言  小僧  - 05/7/15(金) 17:51 -

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

>rs2.Find "契約者 ='" & rs1![契約者] & "'"
>
>上のrs1![契約者] & "'"のところで、
>「コンパイルエラー 引数は省略できません」と出ます。
>
>どのようにしたらよいでしょうか?

こちらだとコンパイルエラーが発生しないんですよね…。
Helpを見ても省略可な引数ですし…。

>  rs2.Find "契約者 ='" & rs1![契約者] & "'"
→ rs2.Find "契約者 ='" & rs1![契約者] & "'",0

としても結果は一緒なのですが、コンパイルが通らないでしょうか?

【5639】Re:応答なしの表示がでる。
発言  小僧  - 05/7/19(火) 14:52 -

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

前回の投稿から色々勉強してみたところ
「Find」「Filter」等のメソッドは、データ量が多くなると
パフォーマンスが相当落ちるようです。
(膨大なデータを業務で扱っている方から情報を頂きました)

という事で回避方法として、

>rs2.Open "listyoko", cn, adOpenKeyset, adLockOptimistic

この時点で全てのレコードをオープンしていますが、
「rs1」のレコードが動く度に、Where条件をつけて「rs2」をその都度開いた方が
結果として高速に処理できるかと思われます。

【5640】Re:応答なしの表示がでる。
お礼  さつき  - 05/7/19(火) 15:19 -

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

ありがとうございました。教えて頂いたように ,0 をつけたら動きました。

【5716】Re:応答なしの表示がでる。
質問  さつき  - 05/8/1(月) 18:39 -

引用なし
パスワード
   前回下記のようなアドバイスを頂いていて、ずっと気になっていたのですが、実際膨大なデータを扱う必要が出てきたので、お教え下さい。

>前回の投稿から色々勉強してみたところ
>「Find」「Filter」等のメソッドは、データ量が多くなると
>パフォーマンスが相当落ちるようです。
>(膨大なデータを業務で扱っている方から情報を頂きました)
>という事で回避方法として、
>>rs2.Open "listyoko", cn, adOpenKeyset, adLockOptimistic
>この時点で全てのレコードをオープンしていますが、
>「rs1」のレコードが動く度に、Where条件をつけて「rs2」をその都度開いた方が
>結果として高速に処理できるかと思われます。

下記のように直してみましたが、「名前または序数に対応する項目がコレクションで見つかりません」と出てしまいます。全くわからないままコードを書いてみましたので、かなり変だと思います。申し訳ありませんが、よろしくお願いいたします。


Public Function 横並び()

Dim cn As ADODB.Connection
Dim rs1 As ADODB.Recordset
Dim rs2 As ADODB.Recordset
Dim cr As String
Dim I As Long
Dim J As Long

  Application.Echo False
  DoCmd.Hourglass True

  Set cn = Application.CurrentProject.Connection
  Set rs1 = New ADODB.Recordset
 
  rs1.Open "list", cn, adOpenStatic, adLockReadOnly

  sql = "SELECT * FROM listyoko WHERE 契約者名='" & rs1.Fields("契約者名") & "'"
  Set cn = CurrentProject.Connection '接続
  Set rs2 = New ADODB.Recordset
  rs2.Open sql, cn, adOpenKeyset, adLockOptimistic

  Do Until rs1.EOF
  
  If Not IsNull(rs1![区分].Value) Then
    
    
'データなし(新規)
    If rs2.EOF Then
      rs2.AddNew
      For I = 1 To 4
        rs2(I - 1) = rs1(I)
      Next I
'データあり(追加)
     Else
      J = 0
'空のフィールドを検索
      Do Until rs2(J*3+1) = "" Or IsNull(rs2(J*3+1))
        J = J + 1
      Loop
      
      For I = 0 To 2
        rs2(I + J) = rs1(I + 2)
      Next
    End If
'更新
    rs2.Update
  End If
  rs1.MoveNext

  Loop

'オブジェクトの解放
  rs1.Close: Set rs1 = Nothing
  rs2.Close: Set rs2 = Nothing
  cn.Close: Set cn = Nothing
End Function

【5721】Re:応答なしの表示がでる。
回答  小僧  - 05/8/2(火) 9:12 -

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

前回のコードと見比べて…フィールド名は「契約者名」? 「契約者」?

Public Function 横並び()

Dim cn As ADODB.Connection
Dim rs1 As New ADODB.Recordset
Dim rs2 As New ADODB.Recordset
Dim sql As String
Dim cr As String
Dim I As Long
Dim J As Long

  'Application.Echo False
  'DoCmd.Hourglass True

  rs1.Open "list", cn, adOpenStatic, adLockReadOnly
  Set cn = CurrentProject.Connection '接続

  Do Until rs1.EOF
    sql = "SELECT * FROM listyoko WHERE 契約者='" & rs1![契約者] & "'"
    rs2.Open sql, cn, adOpenKeyset, adLockOptimistic
 
  If Not IsNull(rs1![区分].value) Then
  
  
'データなし(新規)
    If rs2.EOF Then
      rs2.AddNew
      For I = 1 To 4
        rs2(I - 1) = rs1(I)
      Next I
'データあり(追加)
     Else
      J = 0
'空のフィールドを検索
      Do Until rs2(J * 3 + 1) = "" Or IsNull(rs2(J * 3 + 1))
        J = J + 1
      Loop
   
      For I = 0 To 2
        rs2(I + J * 3 + 1) = rs1(I + 2)
      Next
    End If
'更新
    rs2.Update
    rs2.Close
  End If
  rs1.MoveNext

  Loop

'オブジェクトの解放
  rs1.Close: Set rs1 = Nothing
  Set rs2 = Nothing
  cn.Close: Set cn = Nothing
End Function

「rs2」は「rs1」のレコードが動く度に開き直す形となります。
当然「Open」「Close」の回数が増える訳で、少量のデータでしたら
前回のコードの方が早い(体感的には変わらないかも…)かと思いますが、
「rs2」のレコード数が増えてくると、こちらの方が早い…と思われ…ます。

【5759】Re:応答なしの表示がでる。
お礼  さつき  - 05/8/5(金) 10:49 -

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

ありがとうございます。
フィールド名は前回と同じです。すいません。
さっそくやってみます。

【5764】Re:応答なしの表示がでる。
質問  さつき  - 05/8/5(金) 11:56 -

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

今さっそくやってみましたが、

>  rs1.Open "list", cn, adOpenStatic, adLockReadOnly

のところで、
「この操作を実行するために接続を使用できません。このコンテキストで閉じているかあるいは無効です。」
というエラーがでます。
アクセスのバージョンのせいでしょうか??
よろしくご教示お願いいたします。

【5765】Re:応答なしの表示がでる。
発言  小僧  - 05/8/5(金) 12:00 -

引用なし
パスワード
   ▼さつき さん:
ごめんなさい。

コードを削ったり付け足したりしていた時のミスです…。

>  rs1.Open "list", cn, adOpenStatic, adLockReadOnly
>  Set cn = CurrentProject.Connection '接続

コネクションする前にオープンしています…。

接続をオープンする前に入れてあげてください。

【5766】Re:応答なしの表示がでる。
質問  さつき  - 05/8/5(金) 13:27 -

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

>コードを削ったり付け足したりしていた時のミスです…。
>
>>  rs1.Open "list", cn, adOpenStatic, adLockReadOnly
>>  Set cn = CurrentProject.Connection '接続
>
>コネクションする前にオープンしています…。
>
>接続をオープンする前に入れてあげてください。


その2行は、前に教えて頂いたコードに入っているので、
2行を入れ替えてみたのですが、こんどは

rs2.Open sql, cn, adOpenKeyset, adLockOptimistic

のところで、「オブジェクトが開いている場合は、操作は許可されません」
と出ます。
どのように直したらいいでしょうか?
度々お手数をかけます。

【5767】Re:応答なしの表示がでる。
発言  小僧  - 05/8/5(金) 13:48 -

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

こちらでは再現しないので、

>オブジェクトが開いている場合は、操作は許可されません

が出る理由から判断させて頂くのですが、

>'更新
>    rs2.Update
>    rs2.Close
      ↑これ!
>  End If
>  rs1.MoveNext
>
>  Loop

が前回のコードより足されておりますが、追加されていますでしょうか?

【5769】Re:応答なしの表示がでる。
質問  さつき  - 05/8/5(金) 14:09 -

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

rs2.Close
は追加されています。やはりACCESSのバージョンの問題なのでしょうか?

【5770】Re:応答なしの表示がでる。
発言  小僧  - 05/8/5(金) 14:33 -

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

>やはりACCESSのバージョンの問題なのでしょうか?

こちらでは再現しないエラーなのですが、
恐らくちょっとしたコードのミスのような気がします。

現在のコードをご提示して頂けないでしょうか?

【5771】Re:応答なしの表示がでる。
お礼  さつき  - 05/8/5(金) 15:13 -

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

やはり、コードのミスでした。
小僧さんの書いて下さったコードをそのままコピーしてみたら、動きました。
スピードも大幅アップです!
ほんとうにありがとうございました。

1686 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078256
(SS)C-BOARD v3.8 is Free