トップページ⇒tech
985コメント293KB

v(・∀-)b VBプログラマ質問スレ(6.0以前) Part25

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
VBの質問スレです。

前スレはこちら
  Part16 http://pc3.2ch.net/tech/kako/1034/10343/1034302532.html
  Part17 http://pc3.2ch.net/tech/kako/1036/10361/1036154952.html
  Part18 http://pc3.2ch.net/tech/kako/1038/10381/1038103769.html
  Part19 http://pc3.2ch.net/tech/kako/1039/10398/1039859691.html
  Part20 http://pc2.2ch.net/tech/kako/1041/10418/1041879465.html
  Part21 http://pc2.2ch.net/tech/kako/1044/10440/1044028945.html
  Part22 http://pc2.2ch.net/tech/kako/1046/10463/1046354784.html
  Part23 http://pc2.2ch.net/tech/kako/1047/10477/1047743187.html
  Part24 http://pc2.2ch.net/test/read.cgi/tech/1050151126/

VB.net関連スレ
【老若】VB.net質問スレ【男女】 (Part2)
http://pc2.2ch.net/test/read.cgi/tech/1043629429/

Win32 API関連スレ
Win32API 質問箱 Build10 (979)
http://pc2.2ch.net/test/read.cgi/tech/1047819779/

心得
壱.質問する前に過去ログにも目を通してみる。
弐.質問する前に MSDN などで調べてみる。
参.VBScript もこのスレでOK。
四.インストーラーなどの質問もOK。
五.荒らしは相手しない。
六. VB情報募集中。
七. VB.NETはスレ違い
0446デフォルトの名無しさんNGNG
>1セルに改行コードを含む文字列を書き込むようにするのはどうすればいいですか。
>[alt]+[return]の改行コードがあるんですか。
馬鹿にも程度ってもんがあるだろ!
0447デフォルトの名無しさんNGNG
>>445
LF だけじゃなかったっけ、たしか
0448_NGNG
http://homepage.mac.com/hiroyuki43/hankaku_b01.html
0449デフォルトの名無しさんNGNG
うん、Excelのセル内ではvbLfが改行コード。
0450デフォルトの名無しさんNGNG
Excelやなんかのように、「ガワ」のウインドウの中に
小さなウインドウ(ブック)が開くようなのはどうやったら作れるのですか?
0451デフォルトの名無しさんNGNG
>>450
MDIのことだな、多分。
0452デフォルトの名無しさんNGNG
>>450
あんたもスゲー人だな。
0453デフォルトの名無しさんNGNG
>>451
ありがとうございます。
調べてみます。

>>452
??
0454デフォルトの名無しさんNGNG
あるコマンドボタンがどのコンテナに属しているかを知るには、
やはりフレームなどをドラッグしてみて、それにつられてボタンも移動するかどうかで見分けるしかないんでしょうか?
0455デフォルトの名無しさんNGNG
申し訳ありませんが、印刷のことで質問させてください。
都合により、TrueTypeフォントをプリンタに180度回転させて上下逆にした状態で印刷する必要があるのですが、そのようなことは可能でしょうか?
0456デフォルトの名無しさんNGNG
>>455
CreteFontのEscapeMentを1800かな(ためしてないが)
0457デフォルトの名無しさんNGNG
>>456
なんでMを大文字にする? escapementって一語だぞ。
0458デフォルトの名無しさんNGNG
>>454
大昔ではフォームソース見て包含されているか見て編集していたんだが、今のはどうかな?
テキスト形式で吐ければ何か判るんじゃないの。
0459454NGNG
>>458
.frmファイルを見たら
Begin VB.Frame Frame1
Begin VB.CommandButton Command1
End
End
というふうにフレームの入れ子になってるのがフレームに属してるボタンだとわかりました。
0460460NGNG
オンラインハイスコアみたいなのを作ろうと思うのですが、
どういう風にしたらいいでしょうか?

Open ステートメントかまたはそれと同じように
Web上にアップロードしたファイルから読み込むとか出来るますか?
0461デフォルトの名無しさんNGNG
>>460
perlかなんかでサーバーサイドに集計プログラム作って、
そのcgiにスコアの引数を送受信する形になってくるだろうな。
むろん、暗号化して。
0462460NGNG
わかりました、ありがとうございます。
少ない知識で暗号化もがんばってみます
0463デフォルトの名無しさんNGNG
構造体と動的配列に関する質問です。

構造体
type Atype
 b() as integer
end type
をつくっといて

dim a() as Atype
redim a(2)   ←a()のサイズを2に(これは問題ない)
redim a(1).b(3) ←a(1)に属するb()のサイズを3に

とすると、二つめのredimもa()に対するものとして受け取られてしまい、
b()のサイズを変更できません。
どうしたらこの状態でb()のサイズを操作できるでしょうか?

この方法でなくても、これと同じことができればよいのですが。
0464デフォルトの名無しさんNGNG
>>463
???
その書き方で動きましたが。
0465デフォルトの名無しさんNGNG
VBもいいけど無料でゲットできるDelphiへの移行も考えてみなよ。

ベクターのDelphiのダウンロードページ
http://www.vector.co.jp/soft/win95/prog/se205882.html
VBからDelphiへの移行を支えてくれるサイト
http://www.wwlnk.com/boheme/
0466デフォルトの名無しさんNGNG
Delphiって仕事では使わないからなー
0467デフォルトの名無しさんNGNG
ADOでAddNewでもSQL Insert文をExecuteでも
連続して大量に行おうとすると
メモリをどんどん消費してしまいます

コネクションを切った時点でメモリを開放するようなのですが
途中で開放したり
メモリを消費しないようにする方法はあるのでしょうか?
0468デフォルトの名無しさんNGNG
>>467
ADOを使わないっていうのが一つの手かも
0469デフォルトの名無しさんNGNG
VBの開発なんだが、ファイルのアーカイブを行うのってどういう手段がある?
0470デフォルトの名無しさんNGNG
>>468
DAOですかね。ちょっと、ADOを指定されてて、まいったなぁ。

再現コードです。ループでメモリがどんどん消費されます。MSGBOXのところで、いったんコネクションを切るとメモリが開放されます。
大量のデータをDBに登録したいとき、みなさんだとどうやりますか?

Private Sub Command1_Click()
Dim fso As New FileSystemObject
Dim cat As New ADOX.Catalog
Dim cn As ADODB.Connection
Dim rs As New ADODB.Recordset
Dim i As Long

Call cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & mdb & ";Jet OLEDB:Engine Type=5;")
Set cn = cat.ActiveConnection
cn.Execute "CREATE TABLE XXX(a CHAR(10),b CHAR(10),C CHAR(10),D CHAR(10),E CHAR(10));"
rs.Open "XXX", cn, adOpenKeyset, adLockPessimistic

For i = 0 To 999999
rs.AddNew Array("a", "b"), Array(Format(i, "000000"), "000000")
If i Mod 10000 = 0 Then
MsgBox "refleshしたい"
End If
Next i
End Sub
0471_NGNG
http://homepage.mac.com/hiroyuki43/jaz07.html
0472デフォルトの名無しさんNGNG
>>470
接続プールを使う。
0473472NGNG
あんま意味無いか
0474デフォルトの名無しさんNGNG
Delphiの企業向けの仕事ってあるの?
0475デフォルトの名無しさんNGNG
>>474
ある
0476bloomNGNG
http://homepage.mac.com/ayaya16/
0477デフォルトの名無しさんNGNG
>>472
接続プールって知らない。
ありがとう。それも調べてみるね。
0478デフォルトの名無しさんNGNG
最近VBの仕事が少ないと聞くけど、
delphiほど少なくはないんでしょ?
0479デフォルトの名無しさんNGNG
仕事ならDelphiよりVBだろうけど、VBはこの先先細りだからねえ。
Delphiでなくとも今のうちからC#かなにか覚えておいたほうがいいよ。
0480472NGNG
>>477
470のような場合だと意味ないはず。
0481デフォルトの名無しさんNGNG
>>480
調べてみた。うん、関係ないか。

コネクションを切っても、即効でつなぎなおすとメモリは開放されないんです。
コネクションを切ったあとにMSGBOX出して1秒ぐらいあけて閉じれば
メモリは開放されるんです。

非同期でやってるわけでもないのに、いったい何をキャッシュしてるんだろう。
しばらく毎にアイドリングしなければだめなのかな。
オプションやプロパティーの設定で回避できるものなのか調べてるけど、さっぱりです。
0482デフォルトの名無しさんNGNG
もともとメモリなんてすぐ解放されるもんじゃないだろ。
メモリ管理もろくすっぽやってないDOSとかならともかく。
0483デフォルトの名無しさんNGNG
>>482
そうですが、大量のDB登録で
メモリスワップまで発生してパフォーマンスが落ちては問題ですし
途中でコネクションを閉じてアイドリングさせる方法以外に
もっとスマートでオフィシャルな開放方法があるんじゃないかなと思いまして。

ADOって、連続してレコードを追加する際は、合間に休ませろ
なんて仕様なんでしょうか
聞き方が悪いのかgoogleさんは答えてくれないし、困りました。
0484デフォルトの名無しさんNGNG
どうでもいいけど、リフレッシュのスペルはrefreshだ。
0485デフォルトの名無しさんNGNG
>>484
もう、げんなりですよ。
0486デフォルトの名無しさんNGNG
>>483
ADOのことはよく知りません。
0487デフォルトの名無しさんNGNG
ADOで十万件のINSERTじゃ、どうやっても遅いのは仕方ないんじゃなかろうか。
サーバー側でスクリプトやストアド組むのはダメなの?
0488デフォルトの名無しさんNGNG
>>487
ええと、サバクラじゃなくて、ローカルアプリケーションの内蔵DBといった用途でして
スピードは問題ないんですよ、メモリをなぜか消費してしまうと。

で、今、adLockBatchOptimisticでrs.BatchUpdateにしたら、ぜんぜんメモリ食わなくなりました。
しかも速度もアップ。Batchでまとめるほうがメモリ食わないんでうすね。

そんなわけで、とりあえず、解決しました。いろいろありがと>みなさん
0489デフォルトの名無しさんNGNG
お邪魔します。
あのぉー、どこに質問したらいいのか分からない
くらいもしかしたら初歩的な質問かもしれないの
ですが、、、(汗)
自分でサイトを作っているのですが、
リンクを張って、普通にページに飛ぶのではなくて
小さい小窓のようなウィンドウが開くように
するにはどうしたら良いのでしょうか?

スレッド違いだったらホントごめんなさい。
どなたかよろしくお願いします。。
0490デフォルトの名無しさんNGNG
>>488
あ、嘘。追加されてなかった。
エラーも出ないのかな????
0491デフォルトの名無しさんNGNG
>489
goto http://pc2.2ch.net/hp/
0492デフォルトの名無しさんNGNG
>>490
エラーの場合,エラーが出るはず。UpdateBatchの前にUpdateしてる?
0493デフォルトの名無しさんNGNG
UpdateBatchのサンプルくれ
0494デフォルトの名無しさんNGNG
On Error GoTo ErrH
If (rs.ActiveConnection Is Nothing) Then
Set rs.ActiveConnection = cn
End If

Call cn.BeginTrans
rs.Fields(flagName).value = "1"
Call rs.Update
Call rs.UpdateBatch
Call cn.CommitTrans

Set rs.ActiveConnection = Nothing
Exit Function
0495デフォルトの名無しさんNGNG
レコードセット使わず、ConnectionかCommandだけでやったらいかが?
0496470NGNG
493 494 は私ではないです。

>>492
メインで書いてるコードではエラーが起きない
AddNewのあとにはUpdateしてる

小さいシンプルなコードで書いたらエラーでました。

ちょっと、大きなコードのほうは別のエラーも入っていそうなので、
ちょっと精査してます。
0497デフォルトの名無しさんNGNG
>>495
ええとですね、Connection.Execute で SQL Insert文を連続発行しても、メモリが消費されてしまうんですよ。
で、スピードはAddNewの方が圧倒的に早いのでそっちでためしています。
ですが、メモリの問題がクリアできるなら多少遅くともExecuteでSQL投げます。
0498470NGNG
 Const mdb As String = "c:\tmp.mdb"
 Dim cat As New ADOX.Catalog
 Dim cn As ADODB.Connection
 Dim rs As New ADODB.Recordset
 Dim i As Long

 Call cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & mdb & ";Jet OLEDB:Engine Type=5;")
 Set cn = cat.ActiveConnection
 cn.Execute "CREATE TABLE XXX(a CHAR(10),b CHAR(10),C CHAR(10),D CHAR(10),E CHAR(10));"
 rs.Open "XXX", cn, adOpenKeyset, adLockBatchOptimistic
 
 For i = 1 To 999999
  rs.AddNew Array("a", "b"), Array(Format(i, "000000"), "000000")
  rs("c") = "cccc"
  rs.Update
  If i Mod 1000 = 0 Then
   rs.UpdateBatch
  End If
 Next i
0499デフォルトの名無しさんNGNG
>>497
Execute のオプションに adExecuteNoRecords を付けてる?
0500499NGNG
付けてないみたいだね。
0501470NGNG
>>499
あ、新情報ありがとうございます。調べてみます。
0502470NGNG
Call cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & mdb & ";Jet OLEDB:Engine Type=5;")
Set cn = cat.ActiveConnection
cn.Execute "CREATE TABLE XXX(a CHAR(100),b CHAR(100),C CHAR(100),D CHAR(100),E CHAR(100));", , adExecuteNoRecords

For i = 0 To 999999
 cn.Execute "INSERT INTO XXX VALUES( '" & Format(i, "000000") & "', 'b', 'c', 'd', 'e' );", , adExecuteNoRecords
Next i

これでも、どんどんメモリが消費されてしまうんです。
0503デフォルトの名無しさんNGNG
VB で、自プロセスの消費メモリ容量ってどうやって調べるのでしょうか?
0504デフォルトの名無しさんNGNG
消費してるメモリってDB側なんじゃ
0505デフォルトの名無しさんNGNG
>>503 隣でタスクマネージャ起動
0506デフォルトの名無しさんNGNG
win2kならprocess viewer 立ち上げる方法しか知らない。

細かいけど,Formatは遅いから1000000回のループだと別の方法の方が
いいと思われ。
0507470NGNG
>>504
DB側だと思うけど(JETエンジンのDLL?)
タスクマネージャだとVB6.EXEが増大してます。
0508470NGNG
>>506
Right$("000000" & i, 6) って感じでしょうか。まぁ、これは実際には使わないコードだし、DBのパフォーマンスからみればチリのようなものかと。
0509デフォルトの名無しさんNGNG
今までメモリの消費量なんて気にしたことなかった。
いったい何件追加するの?
DBはAccessなんですよね?
大丈夫ですか?
0510デフォルトの名無しさんNGNG
っていうか、mdbで100万件はMSの保証値を大きく超えてるな
0511470NGNG
>>509 >>510
ん、まぁそう判断してあきらめるのを、どの辺りでするかといったところですかね。
どう判断した場合、何回かごとにコネクションを切断して、数秒アイドリングさせるといったことが必要になります。
できれば避けたいと思っています。
もう少し探してみます。
0512470NGNG
>>510
100万件というのも、場合次第なのですが
レコードサイズもフィールド数も大きいので
メモリの消費量も大きくなるみたいです。
先ほどのコードのCHAR(10)ってのをCHAR(100)にすると、がんがんメモリ食います。
0513デフォルトの名無しさんNGNG
>>470
Connection を使わずに Recordset をダイレクトに開く・・・
0514デフォルトの名無しさんNGNG
なぜにADOX?
0515470NGNG
>>513
試してみます。

>>514
あー、MDBを生成する為です。なにか問題あったりするのでしょうか。
VBに触れて5ヶ月、まだまだわからない定石だらけでして。
0516デフォルトの名無しさんNGNG
これで作ったmdb。うちのAccessだと開けない・・・
データベースの形式 <ファイル名> を認識できません。(Error 3343)
0517470NGNG
ところで、ふつうADOを扱うときは
コネクションを頻繁に切断するものなのでしょうか?
たくさんInsertをしたりするアプリケーションを掻いたことのある人
どうしてましたか?
0518470NGNG
>>516
MDBのバージョンかしら。
Microsoft.Jet.OLEDB.4.0 のところを下げたら見えるかも。
当方Accsess2000で開けています。
0519470NGNG
>>513
rs.Open "XXX", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & mdb & ";Jet OLEDB:Engine Type=5;", adOpenKeyset, adLockPessimistic
ってしても、案の定なんら変わらなかったです。
0520デフォルトの名無しさんNGNG
>>518
うちとこAccess97やけん。おかしいと思った、いつもはOLEDB.3.51やもん
やっぱDAOやな。俺はそれしかしらん。
ADOには泣かされた経験多々,がんがれ
0521470NGNG
>>520
どうしてもADOだめならDAOもやってみるよ
なんか、コネクション切れば開放されるとか言ったけど
それも違ってたよ、開放されたようにみえて開放されてませんでした
再開したら同じとこまで戻っちゃう。
0522デフォルトの名無しさんNGNG
>>521
今ダオってみてるけど。桁が違うだけでリークされちまう・・鬱 ビルゲイツのバカやロウ!
0523470NGNG
>>522
そうですかぁ。DAOはさわったことなかったので、調べつつやってみてますけど
気力が・・・。
こつこつ、ひとつづつ、つぶしていきます。
0524デフォルトの名無しさんNGNG
>>517
それは接続プール。
cn.Closed
とすると、実はWindowsが裏でしばらくの間保持していてくれる。つぎにコネ
クションを張ったときにはこのプールされた接続を使う。
0525470NGNG
>>524
なるべく、メモリを消費しないようにするにはどうしたらよいのでしょう?
アプリケーションを再起動しないとだめなんでしょうか?
0526デフォルトの名無しさんNGNG
vbsでDOSプロンプトから入力する方法を教えて下さい
> test.vbs
> メッセージを入力して下さい ← これが表示される
> xxxx ← 値を入力する

ソース側で値を受け取る方法も教えて下さい
よろしくお願いします
0527長文御無礼NGNG
'一応DAO貼り。環境が違うので保証しがたいです。
'メモリ使用はワークスペースのサイズで、一度膨れたサイズは再利用されてる様子。
'(一回目Cancel→弐回目Cancel として動きを確認 排他制御やインデックスは別問題としてほしい)
'とりあえずうちとこの三勝設定 Microsoft DAO 3.51 Object Library のみ
Private Sub Command1_Click()
Dim db As Database: Dim rs As Recordset: Dim td As TableDef: Dim I As Long
Dim rc As Integer
On Error GoTo eHandle
Set db = Workspaces(0).CreateDatabase(Format(Now(), "HHNNSS") & ".mdb", dbLangJapanese)
Set td = db.CreateTableDef("XXX")
td.Fields.Append td.CreateField("A", dbText, 10)
td.Fields.Append td.CreateField("B", dbText, 10)
td.Fields.Append td.CreateField("C", dbText, 10)
db.TableDefs.Append td
Set td = Nothing
Set rs = db.OpenRecordset("XXX")
For I = 0 To 999999
rs.AddNew
rs.Fields(0) = Format(I, "000000"): rs.Fields(1) = "000000"
rs.Update
If I Mod 10000 = 0 Then
rc = MsgBox("refleshしたい", vbYesNoCancel + vbDefaultButton2)
If rc = vbCancel Then
Exit For
ElseIf rc = vbYes Then
End If
End If
Next I
Exit Sub
eHandle:
MsgBox Err.Description, vbMsgBoxHelpButton, , Err.HelpFile, Err.HelpContext
End Sub
0528デフォルトの名無しさんNGNG
>>526
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/install.htm
0529デフォルトの名無しさんNGNG
ttp://homepage2.nifty.com/inform/vbdb/daoado.htm
0530470NGNG
>>527
ああ、とても助かります。ありがとうございます。

で、DAOも駄目なのかぁ。。。さてと。どうしようかなぁ。
0531デフォルトの名無しさんNGNG
まだやってんのか、これ…
0532470NGNG
>>531
すんません、なんかFAQネタかと思うぐらいシンプルなのに
はまってしまったようで・・・
0533デフォルトの名無しさんNGNG
>>532
オマエが言うな
0534526NGNG
>>528-529
有難うございます。
inputboxでpop upからの入力は分かりますが
DOSのコマンドプロンプトからの入出力が分か
りません
お手数ですがお願いします
0535デフォルトの名無しさんNGNG
【PC版】Ever17-the out of infinity【大失敗作】
http://www2.bbspink.com/test/read.cgi/erog/1053601941/
0536デフォルトの名無しさんNGNG
VBでスレッドの優先度を落とすのはどうすればいいのですか?VCならそれっぽいのがあるのですが・・・。VBでは見つかりません。
0537470NGNG
>>533
なんで気を悪くされたのか、わかりません。
簡単な問題そうに思えたのに、意外と難しかった。
と思っています。
0538デフォルトの名無しさんNGNG
>>536
VCでのそれっぽいやり方を晒せや。それが可能かどうか答えが返ってくるだろ。
0539デフォルトの名無しさんNGNG
--------●○●別れさせ屋●復讐代行業務●○●----------

●騙された・裏切られた・弄ばれた・逃げられた・捨てられた・
相手に誠意が無い・異性問題・家庭内暴力・不倫疑惑解明・人間関係・金銭トラブル★
●  http://www.blacklist.jp/i 【ファイルにコピーして開いて下さい】
別離工作・情報収集・トラブル対策・ボディガ―ド・等々!
●真剣にお悩みの方、安心してご相談下さい。解決へ導きます★
□■各種データ・電話番号調査・住民票・戸籍謄本など調査■□
ジャンプしない場合にはファイルにURLをコピーして開いて下さい★☆★
●  http://www.blacklist.jp/i  ●別れさせ屋・特殊工作・調査全般
●  http://www.blacklist.jp/   ●復讐代行・人生相談・駆け込み寺
--------------------------
リンク⇒ http://okudaira.co.jp 殺人事件簿!!!●●●
●リンク広告主大募集・詳しくは復讐屋まで!!!
0540470NGNG
http://support.microsoft.com/default.aspx?scid=kb;en-us;124709
これかな
0541526NGNG
vbsを右クリして”コマンドプロンプトで開く”でやっても
pop upが出ます。
cuiで入出力をやりたいんですが...。
0542デフォルトの名無しさんNGNG
>>541
他の言語つかえ。
0543デフォルトの名無しさんNGNG
VBでエラーが発生したとき、その発生した行を特定する方法ってありますかね?
0544526NGNG
>>542
できないんですか。分かりました。
有難うございます。
0545デフォルトの名無しさんNGNG
>>543
EXEになってたら行もなにもあったもんじゃないだろ?
■ このスレッドは過去ログ倉庫に格納されています