サーバプログラムを作ろうと思っているのですが、

サーバなので接続されるたびに
i = i + 1
Load wsock(i)   'wsockはwinsockコントロール
という風に増やしたいです。

しかし
Option Explicit
Dim wsock() As Winsock
このように宣言しても実行時に「インデックスが有効範囲にありません」とエラーが出ます。

かなり初歩的な質問だと思いますが、参考になるサイトまたはどのように書けば良いのか教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

>フォームにwinsockを貼り付けた場合、winsock(1000)まで作る場合、1001個貼り付けないといけないのでしょうか?



>i = i + 1
>Load wsock(i)   'wsockはwinsockコントロール

これなんですけど・・・
自分で書いてますよね。

コントロールはひとつだけ貼り付けておいて、Indexプロパティを0にしておいてください。
    • good
    • 0
この回答へのお礼

Indexプロパティを0にしたら無事、思ったとおりのことができました。
まだまだ理解してない部分が多いのでくだらない質問をしてしまいましたが、
親切に教えてくださってありがとうございました。

お礼日時:2005/04/03 03:18

フォームにwinsockコントロール貼り付けました?



貼り付けてるんでしたら
Dim wsock() As Winsock
なんて不要なんですけど。

この回答への補足

フォームにwinsockを貼り付けた場合、winsock(1000)まで作る場合、1001個貼り付けないといけないのでしょうか?

私がいつもやってるフォームに貼り付けて配列にする方法は、
1つ貼って、それをコピーしてもう一度貼って配列にする方法なのですが、他にやり方があるのでしょうか?

補足日時:2005/04/03 01:35
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qwinsock通信時エラーの回避

winsock通信でデータをクライアント側からサーバー側に送り、一定の条件でサーバー側からクライアント側にデータを戻すソフトを作成中なのですが、サーバー側が通信エラーの為か止まってしまいます。

サーバー側(winsock部分)記述

Private Sub Winsock1_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

Winsock1(Index).Close '接続を閉じる
Do While Not (Winsock1(Index).State = sckClosed)
DoEvents
Loop

On Error Resume Next
Winsock1(Index).Listen
If Winsock1(Index).LocalPort <> 0 Then
Winsock1(Index).LocalPort = 0

End If

End Sub


質問の整理ですが、
表示板にはギミックが付いておりそのギミックは止まらないのでパソコンのフリーズでは無い様子です。
で問題は通信部分だと推測されるのですが、そのエラーを起こした通信を破棄してもいいので、サーバー側の点数加算を止めない方法はありませんでしょうか。
また上記のWinsock1_Errorコードの記述じゃおかしいのでしょうか。

winsock通信でデータをクライアント側からサーバー側に送り、一定の条件でサーバー側からクライアント側にデータを戻すソフトを作成中なのですが、サーバー側が通信エラーの為か止まってしまいます。

サーバー側(winsock部分)記述

Private Sub Winsock1_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

Winsock1(Index).Close '接...続きを読む

Aベストアンサー

現象が発生するのはまれでしょうか?

試してみましたがクライアントから連続してconnectすると発生しやすいようです。
ただ、このエラーが発生しても、特に異常が見られないので、このエラーを無視してはどうでしょうか?

Private Sub Winsock1_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

If Index = 0 Then ' 受け付けるポートと接続するポートは処理が違う
If Number <> 10035 Then ' エラーコード10035は、無視
Winsock1(Index).Close '接続を閉じる
Do While Not (Winsock1(Index).State = sckClosed)
DoEvents
Loop
On Error Resume Next
Winsock1(Index).Listen
End If
Else
Winsock1(Index).Close '接続を閉じる
Do While Not (Winsock1(Index).State = sckClosed)
DoEvents
Loop
Unload Winsock1(Index)
closedSocks.Add Index
End If

End Sub

現象が発生するのはまれでしょうか?

試してみましたがクライアントから連続してconnectすると発生しやすいようです。
ただ、このエラーが発生しても、特に異常が見られないので、このエラーを無視してはどうでしょうか?

Private Sub Winsock1_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

If Index = 0 Then ' 受け付けるポートと...続きを読む

Qマクロで100マス計算! Dim i,j As Integer For i = 2 ToRang

マクロで100マス計算!

Dim i,j As Integer

For i = 2 ToRange(”A1”).End(xlDown).Row
For j=2 To Range(”B1”).End(xlToRight).Column

Cells(i,j).Value = Cells(i,1).Value * Cells(1,j).Value
Next j
Next i
Endsub

上記のように記述しましたが、
iの最終行が2となってしまっていますがなぜこのコードが間違っているのか分からないです。。どなたか教えていただけたら嬉しいです!

Aベストアンサー

確認してはいませんが…


>改行、スペースは実際にはきちんととっていますので気にしないでください
とのことなので、違っているのかもしれませんが、

>For i = 2 ToRange(”A1”).End(xlDown).Row
         ↓
 For i = 2 To Range(”A1”).End(xlDown).Row
で、うまくいきませんか?
100マス(10×10)と最初から決まっているので、範囲は 2 To 11 でも良いように思いますが…

改行、スペースなどが正しくなっているなら、Range(”A1”).End(xlDown).Rowの値が2以下になっている可能性が考えられます。(ということは、A1が空白セル、または、A3が空白セルなどなど・・)
A1が空白セルの場合は、
 For i = 2 To Range(”A2”).End(xlDown).Row
とするか、
 For i = 2 To 11
などとすることで、動作するのではないかと推測します。

QWinsockのオブジェクトエラー

こんにちは。EXCEL2000・VBAで、Winsockの使用を考えています。
以下のソースコードを入力して、実行してもオブジェクトが見つかりませんという、エラーが出力されてしまいます。
また、Winsockをアクティブにしようと、
User FormにWinsockのアイコンを追加しようとしても
「サブジェクトは指定された操作に対して信頼されません」
という注意書きがでてしまって、追加できません。
なぜ、このようになるのか、教えていただけますか?
よろしくお願いします。

Private Sub CommandButton1_Click()
Winsock1.RemoteHost "www.yahoo.co.jp"
Winsock1.RemotePort 80
Winsock1.Connect
End Sub

Private Sub CommandButton2_Click()
Winsock1.SendData = TextBox1.Value
End Sub

Private Sub CommandButton3_Click()
Winsock1.Close
End Sub

こんにちは。EXCEL2000・VBAで、Winsockの使用を考えています。
以下のソースコードを入力して、実行してもオブジェクトが見つかりませんという、エラーが出力されてしまいます。
また、Winsockをアクティブにしようと、
User FormにWinsockのアイコンを追加しようとしても
「サブジェクトは指定された操作に対して信頼されません」
という注意書きがでてしまって、追加できません。
なぜ、このようになるのか、教えていただけますか?
よろしくお願いします。

Private Sub CommandButton1_Click()
Wi...続きを読む

Aベストアンサー

こんにちは。

以下の内容が的外れだった場合はすみません。m(__)m

下記の参考サイトに書かれているように、Windowsの更新プログラムによりActiveX コントロールが
使えなくなってしまうことによる障害かもしれません。

この場合、現状での対策としては更新プログラム(KB960715)をアンインストールする以外ないように
思われます
注)但し、KB960715をアンインストールした場合、セキュリティが脆弱になる恐れがありますので
  ご注意下さい。

■参考サイト
【Vista】WindowsアップデートによりVBAでActiveXコントロールが使えなくなる
http://lunasite.blog79.fc2.com/blog-entry-56.html

答えてねっと - VBAで今まで使っていたMSFlexGridコントロールが使えなくなった
http://www.biz.kotaete-net.net/Default.aspx?pgid=14&qid=401994224

net3: VBA のマクロとかで FlexGrid が動かない時
http://net-3.blogspot.com/2009/03/vba-flexgrid.html

【VBA】MSHFlexGridの利用不可について
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=48226&forum=7&6

■関連情報
Windows XP の ActiveX Killbits に対するセキュリティ更新プログラム (KB960715)
http://www.microsoft.com/downloads/details.aspx?familyid=18521F44-2861-4A3D-9605-3A9155A737A7&displaylang=ja

Windows Vista の ActiveX Killbits に対するセキュリティ更新プログラム (KB960715)
http://www.microsoft.com/downloads/details.aspx?FamilyID=437defa2-2d07-4718-a4e1-87f96dc73d44&DisplayLang=ja

こんにちは。

以下の内容が的外れだった場合はすみません。m(__)m

下記の参考サイトに書かれているように、Windowsの更新プログラムによりActiveX コントロールが
使えなくなってしまうことによる障害かもしれません。

この場合、現状での対策としては更新プログラム(KB960715)をアンインストールする以外ないように
思われます
注)但し、KB960715をアンインストールした場合、セキュリティが脆弱になる恐れがありますので
  ご注意下さい。

■参考サイト
【Vista】WindowsアップデートによりV...続きを読む

QVB6変数の宣言dim j,k,p,m,n as Integerは良くない?

お世話になります。

VB暦1年です。

汎用の変数宣言でタイトルのように
dim j,k,p,m,n as Integer
dim ssa,ssb as String

など、カンマ区切りで変数宣言を使っていたのですが
最近、知人にasの手前の変数は型どおり宣言されるが
その手前の変数はVariant型で宣言されてしまうと指摘されました。

指摘されるまで気にはしていませんでしたが
ウォッチで確認すると変数に代入されるまでは
型がVariant/Emptyとなってます。

以後、気をつければいいのですが
過去にコーディングしたプログラムにも多少、使用していて客先に納品してしまっているものもあります。
後々、問題になるのかな?

Aベストアンサー

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというようなバグの原因になりやすいので、型を明示できるような状況で敢えてVariant型を使うべきではないです。

しかし、すでに納品してしまったコードについては、問題はメモリを余計に使ってしまうことくらいではないでしょうか?
他の人が気づかなかったことから考えるに、多分狭いスコープで使っていますよね? 比較対象や代入するべき型を誤るというようなロジックの誤りがない限り、少なくとも動作上の問題は発生しないと思います。ただ、直せる機会があるのであれば、直した方がいいとは思いますが。

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというよう...続きを読む

Qwinsockの配列(1対多数のプログラム)

お世話になります。VBで1対多数の通信プログラムを作っているのですが、受けて側をConnectionRequest
のプロシージャで
If Index = 0 Then

sockNum = sockNum + 1

Load Winsock1(sockNum)


Winsock1(sockNum).LocalPort = 0


Winsock1(sockNum).Accept requestID

としてコントロール配列をさせています。

通信は問題ないのですが、WinsockのIndexがIntegerの上限まできたら、オーバーフローを起こします。
リセット、もしくは回避の方法がまったくわからず困っています。どうぞお力お貸しください。

Aベストアンサー

 VBのWinSockコントロールは色んな所にサンプルあるけど、みんなこのタイプよね。たしかMSDNのもこれ。まぁサンプルなのでしかたないとしても、実際に利用する場合は1番以上の番号を再利用する形にしてあげないといけない。
 激簡単なサンプルを書いてみたので参考にして欲しい(今ささっと書いた奴なので動かなければ修正よろしく)。Form1にWinSock1を置いて実行してね。

Option Explicit

Private sockNum As Integer
Private closedSocks As Collection

Private Sub Form_Load()
Set closedSocks = New Collection
Winsock1.Item(0).Bind 9900
Winsock1.Item(0).Listen
End Sub

Private Sub Winsock1_Close(Index As Integer)
Unload Winsock1(Index)
closedSocks.Add Index
End Sub

Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
Dim connectsocknum As Integer
If closedSocks.Count > 0 Then
connectsocknum = closedSocks.Item(1)
closedSocks.Remove 1
Else
sockNum = sockNum + 1
connectsocknum = sockNum
End If
Load Winsock1(connectsocknum)
Winsock1.Item(connectsocknum).Accept requestID
End If
End Sub

Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim data As Variant
Winsock1.Item(Index).GetData data
Winsock1.Item(Index).SendData data
End Sub

 VBのWinSockコントロールは色んな所にサンプルあるけど、みんなこのタイプよね。たしかMSDNのもこれ。まぁサンプルなのでしかたないとしても、実際に利用する場合は1番以上の番号を再利用する形にしてあげないといけない。
 激簡単なサンプルを書いてみたので参考にして欲しい(今ささっと書いた奴なので動かなければ修正よろしく)。Form1にWinSock1を置いて実行してね。

Option Explicit

Private sockNum As Integer
Private closedSocks As Collection

Private Sub Form_Load()
Set closedSoc...続きを読む

Q変数宣言(Dim)と定数宣言(Const)のメモリ使用量

VS2005で開発しています。
Constで定数宣言したものはソース上でカーソルを当てるとその場で内容を確認できますが、変数で宣言しておくことでメモリ使用量が少なくなると言われました。
そうするといちいち定義まで飛ばないと定数の中身が見れず不便に思っているのですが、本当にメモリ使用量が少なくなるのでしょうか?

Aベストアンサー

・Constはコンパイルしたときに消えるので、そもそもメモリを使っていない。

  Const A As Integer = 1
  Dim B As Integer = A

  コンパイルすると

  Dim B as Interger = 1

変数にするとメモリを使うので、むしろメモリ使用量が増える。

だだし、文字列を複数回使う場合は、Constより変数がいいかな。

  Const C As String = "***************************************************************"
  Dim D As String = C
  Dim E As String = D

  コンパイルすると

Dim D As String = "***************************************************************"
Dim E As String = "***************************************************************"

・Constはコンパイルしたときに消えるので、そもそもメモリを使っていない。

  Const A As Integer = 1
  Dim B As Integer = A

  コンパイルすると

  Dim B as Interger = 1

変数にするとメモリを使うので、むしろメモリ使用量が増える。

だだし、文字列を複数回使う場合は、Constより変数がいいかな。

  Const C As String = "***************************************************************"
  Dim D As String = C
  Dim E As String = D

  コンパイルすると

...続きを読む

QWinsockについて

OS :WindowsXP
開発言語 :VC++
Winsock :2.2

現在、Winsockプログラムにて下記のようなテストをしています。

接続 ⇒ データ送信(正常) ⇒ LANケーブル抜く ⇒ データ送信(当然エラー)
⇒ LANケーブル挿す ⇒ データ送信 ・・・ ←ここでもエラーが発生してしまいます。

Winsockの通信は一度切れてしまうと最初から接続しなおさないと駄目なのでしょうか。

Aベストアンサー

最初から接続しなおさないと駄目です。

ちなみに、その挙動は、
Winsockの問題ではなく、OS(WindowsXP)のTCP/IP仕様によるものです。

参考URLに下記の記述があります。
>Windows では、メディアの "ダウン" 状態が検出されると、
>再度 "アップ" として検出されるまで、
>そのアダプタにバインドされているプロトコルは削除されます。

このプロトコル削除が発生すると、
WindowsOSは、プログラムがWinsockで作成した通信の接続情報を
全て破棄してしまいます。

OSに接続情報を破棄されてしまうので、
プログラム側は、再度接続しなおすしか、対処方法がありません。

参考URL:http://support.microsoft.com/kb/239924/ja

QFor ~ Next の中での Dim宣言について

四角形を下方向にずらしながら繰り返し描きたい場合、
以下のソースのようにFor ~ Next の中での Dim宣言を
行うのは一般的でしょうか。

他にスマートな記述があれば教えてください。
よろしくお願いします。

---------------------------------------
'四角形を下方向にずらしながら描画
For i = 0 To 10
  Dim rect As New Rectangle(x, y* i , w, h)
  g.DrawRectangle(Pen.Black, rect)
Next

Aベストアンサー

RectangleのOffsetメソッドを使うという方向なら Rectangleオブジェクトの生成は1回でいいことになります

dim rect as new Rectangle( x, y, w, h )
for i = 0 to 10
  g.DrawRectangle( Pens.Black. rect )
  rect.Offset( 0, 1 )
next
といった具合です …

QWinsockコントロールを使用してマルチキャスト通信

まずは環境を
WindowsXPSP2、VisualBasic6.0SP6です。

目的はサーバがマルチキャスト配信しているのを
VBのクライアントがWinsockコントロールを使用して受信する方法を教えていただきたいのです。

Winsockコントロールを使用してUDPでの通信ができたのですが
WinsockコントロールにはCの「setsockopt」に該当する命令が無い(わからない)のです。

Winsockコントロールで実現できないのであれば
winsockのAPIを使用する方法でもかまわないのですが
APIの情報も見つからず困っています。
APIを実装しても「IPPROTO_IP」「IP_ADD_MEMBERSHIP」などの定数の定義の情報がなくわからないのです。

これらの情報が載っているページや、解説しているページがあればお教えください。
または実装方法を知っておられるならお教えください。
よろしくお願いします。

Aベストアンサー

今、似たようなことをやっています。
ヘッダからとってきます。

■プロトコル
#define IPPROTO_IP 0

■マルチキャスト
winsockのバージョンによって異なる

1)version 1
winsock.hから
#define IP_ADD_MEMBERSHIP 5
#define IP_DROP_MEMBERSHIP 6

2)version 2
WS2TCPIP.hから
#defineIP_ADD_MEMBERSHIP 12
#defineIP_DROP_MEMBERSHIP 13

VBのWinsockコントロールのバージョンは知りません。
MFCのソケットクラス使ってたらversion1です。

Qマクロ初心者です。 インデックスが有効範囲にありませんとエラーになりました。 Dim Open

マクロ初心者です。
インデックスが有効範囲にありませんとエラーになりました。



Dim OpenFileName As string
Dim book1 As Workbook
Dim sheet1 As worksheet

sub 問題 ()

OpenFileName = GetOpenFileName(”エクセルファイル,*.*”)
If OpenFileName <>”False” Then
workbooks.Open OpenFileName
Else
msgbox ”キャンセルしました”
Exit sub
EndIf

Set book1 = Activeworkbook

Activesheet.Copy Before:=Thisworkbook.sheet(1)

workbooks(”book1”).Close SaveChanges:=False

Set sheet1 = Activesheet

ここまで作りました。

管理台帳を開き、
別ファイルにコピーし
管理台帳は閉じる、というところで、
実行するとエラーとなり、
デバッグをクリックしたら、管理台帳を閉じるコードが黄色くなります。

()の中の”を消してもダメでした。
配列数が大きい時と存在しない名前を指定した時になるとのことですが、、
Set〜のコードは、取得できていないのでしょうか?

マクロ初心者です。
インデックスが有効範囲にありませんとエラーになりました。



Dim OpenFileName As string
Dim book1 As Workbook
Dim sheet1 As worksheet

sub 問題 ()

OpenFileName = GetOpenFileName(”エクセルファイル,*.*”)
If OpenFileName <>”False” Then
workbooks.Open OpenFileName
Else
msgbox ”キャンセルしました”
Exit sub
EndIf

Set book1 = Activeworkbook

Activesheet.Copy Before:=Thisworkbook.sheet(1)

workbooks(”book1”).Close SaveChanges:=False

Set sheet1 = Ac...続きを読む

Aベストアンサー

こんにちは

>Set〜のコードは、取得できていないのでしょうか?
ご提示のコードではbook1が変数(=ワークブック)として設定されており、
 Set book1 = Activeworkbook
によって、Activeworkbookのオブジェクトが代入されています。

それなので、このブックを閉じるのであれば
 book1.Close SaveChanges:=False
で良いはずです。

>ネットでは、workbook(book1).Close〜
>もしくはworkbook(”book1.xls”)など
workbooks(”book1.xls”).Closeは、”book1.xls”(=文字列)という名のブックを閉じる際に用いますし、workbooks(book1).Closeの場合は、book1が文字列変数等であると考えられます。
例えば
 book1 = ”book1.xls”
 workbooks(book1).Close
で、一行目と同じ意味になりますよね。

変数とその意味するところを理解して使い分けることが必要です。
というか、意味を決めているのはそのコードを作成している質問者様なのですが。

こんにちは

>Set〜のコードは、取得できていないのでしょうか?
ご提示のコードではbook1が変数(=ワークブック)として設定されており、
 Set book1 = Activeworkbook
によって、Activeworkbookのオブジェクトが代入されています。

それなので、このブックを閉じるのであれば
 book1.Close SaveChanges:=False
で良いはずです。

>ネットでは、workbook(book1).Close〜
>もしくはworkbook(”book1.xls”)など
workbooks(”book1.xls”).Closeは、”book1.xls”(=文字列)という名のブックを閉じる際に用います...続きを読む


人気Q&Aランキング

おすすめ情報