
環境:VB6.0+SP5, DB: Adaptive Server AnyWhere
こんにちは。
プログレスバーコントロールの使い方について質問させていただきます。
データベースにクエリを投げて、レコードセットを取得する関数myFunctionを次のように書きました。
ここで処理の進捗に合わせてプログレスバーを表示する機能を追加したいと思います。
参考書を調べた結果、↓のようなもの組み込めば良いのだろうと考えましたが、
繰り返し文の中身をどう記述して良いものかわかりません。
申し訳ありませんがお力を貸して頂けないでしょうか?
また、もっとスマートな方法があれば、そちらも教えていただけると助かります。
/////////////////////////////////////////////////////
'プログレスバーコントロールを設置したフォームを呼び出す
frm_progressBar.Show
frm_progressBar.ProgressBar1.Visible = True
frm_progressBar.ProgressBar1.Max = q_rs!rNum
For i = 1 To q_rs!rNum
frm_progressBar.ProgressBar1.Value = i
'レコード取得
Next i
//////////////////////////////////////////////////////
Public Function myFunction(query As String) As Recordset
Dim p_rs As Recordset 'DBから取得したレコードセット
Set p_rs = New ADODB.Recordset
Dim q_rs As Recordset 'レコード件数を格納
Set q_rs = New ADODB.Recordset
Dim i As Integer '
'テーブルのレコード件数を取得
Set q_rs = con.Execute("SELECT COUNT(*) as rNum FROM AppEnd_Logs", , adCmdText)
p_rs.CursorLocation = adUseClient
p_rs.Open query, con, adOpenStatic
Set myFuncsion = p_rs
q_rs.Close
Set q_rs = Nothing
End Function

No.1ベストアンサー
- 回答日時:
ソースを見る限りだとレコード件数分だけ「何か」させたいのですよね?で、1件処理したらプログレスバーをびょーんって伸ばしたいんだと思うのですが...違います?
1.プログレスバーの使い方はよいようですが、minも設定することをおすすめします。
2.「繰り返し文の中身をどう記述して良いものかわかりません。」
→繰り返し文とはfor文のところを指していますよね。何をさせたいか分からないので答えようがありません。申し訳ないです。ひょっとして、自作関数の使い方を聞いてます?
3.「また、もっとスマートな方法があれば、そちらも教えていただけると助かります。」
→私なら、myFunctionはRecordsetではなく件数を返すようにします。あとはこんな感じかな?
-----------------
'プログレスバーフォーム表示
load frm_progressBar
frm_progressBar.show
with frm_progressBar.ProgressBar1
.min = 0
.max = myFunction(ぱらめた)
.value = 0
end with
'件数分だけぐるぐる回す(.max-1しているのは0から開始しているため)
for i = 0 to frm_progressBar.ProgressBar1.max-1 step 1
'レコード取得
<<処理ロジック>>
'プログレスバーをびょーんって伸ばす
frm_progressBar.ProgressBar1.value += 1
next i
-----------------
さらにやるなら、frm_progressBarに「let property」でプロパティを作り、それを使ってカウントアップやmin/max値を設定できるようにするくらいです。
回答ありがとうございます。
説明が不足していました。
関数myFunctionはDBにクエリを投げて結果を取得する為に作成しました。
レコードの件数がそれなりに多いので↓の行でそれなりに時間がかかってしまいます。
p_rs.Open query, con, adOpenStatic ...(*)
そこで処理の進捗をグラフィカルに表示できないか?と思いこのような質問をした次第です。
つまり、回答者様がおっしゃるように
>1件処理したらプログレスバーをびょーんって伸ばしたいということです。
関数myFunction中でレコード件数を取得しているのは、プログレスバーのmaxに利用するためだけであり、
実際の処理では必要ありません。(質問の際に分離するのを忘れていました。)
レコード取得の進捗と、カウンタを繋げてFOR文を書けば良いというのも理解できます。
わからないのはループの中に「レコード1件の取得」をどのように記述すれば良いのか、ということです。
上記(*)のような書き方であれば、一行で全件のレコードを取ってきてしまうと思います。

No.2
- 回答日時:
なるほど理解しました。
自作関数はmax件数を取得するだけなのですね。
RecordsetオブジェクトにRecordCountというのがありますので、これで件数を取得することができます。
→http://www.microsoft.com/japan/msdn/library/defa …
なので、自作関数でselect count(*) ~ではなく、select 項目名~でRecordsetを取得しましょう。で、maxプロパティにはq_rs.RecordCountで件数を設定し、あとは参考URL(vbaですが、基本的に一緒です)にあるとおり
Do Until RS.EOF
debug.pring RS!フィールド名
RS.MoveNext
Loop
でReccordsetのEOFまでまわせばOKです。
参考URL:http://www.geocities.jp/cbc_vbnet/ADO/recordset. …
お礼が遅くなってしまいました。
どうにも私の説明のしかたがまずかったみたいで、お手数ばかりかけてしまいました。
要はDBにクエリを投げて、それを取得するまでにかかる時間を計りたかったのです。
あの後資料をみれば、やはり無理っぽいとのことでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBA セルの値がおかしいです
-
VBA セル間のリンク修正につい...
-
【マクロ】並び替えの範囲が、...
-
vba textboxへの入力について教...
-
ワードの図形にマクロを登録で...
-
エクエルのVBAコードについて教...
-
複数のExcelファイルをマージす...
-
Vba Array関数について教えてく...
-
【マクロ】シートの変数へ入れ...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
Excel VBA 選択範囲の罫線色の...
-
VBAでCOPYを繰り返すと、処理が...
-
【マクロ】開いているブックの...
-
えくせるのVBAコードについて教...
-
VBAの「To」という語句について
-
VB.net 文字列から日付型へ変更...
-
【ExcelVBA】5万行以上のデー...
-
VBA ユーザーフォーム ボタンク...
-
Vba セルの4辺について罫線が有...
-
vbsでのwebフォームへの入力制限?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ADO VBA 実行時エラー3021
-
差し込み印刷のレコード数について
-
レコードが存在しなかった場合
-
アクセスでレポートの1印刷内...
-
DataGridViewの、選択されてい...
-
JSPのNULLレコード表示について...
-
ヘッダレコードとトレーラレコ...
-
ACCESSで大量の更新を行うと「...
-
サブレンジ分割されたNDB(富士...
-
カレントレコードが無い事を判...
-
ワードの差込印刷で教えて下さ...
-
固有レコード識別子の選択とは
-
Access でレコードセレクタが押...
-
[VBA] ADOの Clone と AddNew
-
ファイル書込みで一行もしくは...
-
DataGridViewの内容をDBに反映...
-
VB6.0のIsNull関数に相当するもの
-
Access を×ボタンで閉じ...
-
Accessデータシートビューの行...
-
Line Inputで文字化け(助けて...
おすすめ情報