• ベストアンサー
  • すぐに回答を!

Accessから値を抽出しようとするとフリーズする

  • 質問No.8837935
  • 閲覧数192
  • ありがとう数7
  • 回答数1

お礼率 54% (47/86)

Excelからマクロを用いてAccessファイルからデータを拾おうとしています。

方法は、Access内のテーブルを参照して検索対象の値1がフィールド内にあれば、その行の値2を抽出してくるといったものです。
検索対象の数は可変です。

そこでコードを書いてみたところ
抽出件数が2件以上なら正常に動作するのですが
1件、0件だと動作せず、フリーズしてしまいます。

何が原因で、どう書き直せばよいのでしょうか?

以下、コードです。

Private Sub OKButton_Click() '選択し、OKボタンを押した時

Dim p As Long
Dim cnt As Long


Range(Cells(45, 4), Cells(114, 6)).ClearContents 'D45~E115のセルを削除(二回目使用時にデータが残ってる為)


cnt = ListView1.ListItems.Count '今まで選択してリストビューに追加された対象数を出し、変数へ。

For p = 1 To cnt

Cells(44 + p, 4).Value = ListView1.ListItems.Item(p)
Cells(44 + p, 5).Value = ListView1.ListItems.Item(p).SubItems(1)
Cells(44 + p, 6).Value = ListView1.ListItems.Item(p).SubItems(2)

Next p 'リストビューに追加された対象を、D45~E115に書き込み


Dim Sql As String
Dim i As Long
Dim j As Long
Dim k As Long
Dim m As Long
Dim n As Long



Call DBconnect(True)

Sql = _
"select Aコード,Bコード " & _
"from テーブル"

'--- adoRsにSELECT文を入れ、絞り込む
adoRs.Open Sql, adoCn, adOpenKeyset


' --- j:選択した対象の数を取得 k:Access内の選択した対象のデータ数を取得 n:列数
j = Worksheets("選択").Range("F45").End(xlDown).Row
k = adoRs.Fields.Count
n = 1


'--- Aコードが一致する行を選択シートの下部分へ書き込み。
' --- 45 to jの45は、選択シートの選択した対象をセルに出力した場所が45行目の為。
' --- cell(j+n,6)は、選択対象数を起点にBコード(値2)一つ毎に数を足していく、6はF列
Do Until adoRs.EOF
For i = 45 To j
If Worksheets("選択").Cells(i, 6).Value = adoRs!Aコード Then
For m = 1 To k
Worksheets("選択").Cells(j + n, 6) = adoRs.Fields!Bコード

Next m
n = n + 1

End If
Next i

adoRs.MoveNext


Loop



'後始末
adoRs.Close: Set adoRs = Nothing
adoCn.Close: Set adoCn = Nothing

質問者が選んだベストアンサー

  • 回答No.1
  • ベストアンサー

ベストアンサー率 28% (1424/5026)

直接的な回答ではありませんが、デバッグの原則的な考え方を、、、
ブレークポイントを設定し、行ごとに実行させ値を確認して問題を突き止めてください。
今後のためにも、やり方を覚えておくと便利です。

http://kabu-macro.com/word/ha-ho/breakpoint.html
http://www.atmarkit.co.jp/ait/articles/1402/20/news144.html
お礼コメント
fwod

お礼率 54% (47/86)

無事、解決致しました。
ありがとうございました
投稿日時:2014/11/26 17:12
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ