1 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 10:00:19 ] 前スレ VB.NET質問スレ(Part29) pc12.2ch.net/test/read.cgi/tech/1235206416/l50 テンプレは>>2 〜
620 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 21:11:39 ] その固有のメッセージってのはアプリのインストール後にテキストエディタとかで修正したりするモンなの?
621 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 21:15:49 ] VB2008EEでExcelにデータを書き出すソフトを作っています。 使う人によってExcelのバージョンがまちまちなのでCOMは使わず以下のような感じです。 Dim xlApp As Object Dim xlBook As Object Dim xlSheet As Object xlApp = CreateObject("Excel.Application") xlBook = xlApp.Workbooks.open(パス) xlSheet = xlBook.Worksheets(1) xlSheet.Cells(1, 1).Value = "あああ" '※1 xlSheet.Cells(1, 2).Value = "いいい" '※2 xlApp.DisplayAlerts = False xlBook.Save() xlBook.Close() xlApp.Quit() xlSheet = Nothing xlBook = Nothing xlApp = Nothing GC.Collect() データを入力する部分で、※1だけなら問題ないですが※2を追加するとプロセスが残ってしまいます。 何が原因なのでしょうか。 開発環境のExcelは2000です。
622 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 21:24:44 ] 思いっきりCOM使ってるよそれ vb.net excel プロセス でググるといろいろ出てくる ちゃんと作るのは非常に面倒だからそこだけWSHのVBSなんかで書いてもいいよ
623 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 21:42:22 ] >>619 情報ありがとうございます。 試してみます。 >>620 テキストファイルで修正できることを前提にしています。 開発終了後にそんな日が来るとは思いませんが、 どっかのエロいアーキテクトが書いたらしい規約に従う必要があるので……
624 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 21:45:48 ] >>622 レスありがとうございます。 COM参照を先にするかあとにするかだけで処理は一緒って認識で合ってますか?オブジェクト使う度に解放が必要と。 WSHは使ったこと無いので調べてみます。
625 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 21:49:39 ] いやGCに頼るのは不確実だからMarshal.ReleaseComObjectを使って 必ず逐一全て手動で解放する必要がある
626 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 23:07:25 ] >>616 ソリューションファイルを開いたときに、New Excel.ApplicationやExcel.Workbooksの所に波線が引かれ、コンパイルができないのです。 >>617 dllが存在しないと、参照設定のExcelとかInterop.Microsoft.Office.Coreのところに三角のマークが出るような気がしました。 確かに全てのファイルを表示にはしていなかった可能性があるので、obj配下にdllが存在しなかったのかもしれません。
627 名前:606,626 mailto:sage [2009/07/25(土) 23:12:27 ] 参照設定のExcel等の所に三角マークが出ていなかったので、Interop.Excel.dll等は存在するものと思ったのです。
628 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 23:17:26 ] >>625 できました。ありがとうございました。 ちなみに>>621 はMSのサンプルを真似たものなんですが、結局全然違うコードになりました。 あのサンプルは一体何だったんでしょうか…。
629 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 23:22:08 ] >>626 それ一番最初に書くところ みんな実行時だと思ってたんだから でね、それは単に参照が無いだけだから
630 名前:606 mailto:sage [2009/07/25(土) 23:26:56 ] >>629 ありがとうございます。 プロジェクトのディレクトリごとコピーしているので、obj配下にdllはあるのではないかと思います。 参照設定でも三角マークは出ていませんし。 全く同じコードをプロジェクトごとコピーしたのに、端末によってコンパイルができない理由がわからないのです。
631 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 00:00:18 ] >>630 あーもう じゃ「参照が有効になってない」って言えばいい? 一度参照削除してもう一度登録しなおしてみ?
632 名前:606 mailto:sage [2009/07/26(日) 00:15:33 ] >>631 どうもです。 一度参照設定のExcel等を削除して登録し直したのですが、それでも駄目でした。 どうも端末依存でアセンブリの問題があるらしいので、それが原因のような気もしているのです。 他の人も逆に私がコンパイルできない端末でないとコンパイルできないようなことを言っていたし、 端末固有の設定がおかしいのかもしれません。
633 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 00:25:12 ] 2003時代にエクセルを参照したプロジェクトを複数の開発環境に持ってくことを 何度かやったことがあるけどそんな問題は起こった記憶がないな。 まさかとは思うけど、 (1) 環境ごとにエクセルのバージョンが違う (2) エクセルそのものがインストールされてない なんてことはないよね?
634 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 00:34:48 ] >>633 ありがとうございます。 エクセルはインストールされていて、両方2003だったと思います。 コンパイルできない端末には確かFlex Gridがインストールされているなど、特殊な設定がなされているのです。 自宅では問題なくコンパイルできていますし、やはり端末依存の問題なのかもしれません。 Marshal.ReleaseComObjectを使っても逆に不安定になったりするし、.NETからエクセルを動かすのは難しいなぁ。
635 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 00:48:31 ] あー それは複数のassenblyファイルがある場合だわ 消したらいいよ。
636 名前:550 mailto:sage [2009/07/26(日) 01:14:25 ] >>598 それよさそうですね。 ちょっと試してみようと思います。 ただ問題は、ロックファイルの出力先が固定になっている部分です。 mdbファイルの場所を移動しても探せるように、Connectionstringをいじれる仕様なので、 ロックファイルの出力先アドレスをxmlファイルに保存しなきゃいけないかも知れません。 納期が近い為、そこまで手が回りませんが参考になりました。 どうもありがとうございました。
637 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 01:17:10 ] >>635 AssemblyInfo.vbではなく、確かWindowsディレクトリ配下にアセンブリファイルがあり、それが端末によって異なっているせいで 端末によってコンパイルできたりできなかったりするような話は聞きました。 Dim app As Object Dim book As Object Dim sheet As Object app = CreateObject("Excel.Application") こんな感じに書くとコンパイルできるようなので、もうコードを書き直すしかないのかなと思っています。
638 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 01:43:08 ] >>636 普通app.configに書かない?
639 名前:550 mailto:sage [2009/07/26(日) 01:44:08 ] >>598 ただいま、試験的にプログラムを作って動かしたんですが、完璧ですね。 streamwriterをcloseしない限りは、そのアプリが専有で開いてるから 他からのアクセスが出来ないってことですね。 プログラムが異常終了しても自動的にlockfileへの専有が外れるから 他からのアクセスが可能になるということですね。 これかなりいいと思います。 ありがとうございました。
640 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 02:01:26 ] >>639 当初の質問と関係なくなってるなw
641 名前:550 mailto:sage [2009/07/26(日) 02:33:32 ] lockfileを隠しファイルにしたかったんですが、隠しファイルにすると VBから見えてないのか、Streamwriterで例外エラー拾いますね。 たいした問題じゃないので我慢するしかないですねこれは・・・
642 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 20:18:52 ] 排他Openできるんならコネクションを開いたままにしとけばいいって何度も言ってるのに なんでわざわざ独自に作りこむのかね。
643 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 20:24:27 ] その方法がわからないからだろハゲ
644 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 20:58:34 ] 全コードで TableAdapter の Connection 書き換えれば 排他で開きっ放しに出来るだろうけど手間考えたら >>598 みたいな方法が一番簡単だな
645 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 21:09:33 ] そもそもその排他オープンが安全なのかが怪しいんだよね それなら別次元の排他処理をしてしまうのもあり だいたいちゃんとするならDBサーバーを入れるべきだし。
646 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 06:22:32 ] Dim psi As New System.Diagnostics.ProcessStartInfo Dim p As System.Diagnostics.Process Dim ssPath As String = "C:\Program Files\Microsoft Visual Studio\VSS\win32\ss.exe" Dim ssDir As String = "C:\Program Files\Microsoft Visual Studio\VSS\win32" Dim ssUser = "user" Dim ssPwd = "user" Dim GetPath = "D:\work" If ssPath.IndexOf(" ") > 0 AndAlso ssPath.Substring(0, 1) <> """" Then ssPath = String.Format("""{0}""", ssPath) End If 'ComSpecのパスを取得する psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec") '出力を読み取れるようにする psi.RedirectStandardInput = False psi.RedirectStandardOutput = True psi.UseShellExecute = False 'ウィンドウを表示しないようにする psi.CreateNoWindow = True 'コマンドラインを指定("/c"は実行後閉じるために必要) psi.Arguments = "/c " & ssPath & " get -gtm " & sName & " -GL" & GetPath & " -Y" & ssUser & "," & ssPwd '起動 p = System.Diagnostics.Process.Start(psi) result = p.StandardOutput.ReadToEnd こんな感じでVSSから最新バージョンを取得しているのですが、データベースのパスを指定したいと思い、 psi.Arguments = "/c set SSDIR=" & ssDir & " && " & ssPath & " get -gtm " & sName & " -GL" & GetPath & " -Y" & ssUser & "," & ssPwd のようにset SSDIRを追加すると取得できなくなってしまいます。 どこが間違っているのでしょうか?
647 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 07:40:11 ] &で文字列連結すんな
648 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 08:02:57 ] >>647 ildasmで見ると、String.Concatで連結されているのが確認できるよ。 こういう一連の連結に使う分には何ら問題は無い。
649 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 08:06:19 ] && だと環境変数は引き継がれないみたいだね
650 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 08:22:00 ] 連結後に更に連結するなら、せめてString.Formatを…。 読みにくくてかなわん。
651 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 08:36:24 ] 少しヒント cmd /c"set AAA=XXX && echo %AAA%" %AAA% cmd /V:ON /c"set AAA=XXX && echo !AAA!" XXX
652 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 23:07:00 ] 複数のBMPの画像をAVI動画に変換する方法を大まかにおしえて
653 名前:646 mailto:SAGE [2009/07/28(火) 00:10:18 ] みなさんありがとうございます。 週末に試してみようと思います。
654 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 01:10:35 ] >>652 1.Windows ムービー メーカー を起動する 2.対象の画像を読み込む 3.ムービーの発行でDV-AVIを選んで実行 4.AVI動画が完成\(^o^)/
655 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:21:11 ] ODP.NETを使用し、パッケージをコールしてDataSetを取得し、 コンボボックスのDataSourceにDataTableを入れたのですが、 中身が表示されません。 DisplayMemberとValueMemberプロパティにも項目名を設定しています。 セットした後に、SelectedValueとSelectedTextの値を見ると、 SelectedValueには値が入っていますが、SelectedTextには値がありません。 パッケージをコールすると、 表示する用の文字列と裏で持つ用の文字列を複数レコード取得します。 調べても、問題ないと思うのですが何が悪いのでしょうか? combo1.DataSource = DataTable combo1.ValueMember = "AAA" combo1.DisplayMember = "BBB" 試しに、AAAとBBBを逆にセットしてみたのですが、やはりSelectedValueの方しか値が入っていません。 よろしくお願いします。
656 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:26:57 ] DataTable には値が入ってるの?
657 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:27:00 ] SelectedTextはコンボボックスのテキスト入力部の、コピーとかのために「選択」してる文字列だから
658 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:32:58 ] >>656 DataTableには値がちゃんと入っています。 デバッグでも確認しましたし、DataGridViewに突っ込んで確認しています。 >>657 そこは調べ不足でした。SelectedItemで確認するのが正しいですね。 最悪、ループでAddしていくしかないですかね…
659 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:37:50 ] もう少し、ちゃんとしたコード出してみ。 DataTable の指定とかおかしそうな気がする。
660 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:43:14 ] >>659 ソースが手元にないので、覚えている範囲で書きます。 Using ds As DataSet = (オラクルパッケージをFillメソッドで実行) Using dt As DataTable = ds.Tables(0) combo1.DataSource = dt ←このdtをDataGridViewに入れ、値が入っていることを確認 combo1.ValueMember = "AAA" combo1.DisplayMember = "BBB" End Using End Using こんな感じです。
661 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:48:35 ] Disposeしてどうするあほかよ
662 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 23:31:00 ] >>661 うわっ、すいません。初歩的な所で… なぜ、DataGridViewは表示されたままだったのでしょうか?
663 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 11:41:38 ] String.Formatの書式について教えて下さい。 String.Format("合 計 {0,12:\\###,###,##0}", dTotal) → 合 計 -\9,000 String.Format("合 計 \{0,12:###,###,##0}", dTotal) → 合 計 \ -9,000 String.Format("合 計 {0,12:\\-###,###,##0}", dTotal) → 合 計 -\-9,000 dTotalがマイナスの場合は-1をかけて、 String.Format("合 計 {0,12:\\-###,###,##0}", dTotal)とすれば 合 計 \-9,000になるのですが、それ以外の方法で 表示させるにはどうしたらいいでしょうか?
664 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 11:45:45 ] セクション区切り記号 ; を使えば正負でそれぞれに書式指定できる 使い方はカスタム数値書式指定文字列のページ見れ
665 名前:デフォルトの名無しさん [2009/07/30(木) 13:01:18 ] VBNETの入門書2冊読破したんだけどどうすればいい?
666 名前:663 mailto:sage [2009/07/30(木) 13:03:44 ] ありがとうございます。 おかげさまで出来ました! もっと勉強します。
667 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 13:53:02 ] 自動更新で下のやつがきたんだけど手動でダウンロードできないんでしょうか? できるのであれば方法を教えてください Visual Studio 2005 Service Pack 1 セキュリティ更新プログラム(KB971090)
668 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 14:00:15 ] KB番号ググりゃ見つかるだろ
669 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 14:08:44 ] >>667 それクソ時間かかるよな。SP1 のときも思ったけど。
670 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 14:51:40 ] なんか、やってることはほぼ再インストールと同じなんだそうだ。 だから、DLしてもどっちみち時間かかる
671 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 17:10:06 ] >>669 そうそう だから手動でダウンロードしたいわけなのよ
672 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 17:25:13 ] www.microsoft.com/downloads/details.aspx?familyid=7c8729dc-06a2-4538-a90d-ff9464dc0197&displaylang=ja 249MBワロタ
673 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 17:33:05 ] .NETからEXCEL使ってなんかやるとき、STAThreadじゃなくてMTAthreadだと、 なんか問題あったりするんでしょうか? EXCELのオブジェクトを作成したスレッド以外から使ったりはしない前提です。 なんかイマイチこの辺を理解してないんです。
674 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 17:49:22 ] >>672 ありがとうございます