VBプログラマ質問スレ(6.0以前) Part53

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2008/02/22(金) 11:10:26
>>949

>>920 のように書けばいいと思うんだ。
ループの終了条件を後ろに持っていく意図がつかめない。

あと、オープン済みのファイルに対してなら、FileLen 関数より
Lof 関数使ったほうがいいと思う。
953949:2008/02/22(金) 11:17:09
>ループの終了条件を後ろに持っていく意図がつかめない

EOFの検出してから再度ファイルにアクセスしてしまうというのが問題の発端のじゃないかい?

>あと、オープン済みのファイルに対してなら、FileLen 関数より
>Lof 関数使ったほうがいいと思う。

おれが言いたかったのはオープン前の話。

954デフォルトの名無しさん:2008/02/22(金) 12:23:01
>EOFの検出してから再度ファイルにアクセスしてしまうというのが問題の発端のじゃないかい?

問題の解決になっていないのは置いとくが、
そもそも終了条件を後ろにもっていくのはおかしい。

0件のときどうする、なんてのは少なくとも >>936 の頭には
無いように見えたから指摘したまで。

>おれが言いたかったのはオープン前の話。

>>949 からは、そうは感じ取れなかった。スマンな
955デフォルトの名無しさん:2008/02/22(金) 13:09:59
956デフォルトの名無しさん:2008/02/22(金) 20:13:04
String変数にクラスの名前が入っていて、
そのクラスのインスタンスを作成したいんですが、
どのようにすればいいでしょうか?
957デフォルトの名無しさん:2008/02/22(金) 23:56:46
>>956
 Dim clsObject As Object
 Select Case クラスの名前
  Case "犬"
    set clsObject = New TeacupChihuahua
  Case "猫"
    set clsObject = New AmericanShort
  Case "スベスベマンジュウガニ"
    set clsObject = New SilkyBunCrab
 End Select
958デフォルトの名無しさん:2008/02/23(土) 00:03:00
>>957は最高にナイスガイ
959デフォルトの名無しさん:2008/02/23(土) 00:12:46
>>957
それはわかるんですが、クラスの数が多く、
クラスの入れ替わりも多いので、
ひとつの記述でできたらと考えています。
何か良い方法はありませんか?
960デフォルトの名無しさん:2008/02/23(土) 00:21:29
そんなときのためのIDispatch
Object o = CreateObject( ObjectName )
961デフォルトの名無しさん:2008/02/24(日) 13:02:41
別テーブルに同じ名前のフィールド名があるんですが、これをExcelで表現しようと格闘中です。
VB6.0でどのように表現すればいいのでしょうか?

具体的に
テーブル名     A    B
フィールド名   Fname  Fname

があるとします。これをExcelで帳票を作りたいと思っています。
"SELECT a.Fname, b.Fname FROM A a, B b WHERE a.delf = false
としたのですが
Sub Makeline(rs, row)
Cells(row, 1) = rs("a.Fname")
Cells(row, 2) = rs("b.Fname")
と書き込んでもエラーが出ます。
この場合、どのように書けばいいのでしょうか?

知ってる方がいましたら、教えて下さい。
ヨロシクお願いします。
962デフォルトの名無しさん:2008/02/24(日) 13:11:32
select a.fname hoge1, b.fname hoge2 from

rs("hoge1")
rs("hoge2")
963961:2008/02/24(日) 14:26:34
>>962
select文でエラーが出てしまいます。
from以下は同じでいいんですよね?

hogeを指定しなくていいんでしょうか?
964デフォルトの名無しさん:2008/02/24(日) 14:36:03
じゃあ
select a.fname as hoge1, b.fname as hoge2 from
965961:2008/02/24(日) 15:19:30
>>964
おお!できました。ありがとうございます。
おかげ様で上司に怒られなくて済みそうです。
966961:2008/02/25(月) 13:07:47
961です。

昨日はさりがとうございました。&またお尋ねしたいことがあります。
今度は7箇所くらいのテーブルから各々のフィールドを読み込み、帳票を作成しております。
962さんから教えていただいた内容で出来るのですが物凄く時間がかかります。

だいたい1時間くらいかかってしまいます。
SELECT以下の文字が多すぎて読み込みに時間がかかるようです。
もう少し短時間で終わるようにできませんか?
967デフォルトの名無しさん:2008/02/25(月) 13:17:59
DBMSは何?
968デフォルトの名無しさん:2008/02/25(月) 13:53:02
>>966
文字が多すぎるせいじゃないと思うよ。
インデックスとか張れば速くなるんじゃない?
969961:2008/02/25(月) 13:57:30
>>967
PostgreSQLです。

>>968
多すぎじゃないんですか?
でもインデックスの張り方がわからない・・・
ちょっとググってきます。
970デフォルトの名無しさん:2008/02/25(月) 14:16:50
SELECTが遅いんじゃなくてExcelが遅いんじゃねーかと思ったり
971デフォルトの名無しさん:2008/02/25(月) 14:21:37
>>966
当然、エクセルの画面描写をとめてるよね?
972961:2008/02/25(月) 14:30:15
Excelのせいなのかな?

>>971
止めています。データ自体は大した量ないんです。
973デフォルトの名無しさん:2008/02/25(月) 15:02:15
>>972
セルに1個づつデータセットしてないか?
2次元配列作ってRangeオブジェクトに対して一気にセットしてみ
974961:2008/02/25(月) 15:20:01
>>973
ありがとございます。
試してみますね
975デフォルトの名無しさん:2008/02/26(火) 10:08:06
>7箇所くらいのテーブルから
単にSQL文じゃないのか? テーブル7つ結合してるわけじゃないだろうけど。

>>961
SQLが返るのは早くて、編集に時間が掛かってるの? どこが遅いのか切り分けないと。
976デフォルトの名無しさん:2008/02/26(火) 10:53:34
>>975
だな。
EXCELの操作で遅いなら、
Excel Creator使うと高速になるし、
自分で書いてるデータ処理が遅いなら、
ロジック晒せば高速化も出来るだろ。

経験上、データ取ってくるところより、
・取得データをレコードセットのまま操作している
・EXCELのセル1つ1つにデータセットしている
なんてことしてるとやたら遅くなる。
977デフォルトの名無しさん:2008/02/26(火) 12:50:18
この流れはテンプレ化すべきだと思うんだ
978デフォルトの名無しさん:2008/02/26(火) 17:21:11
任意に項目(数量)が追加、削除されるリストボックスの値の合計値を得たいのですが、
list1.list(1)+list1.list(2)…
とやると合計値ではなく連結した文字列になってしまいます。
かといって
Cint(list1.list(1))+Cint(list1.list(2))…
とすると型エラーが出てしまいます。

もしよろしければアドバイスお願いします。
979デフォルトの名無しさん:2008/02/26(火) 21:43:31
>978
> list1.list(1)+list1.list(2)…
> とやると合計値ではなく連結した文字列になってしまいます。

listプロパティはストリングだから、+はストリング同士の連結の演算子になっちゃう。
だから型変換すれば良いのだが、

> Cint(list1.list(1))+Cint(list1.list(2))…
> とすると型エラーが出てしまいます。

俺んとこのVB6はそんなエラー出さないよ。
リストボックスに入ってる値をよ〜く確認してみたら?
Listにデータが何個入ってるのか知らないけど、
整数型に変換できない値がどこかにあるんでしょ。
980デフォルトの名無しさん:2008/02/26(火) 21:47:10
ループで回してやれば、具体的に何番目のデータで型変換に失敗するのか、
デバッグ時に確認しやすいだろ。つか、普通にループ回せ。

  Dim i As Integer, sum As Integer
  For cnt = 0 To List1.ListCount - 1
    Let sum = sum + List1.List(i)
  Next i
981デフォルトの名無しさん:2008/02/26(火) 21:48:34
×For cnt = 0 To List1.ListCount - 1
○For i = 0 To List1.ListCount - 1

orz
982デフォルトの名無しさん:2008/02/26(火) 22:00:03
数値変換できるかどうかは IsNumeric関数使うといい。
983デフォルトの名無しさん:2008/02/26(火) 23:49:07
IsNumericは使うなよ!
984デフォルトの名無しさん:2008/02/26(火) 23:55:37
え、なんでなんで?
985デフォルトの名無しさん:2008/02/27(水) 00:32:55
少しは考えろよ
常識だろこんなの
986デフォルトの名無しさん:2008/02/27(水) 09:25:27
ありがとうございます。
まさに項目の計算で
for i = 0 to listcount
としたのが不味かったみたいでした。
listcount-1 にしたら問題なく動作しました。

こんな簡単な事だったとはorz
987デフォルトの名無しさん:2008/02/27(水) 10:20:48
あるあるww
988デフォルトの名無しさん:2008/02/27(水) 17:12:52
>>984
IsNumeric 関数は、可能な限り数値として認識しようとするから
全角の数字や、一部の特殊文字(\とか)が許されてしまう。

それを踏まえて使うぶんにはいいが、業務プログラムだと許されない事が
多いんじゃないかな。

IsDate 関数も同じような動きをしていて、

? IsDate("2008/2/27")
? IsDate("27/2/2008")
? IsDate("2/27/2008")

3つとも 2008/02/27 と認識されて True を返す。
989デフォルトの名無しさん:2008/02/27(水) 18:30:00
? IsNumeric("¥1,234")
True
? "¥1,234" * 2
2468
? CLng("¥1,234")
1234
IsNumericは通った後にC〜系の型変換使えば何の問題もない。

? Format("2008/2/27","yyyy/mm/dd")
2008/02/27
? Format("27/2/2008","yyyy/mm/dd")
2008/02/27
? Format("2/27/2008","yyyy/mm/dd")
2008/02/27
IsDateは通った後にFormat関数で整えれば何の問題もない。
990デフォルトの名無しさん:2008/02/27(水) 22:27:53
>989
>988が言いたいのは
そもそも2008年2月27日を意図して27/2/2008と打つ奴はイネーだろって話じゃないの?
データ入力者が微妙に打ち間違えたとき、トンでもない日付に解釈されちゃったら
エラーで拾えないだろってことでそ?
991デフォルトの名無しさん:2008/02/27(水) 22:36:10
>>990
>データ入力者が微妙に打ち間違えたとき

もう少し、よく考えた方がいいぞ。
992デフォルトの名無しさん:2008/02/27(水) 22:42:58
ノートで4100と入力しようとして4e100と入力されてオーバーフローおこしたのはどこのどいつだい?
993デフォルトの名無しさん:2008/02/27(水) 22:47:39
お前さんの失敗談乙
994デフォルトの名無しさん:2008/02/27(水) 22:50:24
入力のときKeyPressのイベントかなんかで数字キーのみに限定し、
かつC変換かけるときOn Errorで網張っとくのが普通だわな。
自分の不出来さを晒すなんて(ry
995デフォルトの名無しさん:2008/02/27(水) 22:54:21
どうやら>>992のひとり負けのようですね。
996デフォルトの名無しさん:2008/02/27(水) 23:24:35
KeyPressで文字を弾いてマウスのコピペにやられちゃったのはどこのどいつだい?
997デフォルトの名無しさん:2008/02/27(水) 23:30:35
>>994
経験者乙
雉も鳴かなきゃいいのにね
998デフォルトの名無しさん:2008/02/27(水) 23:33:35
>>996

 あのさ、マジレスすると、お前プログラマ辞めた方がいいよ。
 お前の言ってることは、とりあえず全部回避する方法が有る、
 にもかかわらず、お前は知らないだろ。
 知らないなら知らないでもいい、初心者スレなのだから。
 だがお前みたいに知ったかぶってる奴はいつか、
 誰も助けてくれない状況で他人に多大な迷惑かけるようなミスをやる。

 ここでアドバイスしている連中がIsNumericだけで計算に値を渡すような日曜プログラマみたいなことしないよ。
999デフォルトの名無しさん:2008/02/27(水) 23:35:21
だといいね。
1000デフォルトの名無しさん:2008/02/27(水) 23:39:28
>>996
>KeyPressで文字を弾いてマウスのコピペにやられちゃったのはどこのどいつだい?

てのの答えが以下なような気がw
>>994
>かつC変換かけるときOn Errorで網張っとくのが普通だわな。

必要であれば入力された文字数も数えるし、値変換する前に数字だけかどうかforで回してチェックしたりもするw。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。