現在高速シリアル通信のプログラムを作成しています。なかなか検索で
いろいろと探しているのですがデータ容量が増えるとどうしてもサンプル
プログラムで同じ結果になってしまいます。
どういう現象かといいますと10000バイトぐらいのデータを転送するとどう
してもデータ上のかけ落ちが発生します。
ボーレート:38400 or 19200bps
データビット:8Bit パリティ:なし ストップビット:1Bit
フロー制御:XonXoffRTSCTSあり データはバイナリィ転送です。
==>送信側のプログラムでは以下通りです。
  'バイナリデータファイルを読み込み
For i& = LBound(bytBuf) To UBound(bytBuf)
bytedata(LineCnt) = bytBuf(i&)
If (LineCnt < 255) Then '255バイトずつ分割して送信
bytedata(LineCnt) = bytBuf(i&)
Else
'タイマー処理(wait制御)
MSComm1.Output = bytedata
LineCnt = 0
bytedata(LineCnt) = bytBuf(i&)
End If
LineCnt = LineCnt + 1
Next i&
'WAIT掛けたり分割してデータを転送したり一括でデータを転送したり
行っています。
==>受信側では以下の通りとなっております。
Select Case MSComm1.CommEvent
   Case comEvReceive '受信データの取得
Buffer = MSComm1.Input 'あとはバイトデータを結合させて
                   'おります。
データの送信や受信について教えていただきたいのですが特に受信側で
私が思うのでは送信データが早すぎて受信側が追いついていない状態
と思うのですが・・・
なにかいい方法や参考になるホームページ等がありましたら伝授お願いします。

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

A 回答 (3件)

再度 ykkw_2001 です。



きょうび、プロトコルを組んでみようかなというお考えに
「これでも、わし、昔は女にモテたんじゃ」と自慢話をするジジィのような心境で、再度お送りします。

結局、ブロック(パケット)サイズの決めかたは、経験です。(^^)
「ヲイヲイ、のっけからアんだよ」と思うでしょうが、
影響する因子が多くて、キチッと最適値を出すための苦労より、適当に2~3種類試して、エイッと決めてしまうほうが効率的です。

通信に使用しているものすべての応答・動作速度やバッファ・キャッシュサイズが影響します。
通信頻度、標準的な転送サイズ、伝送線、プロトコル(物理層)、CPU+メモリ+HDD+SIOのチップ etc...
しかも、転送サイズ・内容がかわっても、常時最高速度で、最高信頼性を確保するのはとても難しいです。

私がお勧めする実践的な目安は、
SIOのバッファサイズ(USART)の10%以下で、
ただ、デバッグや、ラインモニタの性能を考慮して数百バイトでいいと思います。
# それを早く言えよ。

>データを送信したときに受信側から・・送信データがOKでしたよといった返答
>が帰ってくるのを待つということですね

そのとーりっ (アタック25児玉清風)

さらに、高速化のためには、ブロック数通知後、受信側では、データ要求をガンガン出す。
送信側から要求されたブロックをガンガン送る。
という荒技手順もありえます。(全2重で)
# 割り込み(マルチスレッド)使いますので、VBではムリか・・

>高速化の手法ってどんな方法なのでしょうか!

 上記以外には、データ圧縮もあります。

たとえば、
>10000バイトぐらい

>38400 or 19200bps
のシリアルで、メモリ上のデータを転送するなら、1秒位かけて、送受信のCPUで圧縮・伸長してもシリアルを通るサイズがそれ以上に減れば高速化できます。

# こんなのを確認しつつ考えるのが、すんごく楽しいわけで・・・・
# 状態遷移図やら、マトリクスになると快感アルファ波でまくります。・・・(変?)
# 最近、プロトコル組んでないので、思い出してムラムラしてきました。・・・(やっぱ変・・態・・)
# ファイル転送のフリーウェアでもアップしようかな・・・なんて。

で、思い出しましたが、ベクタあたりにZモデムとかXモデムのライブラリ(DLL)があれば、
それを使う手もありますね。
# 先に言え
    • good
    • 0
この回答へのお礼

いろいろとご指導ありがとうございます。
>結局、ブロック(パケット)サイズの決めかたは、経験です。(^^)
私もWAIT掛けたりサイズを変更したりいろいろと試してみました。
タイミングによってデータの取りこぼしが減ったりいろいと変わり
ましたので・・・いろんなパターンで試しています。

一度プログラムを白紙に戻し、現在チャックサムを加えたパケットデータ
での通信に切り替えて作り変えております。
こういうときは・・・位置から作る方がいいですねぇ~(頭がすっきりして)

>ベクタあたりにZモデムとかXモデムのライブラリ(DLL)
一度探してみます。

toshi0304でした。

お礼日時:2001/10/03 17:43

>フロー制御:XonXoffRTSCTSあり データはバイナリィ転送です。



確認ですが、フロー制御はハードウェア(RTS/CTS)ありで、
ソフトフロー制御(Xon/Xoff)は使っていないですよね。

同時に使うと言う設定は通常無いと思いますし,
バイナリィではXon/Xoffは使えません。

あと、接続に使っているケーブルの結線は把握していますか。
クロスケーブルでの接続だと物によるとハードフロー制御が利きませんので,
データの取りこぼしがでます。

また、送信,受信に使っているマシンのOSやCPU、メモリ等はどの程度でしょうか。
非力な環境だと処理が間に合わない可能性もありえるかと思います。VBAお使いのようですし。


そういえば、昔はシリアル制御CHIPの問題で、
MS-DOS標準のドライバだと取りこぼして使い物にならないって話があったりしました(^^;

この回答への補足

VB側のプログラム側で設定すれば使えると思っていました。
すいません私の勉強不足で(とほほほぉ~)
>あと、接続に使っているケーブルの結線は把握していますか。
>クロスケーブルでの接続だと物によるとハードフロー制御が利きませんので,
>データの取りこぼしがでます。
現在はクロスケーブルでやっています。知りませんでした。
これも初めて勉強になりました。

開発環境:1、VB6 SP3 WIN2000 SP2 P(3) 1000MHz 256MB
     2、VB6 SP3 WINME P(3) 800MHz 192MB
です。
VBのMSCOMMを使っていたんですが現在はBOCのACTIVECOMで
作り直しています。

シリアルでのファイル転送プログラムを作成しています。
あつかましいのですがソースオープンしているサイトなど
あればまた教えていただけないでしょうか

補足日時:2001/10/03 17:20
    • good
    • 0

定石なのですが・・・・



データチェック文字(チェックディジット、BCC、CRCetc..)を入れて見てはいかがでしょう。

たとえば・・・
分割単位(ブロック)ごとに全文字のビット毎にXOR演算した結果を最後の文字として、データにくっつけて送るのです。受信側も同じ演算をして、最後の文字と比較、違っていれば、NGとして再度送信するように要求します。

大まかに流れを書くと・・
送信側は、実際のデータを送る前に、ブロック数をカウントし、受信側に送ります。
受信側は、受け取ったら、実際のデータを受付可能という意味で「第1ブロックの要求」を送信側に送ります。送信側は、第1ブロックをデータチェック文字とともに送ります。受信側は、第一ブロックが間違っていれば、再度要求、あっていれば、第2ブロック要求を送信側に送ります。これを最終ブロックまで繰り返します。
(いわゆるアプリケーション層のプロトコルという事になります)

データ文字数の情報も付けて確認すると、データの誤り率は、激減するはずです。速度は少々低下しますし、高速化の手法もいろいろあります。

TCP/IP全盛になる以前は、これ(プロトコルとデータ誤りの低減)を考えるのが仕事だった時期もあり、仕事上では、一番楽しい時間でした。(^^)/

この回答への補足

ykkw2001さん ご回答ありがとうございます。
ここ1週間毎日悩んでいて。ちょっと兆しが見えてきました。
そこでちょっと質問なのですが、
送信側で実際のデータを送る前にブロック数をカウントして受信とありますが
分割単位(ブロック)は最適なブロック単位はどれぐらいがいいのでしょうか
データを送信したときに受信側から・・送信データがOKでしたよといった返答
が帰ってくるのを待つということですね
高速化の手法ってどんな方法なのでしょうか!

補足日時:2001/10/02 18:16
    • good
    • 0
この回答へのお礼

ykkw2001さん ご回答ありがとうございます。
ここ1週間毎日悩んでいて。ちょっと兆しが見えてきました。
そこでちょっと質問なのですが、
送信側で実際のデータを送る前にブロック数をカウントして受信とありますが
分割単位(ブロック)は最適なブロック単位はどれぐらいがいいのでしょうか
データを送信したときに受信側から・・送信データがOKでしたよといった返答
が帰ってくるのを待つということですね
高速化の手法ってどんな方法なのでしょうか!

それと記述する欄を間違えてすいません。

お礼日時:2001/10/02 18:53

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

Qシリアル通信無線化

シリアル通信の無線にはどんな方法があるのでしょうか?Bluetoothでシリアル通信くらいなのでしょうか。また、Wi-Fi(無線LAN)でシリアル通信はできるのでしょうか。私はネットワーク初心者なので、そもそもなにかを勘違いしているかもしれません。親身になってくれる方教えてください。

Aベストアンサー

なんで無線の話なのにケーブルのカテゴリなの?

QMscomm を使用してバイナリでデータを受信したい

Mscommを使用して、垂れ流しデーターをバイナリで受信(受信データ長さは変化する)するとき、このデーターをどうやって、配列に格納していけば良いのでしょうか?

(垂れ流しデータ ⇒ < STX >nnn-nnn・・・・< ETX >< CHK >)

また、配列に格納したデーターを文字に置き換えるにはどうすれば良いでしょうか?

まず考え方として以下の流れでよいでしょうか?

バイナリデータをバリアント型の変数に入れる。(受信する)
     ↓
このデータを1バイトごとにバイト型変数の配列に入れていく。
     ↓
格納した配列の中の制御文字を取り除く。( ST、EX )
     ↓
配列に入っているデータを文字に変換する。
     ↓
変換した文字をつなぐ。

受信するデーターが制御文字を含んでいる為、テキストで受信するとおかしな動作をすることがあるので(150バイト程度のデーターを、バッファから変数に移すときに、0.5~2.5秒もかかってしまうし、文字化けも時々起こす。)バイナリで受信してその後文字に変換したいのですが・・・。

宜しくお願い致します。

Mscommを使用して、垂れ流しデーターをバイナリで受信(受信データ長さは変化する)するとき、このデーターをどうやって、配列に格納していけば良いのでしょうか?

(垂れ流しデータ ⇒ < STX >nnn-nnn・・・・< ETX >< CHK >)

また、配列に格納したデーターを文字に置き換えるにはどうすれば良いでしょうか?

まず考え方として以下の流れでよいでしょうか?

バイナリデータをバリアント型の変数に入れる。(受信する)
     ↓
このデータを1バイトごとにバイト型変数の配列に入れていく。
   ...続きを読む

Aベストアンサー

(記憶が薄いので、正確ではありません。)

Dim bytAry() as byte
として、それに直接受信してあげると必要な領域を勝手にVB側で用意してくれると思いました。

それを
Dim strWork as String
(1)strWork = strConv(bytAry,vbUnicode)
(2)strWork = strConv(bytAry,vbFormUnicode)
どっちかで変換だったと思うけど、それでバイナリデータを文字列化します。

そのあと
VB6ならReplace関数で制御文字だけを置き換えて使用すると便利かも?

最初に述べたように、かなり記憶があいまいです。環境がないので性格には答えられません。m(__)m

QopenFrameworks-複数台Arduino間のシリアル通信

openFrameworks-複数台Arduino間のシリアル通信

皆様,初めまして.

私は現在,複数台のArduinoとopenFrameworksとでシリアル通信を実現しようとしていますが,
そこで一つ問題が生じました.

シリアル通信に関してはofSerialクラスを利用しようと考えていましたが,下記の例のように,
ofSerialクラスのインスタンスを複数作ろうとしただけで,プログラム実行のどこかでエラーが出てしまいます.

(例)
class testApp : public ofBaseApp{

ofSerialserialA;
ofSerialserialB;
}

openFrameworksのHPを観ると,ofSerialクラスのドキュメントには
”the ofSerial class can attempt to communicate with the first available device it finds.”
とありますが,これはofSerialクラスでは一つのデバイスとしかシリアル通信が出来ない,
という意味なのでしょうか?
また,もしそうならば,openFrameworks上から複数台のシリアルデバイスと通信する方法はあるのでしょうか?

プログラミング初心者で誠に恐縮ですが,皆様のお力をお借りしたく思います.
よろしくお願いいたします.

openFrameworks-複数台Arduino間のシリアル通信

皆様,初めまして.

私は現在,複数台のArduinoとopenFrameworksとでシリアル通信を実現しようとしていますが,
そこで一つ問題が生じました.

シリアル通信に関してはofSerialクラスを利用しようと考えていましたが,下記の例のように,
ofSerialクラスのインスタンスを複数作ろうとしただけで,プログラム実行のどこかでエラーが出てしまいます.

(例)
class testApp : public ofBaseApp{

ofSerialserialA;
ofSerialserialB;
}

openFrameworksのHPを観る...続きを読む

Aベストアンサー

>これを実行すると
>ofSerial: listing devices (0 total)
>という結果になってしまいます.これは,Arduinoを何台接続しても代わらない状況です.

こちらについてだけ…

>VisualStudio2008 ExpressEdition
とのことですが、プロジェクトの文字セットは何になっていますか?
of_preRelease_v0061_vs2008_FAT.zipを展開してみましたがUNICODEでは正しく動作しません。
# ofSerial::enumerateWin32Ports()でコールしているSetupDiGetDeviceRegistryProperty()がUNICODEで返却してきて、その後のstrstr()で正しく検索できない。

上記のデバイス列挙で失敗して、ofSerial:setup()も正しく動作していない。
という可能性はありませんか?

QMSCommを用いたRS-232-Cデータ転送

Visual Basic ver.6を用いてRS-232-Cデータ転送のプログラムを書いています。
転送には,MSComm controlを用いています。
コンピューター側から命令コードを測定器側に送信すると(例えば,MSComm1.OutPut = "F,3,300," & Chr(13)のように),測定器側からは次のようなテキストデータの転送が指定された回数だけ起こります:

@C/R
数値データC/R
数値データC/R
・・・・
・・・・
(指定回数繰り返す)

そこで,質問ですが,このデータをMSComm1.Inputを介してきちんと取得する方法をお教えください。私がよく理解できいない部分は,「どのような形でbufferにデータが落ちているのか?」という部分と「繰り返し処理をどう記述するのか?」という部分です。多分後者は配列型変数を用いて「指定回数」だけ繰り返すことになると思いますが・・・・。
なお,データ転送の制御フォーマットはデータのみの転送で,STXもETXも使用していません。

Aベストアンサー

こんばんは。

これで、試してみてください。
'<<送信側>>
Private Sub Command1_Click()
MSComm1.InputLen = 0
MSComm1.PortOpen = True
MSComm1.Output = Text1.Text + Chr(13)
MSComm1.PortOpen = False
End Sub

'<<受信側>>
'起動時にポートを開いておきます。
'Timer1を貼り付けてIntervalを100程度に。
Private Sub Timer1_Timer()
Dim strBuf As String
strBuf = MSComm1.Input
If Len(strBuf) <> 0 Then
List1.AddItem strBuf
End If
End Sub

もし、受信データ長が同じ長さなら、OnCommイベントで
データ取得した方がいいのですが・・・

QPC同士、LANでシリアル通信

PC2台をストレートLANケーブルで接続し、シリアル通信することは可能でしょうか?もし可能でしたらその手順をご教授願います。
VC++でシリアル通信のアプリケーションを作成しており、その動作確認のできる環境を構築したいのです。上記の他にローコストで良い方法があればそれでも構いません。 お願いいたします。

Aベストアンサー

たぶん「シリアルポートに見えるドライバーを書けば」って話になりますね。

かつてOS/2環境に、Ethernet接続した端末間で、RS-232-C互換の仮想ポートを実現するvmodem(SIOの一部)というドライバーがありました。
シェアウェアのこれを使って、パソコン通信のホスト(Ethernet非対応)を
Internet回線上に乗っけた例があったりしました…
vmodemはOS/2のMultiple Virtual DOS Machine上でも有効だったからKTX/Vから行けた。

そのWindows向け実装の話は聞いたことないので無い気がします。
vmodemというありがちな名前はググっても埓があかないので…


同様の技術は、理論上はありえますが、パソコン通信も廃れきった今
たぶん、そういうドライバーを書く人がいないってことになりますね。

もしかしたら、業務用のシリアル通信ソフト向けに
どこかに存在する可能性はありますが、たぶん高価なのでは…

QRst.FindFirst "名称コード" & "=" & "'101'"

タイトルのコードでは問題ないのですが、 101 を文字変数にすると「抽出条件でデータ型が一致していません」のエラーになります。この場合シングルクオーテーションはどういう意味なのでしょうか。
どうすれば良いのでしょうか。

dim Vcode as string
Vcode = "101"
Rst.FindFirst "名称コード" & "=" & Vcode

Aベストアンサー

FindFirst や、フォームの Filter プロパティで設定する場合は、SQL文のWHERE句の
内容を設定する必要があります。

フィールド名がテキスト型の場合は、

SELECT * FROM テーブル名 WHERE フィールド名 = "xxx"

のようになります。
で、FindFirst メソッドなんかで使う場合は、

rst.FindFirst フィールド名 = "xxx"

としたいところですが、条件の部分は文字列にしないといけません。
で、

rst.FindFirst "フィールド名 = "xxx""

こうすると、

フィールド名 =

で、切れてしまいます。
そこで、

rst.FindFirst "フィールド名 = 'xxx'"

このようにすればOKです。
次のステップとして、xxx の部分を変数を使ってやりたい場合。
単純に変数名に置き換えると、

rst.FindFirst "フィールド名 = '変数名'"

ですが、変数を、"" の中に記述すると、文字列として扱われますので、"" の外に
出してやる必要があります。
その場合、文字列と変数をつなぐためには、& を使います。

rst.FindFirst "フィールド名 = '" & 変数名 & "'"

で、このようになります。

FindFirst や、フォームの Filter プロパティで設定する場合は、SQL文のWHERE句の
内容を設定する必要があります。

フィールド名がテキスト型の場合は、

SELECT * FROM テーブル名 WHERE フィールド名 = "xxx"

のようになります。
で、FindFirst メソッドなんかで使う場合は、

rst.FindFirst フィールド名 = "xxx"

としたいところですが、条件の部分は文字列にしないといけません。
で、

rst.FindFirst "フィールド名 = "xxx""

こうすると、

フィールド名 =

で、切れてしまいます...続きを読む

Qシリアル通信で文字バケ

picを使ってパソコンとのシリアル通信実験してるんですが、通じたり、通じなかったりで
時にはなんだか見たこともない漢字がでてきたりします。

シリアル通信は大体がアスキー文字を送っているわけでアスキーコードにない
わけのわからない漢字、記号がでてくるのはなぜなんですか?

Aベストアンサー

PICとPCとの接続方法と、PICのUSARTの設定と、PC側の使用ソフト&設定を教えて下さい。
ありそうなのは、極性が間違っているか速度が間違っていることです。

> 漢字、記号がでてくるのはなぜなんですか?
ASCII文字は最上位bitが0です。
漢字や記号(の1バイト目)は最上位bitが1です。
シリアル通信は最下位bitから順に送信します。
速度が間違っていると途中のbitを最上位bitと見間違えます。
極性が間違っているとそもそも開始地点がずれますので何が起こっても不思議はありません。

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
などとすることで、動作するのではないかと推測します。

Qシリアル通信の電圧変換

シリアル通信に関する質問です。

出力が3.3Vのマイコンから入力電圧が5V必要なサーボコントローラの間で、シリアル通信をしたいのですが、どうやったらいいのでしょうか?

信号の方向は、

マイコン(3.3V)→サーボコントローラ(5V)です。

昇圧回路?とかを通すのでしょうか?その辺はよくわかってませんが。。

Aベストアンサー

No1,3です。
 サーボコントローラのボードを見た感じではシリアル入力なるものがTTLレベルなのかCMOSレベルなのか判然としません。おそらくCMOSレベルかと思いますので直結できません。TTLレベルであれば直結も可能です。そこで74HC05のようなオープンドレインタイプの論理ICを入れると5Vの回路とインタフェースできます。
http://www001.upp.so-net.ne.jp/FITDESIGN/manu6.htm
(ここのコラム2の最初の図のような方法です。サーボコントローラ上に余分な抵抗を実装する必要がありますが。)
 しかし、機器間の距離がかなり短い場合を除いて、この方法はお勧めしません。なぜかといいますと、論理ICの電流ドライブ能力が低く、数mものばすとコードの抵抗によって通信ができなかったり、誤動作したりするからです。
 こうした場合にはやはりある程度の電圧振幅と電流ドライブ能力のあるRS-232CのインターフェースICが適しています。これをマイコン側に使えば、サーボコントローラ側はRS-32Cの端子に接続するだけで、余分な加工が要りません。
NO1のURLにあげているような
+3V to +5.5V RS-232 Transceivers
となっているICがいいでしょう。やや入手性に問題がある製品もありますので入手しやすいものをお使いください。

No1,3です。
 サーボコントローラのボードを見た感じではシリアル入力なるものがTTLレベルなのかCMOSレベルなのか判然としません。おそらくCMOSレベルかと思いますので直結できません。TTLレベルであれば直結も可能です。そこで74HC05のようなオープンドレインタイプの論理ICを入れると5Vの回路とインタフェースできます。
http://www001.upp.so-net.ne.jp/FITDESIGN/manu6.htm
(ここのコラム2の最初の図のような方法です。サーボコントローラ上に余分な抵抗を実装する必要がありますが。)
 しかし、機器...続きを読む

Q'2465'指定した式で参照している'直線Aii'フィールドが見つかり

'2465'指定した式で参照している'直線Aii'フィールドが見つかりません。

入力されたテキストDELTUKIをiiにセットして直線Aii~Ciiに反映させたいです。
DELTUKIには0~12までのどれかがセットされて、00の場合には未可視、それ以外は
該当月の直線Aii~Ciiを可視化させたいです。
ですが、上記エラーが発生します。
どなたかご指南頂きたくよろしくお願い致します。
※.メイン画面の画像添付参照願います。
※.vba vb6 winXP
SetLowerLine:
With objrep
!直線103.Visible = True
!直線104.Visible = True
!直線105.Visible = True
!直線106.Visible = True
!直線107.Visible = True
End With
'Reports(stdocname)!直線103.Visible = True
'Reports(stdocname)!直線104.Visible = True
'Reports(stdocname)!直線105.Visible = True
'Reports(stdocname)!直線106.Visible = True
'Reports(stdocname)!直線107.Visible = True

Format ("00")
ii = Forms!メイン画面![テキストDELTUKI]
If ii = "00" Then
Else
objrep.Controls("直線A" & "ii").Visible = True
objrep.Controls("直線B" & "ii").Visible = True
objrep.Controls("直線C" & "ii").Visible = True
End If

'2465'指定した式で参照している'直線Aii'フィールドが見つかりません。

入力されたテキストDELTUKIをiiにセットして直線Aii~Ciiに反映させたいです。
DELTUKIには0~12までのどれかがセットされて、00の場合には未可視、それ以外は
該当月の直線Aii~Ciiを可視化させたいです。
ですが、上記エラーが発生します。
どなたかご指南頂きたくよろしくお願い致します。
※.メイン画面の画像添付参照願います。
※.vba vb6 winXP
SetLowerLine:
With objrep
!直線103.Visible = True
!直線104....続きを読む

Aベストアンサー

すみません、先日のこちらのご質問での回答者です:
http://oshiete1.goo.ne.jp/qa5770608.html

前回の回答2への補足の件のうち、「(2)」と「(3)」については
結局私では対処法の見当をつけかねたままなのですが(汗)、
本件についてだけはどうにかなりそうなので、回答をつけさせて
戴きます。

・・・というか、前回「"」を外すことを指摘した際に気づいて
いればよかったのですが、これも見落としていました(汗)
以下の部分を、下記のように修正してください。

【現在】
Format ("00")
ii = Forms!メイン画面![テキストDELTUKI]

If ii = "00" Then
Else
  objrep.Controls("直線A" & "ii").Visible = True
  objrep.Controls("直線B" & "ii").Visible = True
  objrep.Controls("直線C" & "ii").Visible = True
End If

【修正】
'変数「ii」に対して、Format関数で桁表示を指定
ii = Format(Forms!メイン画面![テキストDELTUKI], "00")

If ii = "00" Then
Else
  '「ii」を変数として使用するため、「"」は外します
  objrep.Controls("直線A" & ii).Visible = True
  objrep.Controls("直線B" & ii).Visible = True
  objrep.Controls("直線C" & ii).Visible = True
End If


・・・以上です。

これで、「テキストDELTUKI」に1桁の数字(「1」や「2」など)を
指定した場合も、「直線A01」や「直線A02」に処理が行われる
ようになると思います。

すみません、先日のこちらのご質問での回答者です:
http://oshiete1.goo.ne.jp/qa5770608.html

前回の回答2への補足の件のうち、「(2)」と「(3)」については
結局私では対処法の見当をつけかねたままなのですが(汗)、
本件についてだけはどうにかなりそうなので、回答をつけさせて
戴きます。

・・・というか、前回「"」を外すことを指摘した際に気づいて
いればよかったのですが、これも見落としていました(汗)
以下の部分を、下記のように修正してください。

【現在】
Format ("00")
ii = For...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報