質問投稿でgooポイントが当たるキャンペーン実施中!!>>

エクセルのVBAを使用してあるアプリを作成しています。そのアプリはシリアルポートを使用してある機器と接続する事で実現できます。
そこで質問ですが、当該PCが認識しているCOMポートをVBAのSELECT BOXに表示したいのですがどうやれば(どのような関数?)を使用して実装COMポートを認識するのでしょうか?
もちろん、USB<--->シリアルケーブルを使用した場合もCOMポートだと認識しなければなりません。
よろしくお願いいたします。

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

A 回答 (2件)

こんにちは。



Windowsのプログラム(VBA含む)から、COMポートを扱う場合は、WindowsAPI を使用すれば可能
だと思います。

COMポートの実装チェックには、WindowsAPI の「CreateFile」関数でCOMポートのオープンを実行
して、その関数の戻り値がエラーかどうかを見れば判断できると思います。
ただし、COMポートが実装されていてもエラーになるケース(既に使用中、使用不可に設定されて
いるなど)がありますので、その場合はエラーコードを取得してその値で「実装/非実装」を判断しな
いといけないと思います。

以下に、VBA から WindowsAPI (COMポート制御関連を含む)を利用するに当たって、参考になり
そうなサイトを上げてみました。宜しければ覗いてみて下さい。

■参考サイト
注)リンク切れの際は御容赦下さい。

1)VBAでWindowsAPIを使用してシリアル通信を行う方法

◎WindowsAPI講座
http://www.serpress.co.jp/winapi/
・このページよりリンクされている下記項目「シリアル通信(1)~(4)」のページでVBAから通信関連の
 APIを使用する方法が書かれています。
 NO.12 シリアル通信(1) ←必要なWindowAPI定義の説明
 NO.13 シリアル通信(2) ←シリアルポートのオープンとクローズを説明
 NO.14 シリアル通信(3) ←シリアルポートの通信プロトコル、送受信バッファ、タイムアウトの設定
 NO.15 シリアル通信(4) ←シリアルポートの送受信方法を説明
・今回の場合は、
   シリアルポートのオープン → 存在有無チェック → シリアルポートのクローズ
 までを行えば良いようなので、シリアル通信(1)~(2) までを参照すれば良いと思います。

2)CreateFile関数でCOM10以上のCOMポートを使用する際の注意点

◎CreateFile関数(Win32API)でCOM10以上を使う場合の注意点
http://www.aofactory.net/log/eid328.html
・ここで、API関数「CreateFile」で指定するCOMポート名(COM1、COM2など)に「COM10」以上を使用
 する場合の問題点および対策が書かれています。
・指定するCOMポートのデバイス名の頭に "\\.\" を付ければ良いようです。
   VBAでの指定例: "COM10" の場合は、 "\\.\COM10" とする。

3)WindowsAPI利用でCOMポートの存在有無をチェックする方法

◎COMポートが存在するかどうかを調べるには? - OKWaveの過去ログより
http://okwave.jp/qa4033242.html
・ここで、API関数「CreateFile」が失敗した際に、同じくAPI関数「GetLastError」でエラーコードを見て
 COMポートの存在有無を調べる旨が書かれています。
注)ただし、VBAでは「GetLastError」を呼んでもエラーコードが得られない可能性があるので、下記4)
 の方法を採った方が良いようです。

4)VBA から Windows API を利用する方法など

◎Office VBA と Windows API - Microsoft MSDN より
http://msdn.microsoft.com/ja-jp/library/cc326057 …
・このページの「エラー情報の取得」の説明で、VBAからWindowsAPIを呼出した際のエラーコードの取得
 方法が書かれています。
・VBAからWindowsAPIのDLLを呼び出した際のエラー情報は、「GetLastError関数」では取得できない
 可能性があるので、VBAの場合は「Errオブジェクト」の「LastDLLErrorプロパティ」でエラーコードを取得
 すれば良いようです。
・今回の場合は、COMポートオープン時のエラーコード取得に、この方法が利用できると思います。
    • good
    • 0
この回答へのお礼

返事が遅れて申し訳ありませんでした。
無事に解決しました。
ありがとう御座いました。

お礼日時:2008/11/24 08:51

Win32_SerialPort 等々


http://www.anchorsystems.jp/anchor/ashp/netmon/s …

VBSですがVBAで使うのに参考にならないかな?と思い提示しました。
が詳しくはないので的はずれならスル~して下さい。
    • good
    • 0
この回答へのお礼

返事が遅れて申し訳ありませんでした。
無事に解決しました。
ありがとう御座いました。

お礼日時:2008/11/24 08:52

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

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

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

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

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

QVBA & easycomm で長時間測定の問題

エクセルVBAとフリーソフトeasycommで複数同一機種の測定器からデータを吸い上げてエクセルに張り付けるプログラムを組んでいます。実験で使うので、体裁はどうでも良いですが、1秒おきのデータを1日程度取りたいです。
下記のプログラムを作ったのですが、かなりの頻度でフリーズしてしまいます(汗)
数分の測定なら問題ないのですが・・・
どうすれば長時間安定して動作させられるかご教授ください! よろしくお願いします!

*******************************

For kai = 1 To kaisuu '測定回数がkaisuuに入ります

For dai = 1 To daisuu '測定台数がdaisuuに入ります

KOMU = KOMU1 + dai - 1 'KOMU1は1台目のCOMポートの番号で、それ以降はCOMは連続して接続されています

Application.EnableCancelKey = xlErrorHandler
On Error GoTo Esc_EXIT ' ESCキーが押されるまで繰り返す処理を記述

ec.COMn = KOMU ' COMを開く

ec.Setting = "4800,e,7,2" ' Baud Rate 4800 7bit 2stop Even
ec.HandShaking = ec.HANDSHAKEs.No ' ハンドシェイクなし
ec.Delimiter = ec.DELIMs.CrLf ' デリミタにCr/Lfを指定

ec.AsciiLine = "&Q/F" ' &Q/F というコマンドを測定器に送信

Q_F = ec.AsciiLine '受信内容を Q_F に格納

Dim EQU_WAKE As Variant
Dim EQU_WAKE2 As Variant
Dim TEN_WAKE As Variant

' ****************受信データの一部分だけを抜き出す*********************

EQU_WAKE = Split(Q_F, "=") 'Q_F を=で分けたものをEQU_WAKEとする

EQU_WAKE2 = EQU_WAKE(1) 'EQU_WAKE の 2番目の文字列を EQU_WAKE2 とする

TEN_WAKE = Split(EQU_WAKE2, ",") 'EQU_WAKE2 を , で分けた文字列を TEN_WAKE とする
'*********************************************************************

Cells(kai + 6, dai + 2) = TEN_WAKE(0) ' 欲しいデータを縦軸に回数、横軸に台数にわけて張り付けていく

ec.COMn = 0 ' すべてのポートを閉じる

ec.WAITmS = 1000 '測定間隔を1秒にする

Next

Next

Esc_EXIT: '押された後の処理
ec.COMn = 0 ' すべてのポートを閉じる

エクセルVBAとフリーソフトeasycommで複数同一機種の測定器からデータを吸い上げてエクセルに張り付けるプログラムを組んでいます。実験で使うので、体裁はどうでも良いですが、1秒おきのデータを1日程度取りたいです。
下記のプログラムを作ったのですが、かなりの頻度でフリーズしてしまいます(汗)
数分の測定なら問題ないのですが・・・
どうすれば長時間安定して動作させられるかご教授ください! よろしくお願いします!

*******************************

For kai = 1 T...続きを読む

Aベストアンサー

エクセルのバージョンが古ければ、行数の制限に引っかかっている可能性はあります。
ファイルに書き出すには、何通りかの方法があります。

VBAを起動させ、ツールの参照設定で、
microsoft scripting runtime にチェックをいれ、

最初(ループの外)に
Dim fso As New FileSystemObject
Dim ts As TextStream
Set ts = fso.OpenTextFile("C:\Documents and Settings\All Users\デスクトップ\test.txt", ForAppending, True)
などと書いてておき、(ダブルクオート内はパス付きファイル名)

Cells(kai + 6, dai + 2) = TEN_WAKE(0) ' 欲しいデータを縦軸に回数、横軸に台数にわけて張り付けていく
の代わりに

ts.WriteLine kai & vbtab & dai & vbtab & TEN_WAKE(0)

最後に(ループの外で)
ts.close
Set ts = Nothing

とでもすれば、タブ区切りでデータを書いていくことができます。
CSV区切りなどにしたければ、ts.writelineの行をそのように変えればよいだけです。
このように変更して落ちなければ多分エクセルの行数制限に引っかかっているのだと思います。

書かれたデータを、何に、どのように読み込むかはまた、別問題です。

エクセルのバージョンが古ければ、行数の制限に引っかかっている可能性はあります。
ファイルに書き出すには、何通りかの方法があります。

VBAを起動させ、ツールの参照設定で、
microsoft scripting runtime にチェックをいれ、

最初(ループの外)に
Dim fso As New FileSystemObject
Dim ts As TextStream
Set ts = fso.OpenTextFile("C:\Documents and Settings\All Users\デスクトップ\test.txt", ForAppending, True)
などと書いてておき、(ダブルクオート内はパス付きファイル名)

Cells(kai + 6, d...続きを読む

QVBA EasyCommでの送信

文字列を送信する場合は ec.Ascii = "mojiretsu" を送ればよいというのはわかるのですが、例えばキーの'Ctrl'を押すのと同等の命令送信をしたいのですが、この場合どのようにコードを書けばよいか教えていただきたいです。できれば、Altの場合なども教えていただけると助かります。

Aベストアンサー

http://okwave.jp/answer/new?qid=7507694
こちらを参考にすれば
ec.Binary = 17 'Ctrlキーのコード“17”を送信
ec.Binary = 18 'Altキーのコード“18”を送信
かな?

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

Qシリアル通信時のデータ受信方法

シリアル通信を実現しようとしていて、現在データ送信は完成しました。
しかし、データ受信方法が分かりません。
データはいつやってくるのかが分からないので、
「データ受信したら割り込み(イベント?)ルーチンに入る」という方法がいいかなあ、と考えています。
「データ受信したら割り込み(イベント?)ルーチンに入る」方法を教えてください。
もし他に方法があれば教えてください。

すみませんがよろしくご教授お願いいたします。

Aベストアンサー

WaitCommEvent関数で指定した通信デバイスでイベントの発生を監視する。
Declare Function WaitCommEvent Lib "kernel32.dll" _
(ByVal hFile As Long, lpEvtMask As Long, lpOverlapped As OVERLAPPED ) As Long

WaitCommEvent(ハンドル,イベント,NULL)で受信イベント待ち状態にして受信イベントがEV_RXCHARならReadFile関数に処理を渡す。

Q16進数を10進数に変換する方法...

お初にお目にかかります(^^)
簡潔に質問しますm(_ _)m

バージョン:MS-Visual Basic6.0
質問内容:
16進数を10進数に変換する方法がわかりません。
Hex(Text1.Text) や Oct(Text1.Text) のような方法で
16進数・8進数に変換できるんですが…
10進数に変換する方法がわかりません。

P.S できれば、16進数→10進数、16進数や10進数→2進数
…に、変換する方法も、よろしければ教えてくださいませ
m(_ _)m

Aベストアンサー

16進数→10進数は

Dim StrHex As String
Dim intVal As Integer
StrHex = "1A"
intVal = Val("&H" & StrHex)

で出来ます。


申し訳ありませんが2進数への変換はよく分かりません。

Qコンポーネント`MSCOMM32.cox'、または

全部ではないのですが、アプリケーションを起動すると、
「コンポーネント`MSCOMM32.cox'、またはその依存関係のひとつが適切に登録されていません。
ファイルが依存しないか、あるいは不正です。」
Visual Basic6.0(SP3)でプログラムし、ファイルメニューから「**.exeの作成」したファイルを、
VBのインストールされていないPCに「**.exe」のみコピペしたら上記のメッセージがでました。。。
半年前に製作したプログラムはこのやり方でOKだったんですが。。。

申し訳ありませんが、どなたかご教授お願いします。
(先ほどカテゴリを間違えて質問しましたので、再投稿します)

Aベストアンサー

>VBのインストールされていないPCに「**.exe」のみコピペしたらメッセージ


OSはVista、Windows 7ですか?
EXE ファイルをコピーしただけでは、レジストリに OCX が登録されていないためエラーになります。
Regsvr32 コマンドで .OCX の登録をいったん解除し、登録しなおします。
「スタート」「すべてのプログラム」「アクセサリ」「コマンドプロンプト」右クリック「管理者として実行」
regsvr32 /u mscomctl.ocx  enter
regsvr32 mscomctl.ocx enter

MSCOMM32.coxファイルに対して実行

参考URL

>半年前に製作したプログラムはこのやり方でOKだった

制限ユーザーでなく、標準ユーザーか、Administrator権限のあるユーザーの可能性

参考URL:http://pasofaq.jp/development/visualbasic/error339.htm

QVisual Basic 2010を使ってRS-232Cとの通信をした

Visual Basic 2010を使ってRS-232Cとの通信をしたい。

現在、機器とPCとの通信のやりとりをするため、機器のマニュアルを見ながら悪戦苦闘しています。

通信のやり取りについては、マニュアルにVB6を使った例が書いてあります。
しかしVB6が手に入らなかったので、Visual Basic2010を現在使っています。

マニュアル(VB6向け)には
・On the Project Menu, click Components to bring up a list of additional controls available in VB6.
・Scroll through the controls and select Microsoft Comm Control 6.0. Select OK. In the toolbar at the left of the screen, the Comm Control will have appeared as a telephone icon.
・Select the Comm control and add it to the form
と書いてあります。

よく分らなかったのですが、上のメニューの「Project」⇒「Add reference」を選び、「COM」の中にあった「Microsoft Comm Control」を選びました。

が、左のツールバーには電話のアイコンは出てきませんでした。

2010の場合、VB6と違って別のやり方をしないといけないのでしょうか?


ご存知の方がいましたら、教えて頂きたいです。よろしくお願いします。

Visual Basic 2010を使ってRS-232Cとの通信をしたい。

現在、機器とPCとの通信のやりとりをするため、機器のマニュアルを見ながら悪戦苦闘しています。

通信のやり取りについては、マニュアルにVB6を使った例が書いてあります。
しかしVB6が手に入らなかったので、Visual Basic2010を現在使っています。

マニュアル(VB6向け)には
・On the Project Menu, click Components to bring up a list of additional controls available in VB6.
・Scroll through the controls and select Microsoft Comm Control 6.0...続きを読む

Aベストアンサー

SerialPortコンポーネントでシリアル通信が可能です

VB6にはMSCommというコンポーネントがあったようですが、.NET2003以降にはありません。
2005からSerialPortコンポーネントが標準でついているはずなのでそちらを使用してはいかがでしょうか?

http://msdn.microsoft.com/ja-jp/library/cc825644.aspx

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。


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

人気Q&Aランキング