トップページ⇒tech
1001コメント307KB

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

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2007/01/28(日) 10:57:31
ここは Visual Basic 〜6.0 の質問スレです。
質問者は使用しているOS、VBのバージョン、サービスパックのバージョン、
「何がしたくて、どうしたけど、どう困っているのか」を明確に書きましょう。

VB.NETは別物なので専門スレで、VBA、APIの質問もそれぞれのスレで。

○ 質問者の心得
 一.質問する前にMSDNやGoogle、過去ログにも目を通してみる。
 二.VBScript、インストーラーなどはこのスレでOK。
 三.質問は第三者にもわかりやすいよう簡潔かつ具体的に。
 四.荒らしは相手しない。

○ 回答者の心得
 一.答えられない質問は無駄に罵倒せずスルー。無理するな。
 二.代用法を強制しない。
 三.回答する上で必須ではない情報をむやみに聞き返さない。
 四.荒らしは相手しない。
 五.VB情報募集中。
 六.回答は質問者が理解できるよう具体的に。

MSDN Online Japan ホーム
 http://www.microsoft.com/japan/msdn/default.asp
Visual Studio 6.0 Service Pack 6
 http://msdn.microsoft.com/vstudio/downloads/updates/sp/vs6/sp6/default.aspx
Google
 http://www.google.co.jp/

※「まず自分で調べる」クセを身につけよう。
0951デフォルトの名無しさん2007/05/12(土) 12:01:51
あ、>>949は取り消し
たしかメッセージボックスで大丈夫だった気がする
0952デフォルトの名無しさん2007/05/12(土) 13:14:28
>>948
ユーザーフォームをvbmodelessで開けばいいと思う。

>>951
msgbox関数では設定できないよな?
Win32API使うの?
0953デフォルトの名無しさん2007/05/12(土) 13:19:26
割り込み系はIDEではとまるがEXEでは動く記憶がある
0954デフォルトの名無しさん2007/05/14(月) 09:50:50
>>953
たしかそうなんだよな
EXEのときはそのまんま動いてたと思う msgboxの表示の仕方にも夜と思ったけど
0955デフォルトの名無しさん2007/05/14(月) 11:04:50
ちゅうか通信ログなんだから、リストBoxとかに常時履歴で追加じゃないの?
0956デフォルトの名無しさん2007/05/14(月) 11:12:04
は?
0957デフォルトの名無しさん2007/05/14(月) 11:15:45
ああ、はいいいえがあるのね。
だったら、自作ダイアログをモードレス表示でいいんじゃないの?
どのタイミングでその結果が割り込むか調整必要だと思うけど。
0958デフォルトの名無しさん2007/05/14(月) 11:33:29
だったらmsgboxでいいじゃん
0959デフォルトの名無しさん2007/05/14(月) 11:34:58
>>954
> msgboxの表示の仕方にも夜

そこをはっきりさせるのが
一番重要と思われwww
0960デフォルトの名無しさん2007/05/14(月) 11:39:55
>>958
VB6のMsgBoxにモードレスあるの?
0961デフォルトの名無しさん2007/05/14(月) 11:41:41
>>960
通信が停まらなければOKなんじゃねえの?
もともとメッセージボックス使おうとしてたわけだし
0962デフォルトの名無しさん2007/05/14(月) 11:45:49
確かダイアログにシステムモーダルとか種類があったような気がしたが?
msgboxにはなかったっけ?
0963デフォルトの名無しさん2007/05/14(月) 11:46:13
MsCommの使い方にもよるね。
OnCommだったら非同期で動くのかな?
VBってsingleスレッドだったような・・・。
TimerでInputを読んでたらアウトかな?
0964デフォルトの名無しさん2007/05/14(月) 11:48:28
>>962
モーダルじゃそこで処理がとまっちまうべ。
モードレスがあるのか?って疑問なんだが。
>>961さんが言うように、MSCommがMsgBoxの待ちでもイベント受けるならまあいいんじゃないの?
(そもそもそんな擬似マルチスレッド状態でメッセージのYesNoを処理したくないが。)
0965デフォルトの名無しさん2007/05/14(月) 11:50:40
TimerはEXEならちゃんと割り込み入った
当時苦労したから覚えてる
0966デフォルトの名無しさん2007/05/14(月) 11:52:29
ザックリかいてみる俺の手法

ロードとかでポートの設定やらオープンとタイマ起動

OnCommイベントで変数に格納
(取得した結果のチェックと各処理用フラグへの反映と一回前の状態の保存)

タイマイベント内でそのフラグを監視して立ち上がり・立下りの処理

て言う感じ
0967デフォルトの名無しさん2007/05/14(月) 11:52:39
割り込みが入るの?
メッセージがキューに溜まっていて処理されるの?
後者なら納得いくけど、前者だったら微妙な動作だね。
0968デフォルトの名無しさん2007/05/14(月) 11:59:54
割り込みが入る

タイマのイベント内
処理1
OnCommイベントとかが割り込み
処理2

みたいな

0969デフォルトの名無しさん2007/05/14(月) 17:56:54
嘘言うなよ
0970デフォルトの名無しさん2007/05/14(月) 21:09:14
DataGridを使って一セルごとに値をセットしたり、
行を追加して増やしたりしたいのですが、MSDNを見ても具体的な使用法はなく
検索しても、.netばかりヒットします。
お手数おかけしますが、どなたか教えてください。
よろしくお願い致します。
0971デフォルトの名無しさん2007/05/14(月) 21:28:44
Rowsとかでいけんかね?
0972デフォルトの名無しさん2007/05/14(月) 23:47:53
971>>
Rowsっていうプロパティがありませんでした。
もしかしたら配列指定でできるかなと思ったのですがダメでした。
そういう使いかたするプロパティじゃ無いのでしょうか・・
0973デフォルトの名無しさん2007/05/15(火) 09:21:49
そういうのはMSFlexGridやMSHFlexGridが良いのでは?
0974デフォルトの名無しさん2007/05/15(火) 09:53:37
そもそもデータグリッドはバインドして使う為のもので自分で自由にグリッド使うためのものではないと思う
0975デフォルトの名無しさん2007/05/16(水) 18:33:53
すみません。便乗します
MSFlexGrid で、セルの1個をダブルクリックしたらそのまま
入力できるモード。というのは出きるのでしょうか。
色々いじってるのですが、できないので困ってます・・。
0976デフォルトの名無しさん2007/05/16(水) 18:36:25
普通そうなってなかったっけ?
Editmodeプロパティみたいなので 色々変えれた気がするけどVsFlexGridと混同しちゃってるかもwww
0977デフォルトの名無しさん2007/05/16(水) 19:12:14
>>975
「ダブルクリックしたらそのまま入力できる」というのを
テキストボックスなどを使って作っていくんだよ。
それがプログラミングというもの。
ttp://www.bcap.co.jp/hanafusa/VBHLP/MSFlexind.htm

そういうこと出来ないとか、やるのが面倒とかいうなら>>976みたいな
元から入力機構を備えたコンポーネントを買うか、Excel+VBAで我慢しなさい。
ttp://www.grapecity.com/japan/support/database/P1_223.htm
09789752007/05/16(水) 21:36:13
ありがとうございます。^^
0979デフォルトの名無しさん2007/05/17(木) 01:52:27
VB6用のアドインを作ってるのですが、詰まってしまいまして質問させてください。
コードウィンドウが分割されている場合にどちらがアクティブかを
知りたいのですが、何か方法はありますでしょうか?

VBInstance.ActiveCodePane でアクティブな CodePane は取得できましたが、
分割されているかなどは分りませんでした。VBInstance.ActiveCodePane.Window.Top で
区別が可能かとも思ったのですが、アクティブではない方も同じ値でした。
API の GetCaretPos でのカレット位置もウィンドウの分割を無視した座標でした。
半ばあきらめかけてますが、よい方法がありましたらよろしくお願いします。
0980デフォルトの名無しさん2007/05/17(木) 09:10:16
>>979
GetCaretPosしたら、ちゃんとどちらがアクティブかわかるような座標が返ってきたが、いったいどこで悩んでいるんだ?
どちらで実行してもコードウィンドウの左上を基準とした座標で取れるから
下のペインなら一番上の行でも POINT.y が 300 とかそれなりの値になってるがな
0981デフォルトの名無しさん2007/05/17(木) 21:25:27
>>980
レス感謝です。
例えば下ペインがアクティブな場合、スクロールバーを下にスクロールさせて
カレットが上ペインで隠れてしまったような状態の場合、
GetCaretPos で取得できた座標は上ペインに当たる座標が返ってきてました。
POINT.x が負数になっていたので区別できるかとも考えたのですが、
上ペインがアクティブで横スクロールによるカレットが画面外の場合と区別がつかなそうでした。
書き込み後、もう1度確認してみます。
0982デフォルトの名無しさん2007/05/18(金) 04:35:32
>>981
たしかに GetCaretPos でやる方法は指摘のとおり無理があったわ
んで ActiveCodePaneで無理みたいに書いてたから試してなかったけど
試しにコード書いてみたら一応判定出来たっぽい・・・w
あんましテストしてないから、本当に上手くいくか検証して報告してくれ

Public Enum VBE_CODEPAIN
  CODEPAIN_SINGLE  '分割されてねえ
  CODEPAIN_TOP    '上がアクテブ
  CODEPAIN_BOTTOM '下がアクテブ
End Enum

つづく。。。
0983デフォルトの名無しさん2007/05/18(金) 04:36:09
'引数は AddinInstance_OnConnection で渡される Application 引数ね
Public Function GetActiveCodePain(ByRef pVBE As VBIDE.VBE) As VBE_CODEPAIN
  Dim i As Long
  Dim pActive As CodePane
  Dim pCompo As VBComponent

  Set pActive = pVBE.ActiveCodePane
  Set pCompo = pVBE.ActiveCodePane.CodeModule.Parent

  For i = 1 To pVBE.CodePanes.Count Step 1
    If pVBE.CodePanes(i) Is pActive Then
      Exit For
    End If

    If pVBE.CodePanes(i).CodeModule.Parent Is pCompo Then
      GetActiveCodePain = CODEPAIN_BOTTOM
      Exit Function
    End If
  Next i

  For i = i + 1 To pVBE.CodePanes.Count Step 1
    If pVBE.CodePanes(i).CodeModule.Parent Is pCompo Then
      GetActiveCodePain = CODEPAIN_TOP
      Exit Function
    End If
  Next i

  GetActiveCodePain = CODEPAIN_SINGLE
End Function
0984デフォルトの名無しさん2007/05/18(金) 17:24:31
VBAなんですが、すいませんが教えてください。

環境:エクセル2000 WIN2000

「質問内容」
 目的:「エクセルのセルの中身が、変更したらVBAの処理が起動するようにしたい」

     ・セル1+セル2=セル3

     このような状態で「セル3が変更したら、VBAの処理を起動させる」ようにしたい。
      セル1・2は、サーバーとの自動連携により勝手に値が変わる。
      セル3には、「=セル1+セル2」の式を入れてます。

      この状態だと、Worksheet_Changeが起動しません。
      セル1もセル2も、自動連携の為、値が変わっても「値が変わってる」と判断しません。
      セル3も数式が入れてあるので、値が変わっても「値が変わってる」と判断されません。

      このような状態で、値が変わったら、VBAを動かす方法はありますでしょうか?
      何か良い方法がありましたら教えてください。
0985デフォルトの名無しさん2007/05/18(金) 17:35:08
それならわざわざ関数とかでいいやん・・・・

=SUM(A1:B1)
みたいに

ついでにここはVBAスレじゃない

0986デフォルトの名無しさん2007/05/18(金) 17:55:31
>>985
すいません、VBAスレ探したんですが無かったんでココで質問しました。
すれ違いなのに、レスありがとうございます。

えっと、おっしゃりたいことは。。
関数を使えば値が変更されてる事になるってことで、よろしいですか?
(今試して見てるんですが、どうもうまくいかないので、
 私の認識が間違えているのかなっておもって)
0987デフォルトの名無しさん2007/05/18(金) 18:01:53
あ、ごめん 勘違いしてた
自動計算されるセル3が変わったら・・かぁ・・

どういう連携やっててChange発生しないのかわからないけど
自動計算が走るって事は Caliculateイベントは発生しているっぽい・・・?

0988デフォルトの名無しさん2007/05/18(金) 18:13:09
>>987
>自動計算が走るって事は Caliculateイベントは発生しているっぽい・・・?

Caliculateイベントを使ってるのではなく、単純に数式を入れていますので、動いてないです。
(Caliculateイベントは「値の変化」が認識されないから、使えない状態です)
0989デフォルトの名無しさん2007/05/18(金) 18:21:42
>サーバーとの自動連携により勝手に値が変わる
一体どんな連携処理してるんだ?

同じような感じで適当にデータ入れて =SUM つかって セル3を自動計算するようにしたけど
ちゃんとChange発生しているんだが・・・
09909842007/05/18(金) 18:43:03
>>989
>一体どんな連携処理してるんだ?
すいません、どうなっているのか詳しく分りません。
私が分る範囲で答えると、セルにの「ツールのリンクを貼る」と
貼ったセルに値が表示される。 
そのツールで値が変われば、セルの値も変更されていく。
っていうものです。

Changeは、セル3が自動計算された時に動いたんですか?
再度試したんですが、私の方ではやはり=SUMの自動計算の時には、
Changeが動かないです。

すいません、もっと面倒でもいいので、他の方法があったら教えていただけませんか?



0991デフォルトの名無しさん2007/05/18(金) 19:48:57
ツールのリンクを貼る
ってことは何かのコントロールを貼り付けているのかなぁ・・・?
ツール側で何かイベントが出ていればらくなんだけど・・・・

ちょっと調べたり試してみてたんだけどVBAではイベントとかフックできないから難しいなぁ・・・
ごめんよ 力不足でorz
09929842007/05/18(金) 20:00:40
>>991
ツール側でのイベントは、無理みたいです。

いえいえ、態々調べてまでいただいてありがとうございました! うれしかったです。
今日は、これが終わらないと帰れなそうなので、もし思いついたりしたら教えてください。
0993デフォルトの名無しさん2007/05/18(金) 20:09:04
>>992
とりあえずVBAで聞けばいいんじゃないかな?
09949842007/05/18(金) 20:11:28
>>993
うわっ。 ありました。。orz 検索かけたはずなのに。。

スレ汚しすいませんでした。
移動します。
0995デフォルトの名無しさん 2007/05/19(土) 04:37:43
オブジェクト指向プログラミングの事を
標準モジュールに共通関数を大量に作る事と
勘違いしているVB6.0使いのなんと大量にいることか!!!
0996デフォルトの名無しさん2007/05/19(土) 06:43:58
標準モジュールに共通関数を作る?
0997デフォルトの名無しさん2007/05/19(土) 07:00:39
>>996
すれ違いの釣りを相手にすんな
0998デフォルトの名無しさん2007/05/19(土) 08:10:16
でも共通関数作らない?
おれはCollectionにキーがあるか調べる関数とかおいてあるが
0999デフォルトの名無しさん2007/05/19(土) 08:24:56
>>998
わかったから黙れよ
1000デフォルトの名無しさん2007/05/19(土) 08:26:29
埋め
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。