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

このエントリーをはてなブックマークに追加
888デフォルトの名無しさん:04/12/09 22:09:58
>>885
いや、確かそうとも言い切れないケースがあったはす。
確か参照渡しの引数を一つ取る関数を括弧をつけて呼び出すと、
括弧をつけたことにより変数の参照ではなく値が渡されてしまい
期待するのと違う結果になる、みたいな話だと思ったが。。

VBに限らないけど、プログラミング言語ってちょっと触ってないと
どんどん忘れていくな。
889デフォルトの名無しさん:04/12/09 22:33:40
>873
890デフォルトの名無しさん:04/12/09 22:34:56
>873
ExcelのIF関数と同じと思えばいいのかな?
891デフォルトの名無しさん:04/12/09 23:54:49
括弧をつけない
MsgBox "hoge"
MsgBox "hoge", vbOkOnly
MsgBox ("hoge")         ←───
MsgBox ("hoge"), (vbOkOnly)

括弧をつける
Call MsgBox("hoge")
n = MsgBox("hoge", vbYesNo)
n = MsgBox(("hoge"), (vbYesNo))
892デフォルトの名無しさん:04/12/10 01:51:08
>871
WHERE句の最初に必ず満たす条件を
つけとけば判定1回づつで済まない?
例:
 strSQL = "SELECT * FROM TABLE"
 strSQL = strSQL & " WHERE 1 = 1"
 If A <> "" Then
  strSQL = strSQL & " AND " & SQL条件文1
 End If
 If B <> "" Then
  strSQL = strSQL & " AND " & SQL条件文2
 End If
893デフォルトの名無しさん:04/12/10 02:25:57
IIf はパフォーマンスが悪いのも問題だが、
IIf(x = 0, 0, 1 / x)
みたいな書き方ができなくて不便でもある。
894デフォルトの名無しさん:04/12/10 07:19:53
>893さん
なんでできないの?
895893:04/12/10 08:07:30
>>894
上で散々話題になってるじゃん。
IIf って結局ただの引数が3つの関数だから、
関数に値が渡されるときに x = 0 のときでも、1 / x まで評価されて
0 除算エラーになってしまう。
896デフォルトの名無しさん:04/12/10 09:52:01
>>892
SQL文に余計な条件をつけることで、万が一にパフォーマンス等に影響があったら論外なのでパス。
完全なプログラマ都合じゃん 1=1なんて。
897デフォルトの名無しさん:04/12/10 10:33:26
テキストボックスに入力したファイルパスが存在するか調べるにはどうしたらよいですか?
c:\test\test.txtのように入力したときとかです
898デフォルトの名無しさん:04/12/10 10:49:02
500とか600の値を時間としてh:nn:ssの形式で表示させていのですけど、
どうすればいいのでしょうか?
899デフォルトの名無しさん:04/12/10 11:01:21
>>897
InstrRevで一番右の¥位置を取って、それより左をフォルダパスとして保持。
Dir関数で第二パラメータにvbDirectoryかなんか指定。

>>898
数値は何の値?秒数?文字列?(500は500秒?、5:00?)
900デフォルトの名無しさん:04/12/10 11:04:18
>>899
すいません。秒数です。
901デフォルトの名無しさん:04/12/10 11:10:23
60*60で割った商がH、60で割った商がM、60で割った余りが秒。
902デフォルトの名無しさん:04/12/10 11:18:10
>>901
ありがとうございます。
903デフォルトの名無しさん:04/12/10 11:46:15
>>899
ありがとうございまた
904デフォルトの名無しさん:04/12/10 14:27:36
VBコードを変換したいのですが正規表現で置換しようと
思っていますが妥当でしょうか?アドバイスよろしくお願いします
<次の文字列は右のように変換する>
MLdbdata(hDBProc, 1) -> rs1.Field(0).value
MLdbdata(hDBProc2, 10) -> rs2.Field(9).value
法則1hDBProcはrs1に読み替える
法則2hDBProc1,10の10は常に-1する

905デフォルトの名無しさん:04/12/10 14:42:37
>>904
すでにVBの話じゃないよな? 妥当? 好きなようにやればいい。
906904:04/12/10 14:49:46
>905
わかった。ありがとう
秀丸板さがします
907デフォルトの名無しさん:04/12/10 21:13:07
>899
解雇
908デフォルトの名無しさん:04/12/10 21:14:09
┐(´-`)┌
909デフォルトの名無しさん:04/12/11 09:31:22
マルチスレッドでグローバル変数の値を読んだり書いたりする際に
注意すべきことってありますか?
910デフォルトの名無しさん:04/12/11 10:03:35
ADOである名前のテーブルが存在するかどうかはどうやってしらべるのでしょう?
SQL="Table Exist('NorthWind')"
conn.execute(SQL)
みたいなものだと予想してます
911デフォルトの名無しさん:04/12/11 11:50:22
>910
え?
912デフォルトの名無しさん:04/12/11 11:54:37
>>910
ADOXを使うとか。
ADODB.ConnectionオブジェクトのOpenSchemaメソッドを使うとか。
913デフォルトの名無しさん:04/12/11 12:16:10
自己解決してたけどどーも


Const adSchemaTables = 20
rc = conn.openschema(adSchemaTables)
で、データベース内のいくつものテーブル名はコレクションとしてとりだされるから
rc("TABLE_NAME").valueをさらにFor EachとかDo whileで1個ずつとりだせた。


do until rc.eof
S+=rc("table_name").value
rc.movenext
loop

debug.print S
914デフォルトの名無しさん:04/12/11 12:56:56
>913
さすが
915デフォルトの名無しさん:04/12/11 13:35:07
>>909
VBのバージョンは?マルチスレッドの実現方法は?
916デフォルトの名無しさん:04/12/11 13:45:32
>915
VB6.0で、実を言うとマルチスレッドと言うか、1つは
DLLからのコールバック関数で、もう1つはタイマーイベント
なんです。そもそもこれってマルチスレッドって言うんですかね。
917デフォルトの名無しさん:04/12/11 14:35:24
>>916
スレッドのIDを表示させてみたら分かる。
918デフォルトの名無しさん:04/12/11 16:48:58
>>916
開発環境はOKで、コンパイルするとNGってパターンじゃない?
そもそもVB6は普通のマルチスレッドには対応してなかったと思う。
「動く時はある」だろうけど、やっちゃいけないことではないかと。
919デフォルトの名無しさん:04/12/11 18:03:16
VBのマルチスレッド処理は昔のVBマガジンにある。(前世紀かも・・・。w)
あと、PCDNとかでサンプルあるかもしれん。

マルチスレッド、出来る出来ないは出来る。でも、わざわざVBでやらんほうがいい。
920デフォルトの名無しさん:04/12/11 18:37:47
>919
タイマ使ったらそれだけでマルチスレッドではないの?
921デフォルトの名無しさん:04/12/11 19:58:48
>>920
だいぶ違うと思うぞ
922デフォルトの名無しさん:04/12/11 20:05:23
>921
マジで。タイマーたくさん作ったらそれぞれ別スレッドで動いてると思ってた。
923デフォルトの名無しさん:04/12/11 21:15:07
Windowsのメッセージについてきちんと勉強したほうが良いと思う。
それと、VBのDoEventsと、一般基礎知識としてのプロセスとスレッドの勉強。
924デフォルトの名無しさん:04/12/12 04:51:06
>923
そかー。サンクス
925デフォルトの名無しさん:04/12/12 05:27:54
>>922
だから、スレッドのIDを表示させてみろって。
926デフォルトの名無しさん:04/12/12 07:47:04
>925
どうやるの?
927デフォルトの名無しさん:04/12/12 08:12:07
>>926
GetCurrentThreadId

> 解説
> スレッド ID は、そのスレッドが終了するまで、システム上でユニークな(一意の)値となります。
928デフォルトの名無しさん:04/12/12 09:51:26
>927
ありがとう。確かに一緒でした。
929デフォルトの名無しさん:04/12/12 09:54:43
>927
DLLからのコールバックはスレッドIDが別でした。
というのもDLL内でスレッドを起動しているので当たり前なのですが・・・
というわけでやはりマルチスレッドなのですが、グローバル
変数を読み書きする際に注意する点はあるでしょうか。
930デフォルトの名無しさん:04/12/12 11:12:59
>>929
>923。
質問が漠然としすぎ。
931デフォルトの名無しさん:04/12/12 11:20:27
>>929
マルチスレッドは、複数の処理が同時に進行する。
例えばグローバル変数を G、ローカル変数を L とするとき、

L=G
L=L+1
G=L

が2つのスレッドで同時に処理されたとしたら、Gの最終的な値は保証できない。
(2人の人間に上記の処理をさせたことを想像してみるといい)

簡単な指針としては、グローバル変数の値を変更するときは
InterlockedIncrement 等の Interlocked 系 API を使う。

処理が複雑で、これらの API を適用できないときは
処理の前後を EnterCriticalSection と LeaveCriticalSection で囲む。
パフォーマンス低下やデッドロックにならないよう使い方に注意すること。
932931:04/12/12 11:21:42
それにしても、VBでやることじゃない気がする。
933デフォルトの名無しさん:04/12/12 11:27:05
>931
ありがとうございます。InterlockedExchangeでうまくできそうです。

>932
色々事情がありまして・・・

とにかくありがとうございました。
934デフォルトの名無しさん:04/12/12 14:01:03
31×31の配列idata(i,j)にあるデータをランダムアクセスで
書き込み、読み込みをしたいのですが、これで書き込みしたのを読み込みできません。なぜでしょうか?
Sub failsave()
Open "c:\back.bin" For Random As #1 Len = LenB(idata(1, 1))


For i = 0 To 30
For j = 0 To 30
k = 1
temp = idata(i, j)
Put #1, k, temp
k = k + 1
Next j
Next i

Close #1
End Sub
935デフォルトの名無しさん:04/12/12 14:07:08
>>934
プログラミング以前だね。
まず人に読んで理解してもらえるよう文章を推敲することを覚えるべきだ。
そういうの「片手落ち」って言うんだよ。
936デフォルトの名無しさん:04/12/12 14:49:24
演算子\と/はどう違う?
937デフォルトの名無しさん
>>934
読み込みが失敗してるなら、
読み込み部分も提示しなきゃどうしようもねぇだろ。
エラーがでてるのかどうなのかも書いてないしな。

っていうか、Option Explicit入れてエラーが出ないコードにしてから
出直して来いって感じだな。(たぶんその辺じゃないかと思うけどさ)

片手落ちっていうか9割落ちだな。必要な情報が1割もねぇ。