• 締切済み

エクセルVBA 測定器からデータ取得

みなさん教えてください。 現在、エクセルVBAでRS232を用いて、測定器(DMM)から測定結果を取得するソフトを組んでいます。 測定器からデータは取得できるようになったのですが、測定器から出力されるデータが 「5.123,0.0111」とカンマ区切り状態ではないので、容易にグラフ化などデータ整理ができません。  ↑     ↑ 電圧値  電流値 そこでみなさんに教えて頂きたいことがあります。 データ取得時に、自動的にカンマ区切り状態になり、 セルA2:測定時間 セルB2:電圧値 セルC2:電流値 のようにデータが自動的に入ってくるようにしたいと思っています。 このようにデータを取得するためには、下記構文をどう変更すればよいか、教えて頂けませんか。 御願いします。 <構文>フリーソフトのEasyCommを使用しています。 Sub 測定開始() Dim get_data As String '文字列型(2byte変数) Dim ComPort As Byte 'バイト型(1byte変数) Dim s As Long '長整数型(4byte変数) Dim ss As Long '長整数型(4byte変数) ComPort = Cells(1, 6).Value 'COMポート番号の取得 ec.COMn = ComPort 'COMポート番号の指定 ec.HandShaking = "N" 'ハンドシェークなし ec.Delimiter = "CRLF" 'デリミタ(CR:復帰,LF:改行) ec.Setting = "9600,n,8,1" '通信条件の設定 ec.AsciiLineTimeOut = 1500 'AsciiLineの読み出しアウト時間 '受信データの記録 Do While Range("G2") = 1 i = i + 1 get_data = ec.AsciiLine '文字列の読み出し Cells(1 + i, 1).Value = Format(Now, "h:mm:ss") '時間の記録 Cells(1 + i, 2).Value = get_data 'データの記録 ec.WAITmS = 2 '待機時間(20ms) '通信ポートのクローズ ec.COMnClose = ComPort End Sub

みんなの回答

  • minis8566
  • ベストアンサー率50% (29/58)
回答No.1

”5.123,0.0111” を "5.123"と"0.0111"に分けてハンドリングできればいいのでしょうか。 Subプロシージャの上のほうの宣言を変えて、配列を作ります。 Dim get_data As Variant  データ読み出し時にデータ内にあるカンマで情報を分けます。このとき最初のカンマまでの値がGet_data(0)に入ります。他のは(1)以降カンマ区切りごとに順番に入ります。 get_data = Split(ec.AsciiLine, ",") '文字列の読み出し Cells(1 + i, 1).Value = Format(Now, "h:mm:ss") '時間の記録 Cells(1 + i, 2).Value = get_data(0) '電圧 Cells(1 + i, 3).Value = get_data(1) '電流 こんなかんじでいいのでしょうか?

関連するQ&A

  • エクセル2019 VBAについて

    エクセル2019でVBAを使いコピーペーストの勉強中です、次の箇所(Dim i As integr)で、ユーザー定義型は定義されていませんと指摘されて止まってしまします、Sheet("データ")には3行のデータは入っています、VBA初心者のため、この後が、なかなか前に進めません、どうかよろしくおねがいします。 ********************************** Sub 練習() Dim s1 As Worksheet: Set s1 = Worksheets("請求書") Dim s2 As Worksheet: Set s2 = Worksheets("データ") Dim r1 As Integer: r1 = 18 Dim r2 As Integer: r2 = 2 { Dim i As integr } For i = 0 To 2 s1.Range(s1.Cells(r1 + i, 1), s1.Cells(r1 + i, 3)).Value = s2.Range(s2.Cells(r2 + i, 2), s2.Cells(r2 + i, 4)).Value s1.Cells(r1 + i, 4).Value = s1.sells(r1 + i, 2).Value * s1.Cells(r1 + i, 3).Value Next End Sub ***************************************

  • Excel VBA Accessへデータ書き込み

    お世話になります。 Excel VBAを使用し、ExcelのデータをAccessのテーブル書き込みたいと思っています。 そこで、Access側のテーブルのインデックス重複なしの設定により、書き込むExcelデータが重複となるレコードの場合は、警告を非表示にして書き込みを飛ばしたいと思い、書籍等を参考にして下記のようなコードを記述したのですが、DoCmd.SetWarnings Falseに対してDoCmdの変数が定義されていませんと警告が出されます。 DoCmd.SetWarnings Falseを記述しないと実行時エラーが出されます。 対応方法をご教授頂けないでしょうか。 よろしくお願い致します。 Option Explicit Sub ExcelカレントExcelデータをAccessへ_重複除外_今村() Dim con As New ADODB.Connection Dim rs As New ADODB.Recordset Dim conStr As String Dim sqlList As Collection Set sqlList = New Collection 'コレクションを作成 Dim titleRow As Long Dim endRow As Long Dim tgtRow As Long '繰り返し用変数の宣言 Dim sql As Variant 'SQL文用変数の宣言 Dim i As Long 'For iステートメント用 Dim wbws As Object Dim Accessteble As String 'ExcelのWorkbook名+Sheet名を指定 Set wbws = Workbooks("テーブル取り込み1.xlsm").Sheets("Sheet2") 'Accessのテーブル名を指定 Accessteble = "T_Excelデータ追加" 'Excelタイトル行初期化★ titleRow = 9 'Excelデータ最終行取得 endRow = wbws.Cells(Rows.Count, 2).End(xlUp).Row 'SQL文リストの作成 'Excelデータ取得 For i = titleRow + 1 To endRow '指定行を繰り返す With wbws sql = _ "INSERT INTO " & Accessteble & "(" & _ .Cells(titleRow, 2).Value & ", " & _ .Cells(titleRow, 3).Value & ", " & _ .Cells(titleRow, 4).Value & ") " & _ "VALUES(" & _ "'" & .Cells(i, 2).Value & "', " & _ "'" & .Cells(i, 3).Value & "', " & _ .Cells(i, 4).Value & ");" End With 'コレクションへ追加 sqlList.Add sql Next i 'iを次の値にしてForへ戻る 'Access絶対パス指定 conStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data " & _ "Source=C:\Users\○○\Desktop\注文管理.accdb" 'DB接続 con.Open ConnectionString:=conStr DoCmd.SetWarnings False '実行文 For Each sql In sqlList 'SQL文リストをループ con.Execute sql '1行ずつ取り出し実行 Next sql con.DoCmd.SetWarnings True con.Close: Set con = Nothing End Sub

  • VBA & 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で「Web未接続」を取得したい。

    エクセルVBAで以下のようにWebAPIの助けを借りています。 しかしこれはたぶんネットに接続してなければ使えないのだと思います。 質問は、このマクロを作動させたとき、ネットに接続してなければ「ネットに未接続です」という警告を出したいのです。 しかし、ネットに接続してないことをどう取得すればよいのかわかりません。ご教示ください。 Sub ボタン1_Click() Dim objXMLHttp As Object, zipArr Dim yubinNo As Long Dim line As String Dim splitLine() As String Dim i As Long i = 2 '行番号 Do While Cells(i, 1).Value <> "" '入力値からハイフンの削除 yubinNo = Replace(Worksheets("Sheet1").Cells(i, 1).Value, "-", "") Set objXMLHttp = CreateObject("MSXML2.XMLHTTP") objXMLHttp.Open "GET", "http://zip.cgis.biz/csv/zip.php?zn=" & yubinNo, False objXMLHttp.Send line = Replace(objXMLHttp.responseText, vbLf, ",") '改行削除 line = Replace(line, """", "") 'クォート削除 line = Replace(line, "none", "") 'noneの文字列削除(情報がない場合、noneのため) splitLine = Split(line, ",") 'CSVを配列へ格納 Worksheets("Sheet1").Cells(i, 2).Value = splitLine(13) & splitLine(14) & splitLine(15) & splitLine(16) Worksheets("Sheet1").Cells(i, 3).Value = splitLine(9) & splitLine(10) & splitLine(11) & splitLine(12) i = i + 1 Loop End Sub

  • SAPデータ取得 エクセルVBA

    いつもここでお世話になっております。 次のサイトで掲載されていたVBAで、SAPのデータ(テーブルデータ)をエクセルで取得することができることがわかりましたが、例えばですがSQLを利用するようなVBAを追記して、任意のフィールド、任意のデータを指定して、それに合致するものだけをエクセルに表示させることはできないでしょうか(イメージとして、SELECT フィールド FROM QUERY_TABLE WHERE データのような感じ)。 何度も試行錯誤をしたのですが、うまくいきません。なにとぞよろしくお願い申し上げます。 ※SAPテーブル取得のエクセルVBA : http://d.hatena.ne.jp/sikakura/20100702/1278053742 -ーーー【以下、テーブルデータ取得のためにVBA】---- Sub ログインR3_LOGON() Set R3 = CreateObject("SAP.Functions") 'R3.Connection.System = "172.31.220.42" 'R3.Connection.client = "100" 'R3.Connection.User = "SAP*" 'R3.Connection.Password = "" 'R3.Connection.Language = "EN" '自動ログインする場合は、Connection.Logon(0,True)にして、 '上のパラメータを設定すればOK. If R3.Connection.Logon(0, False) <> True Then MsgBox "ログインを中止しました" Exit Sub End If 'IMPORTパラメータ Dim QUERY_TABLE As Object Dim DELIMITER As Object Dim NO_DATA As Object Dim ROWSKIPS As Object Dim ROWCOUNT As Object '条件式 Dim OPTIONS As Object Dim FIELDS As Object 'データ Dim DATA As Object '結果保持用 Dim ROW As Object Dim Result As Boolean Dim iRow, iColumn, iStart, iStartRow, iField, iLength As Variant '***************************************************** 'RFC_READ_TABLEを指定します '***************************************************** Set MyFunc = R3.Add("RFC_READ_TABLE") Set QUERY_TABLE = MyFunc.exports("QUERY_TABLE") Set DELIMITER = MyFunc.exports("DELIMITER") Set NO_DATA = MyFunc.exports("NO_DATA") Set ROWSKIPS = MyFunc.exports("ROWSKIPS") Set ROWCOUNT = MyFunc.exports("ROWCOUNT") Set DATA = MyFunc.Tables("DATA") Set OPTIONS = MyFunc.Tables("OPTIONS") Set FIELDS = MyFunc.Tables("FIELDS") QUERY_TABLE.Value = "CSKT" DELIMITER.Value = " " NO_DATA = " " ROWSKIPS = 0 ROWCOUNT = 0 Result = MyFunc.Call If Result = True Then Set DATA = MyFunc.Tables("DATA") Set FIELDS = MyFunc.Tables("FIELDS") Set OPTIONS = MyFunc.Tables("OPTIONS") Else MsgBox MyFunc.EXCEPTION Exit Sub End If '列名をExcelシートに出力 For iField = 1 To FIELDS.ROWCOUNT Worksheets("Sheet2").Cells(1, iField).Value = FIELDS(iField, "FIELDTEXT") Next 'データをExcelシートに出力 iField = 1 For iRow = 1 To DATA.ROWCOUNT For iField = 1 To FIELDS.ROWCOUNT iStart = FIELDS(iField, "OFFSET") + 1 iLength = FIELDS(iField, "LENGTH") If iStart > Len(DATA(iRow, "WA")) Then vField = Null Else vField = Mid(DATA(iRow, "WA"), iStart, iLength) End If Worksheets("Sheet2").Cells(iRow + 1, iField).Value = vField Next Next ' **************************************************** ' Release Object ' **************************************************** Set MyFunc = Nothing Set QUERY_TABLE = Nothing Set DELIMITER = Nothing Set NO_DATA = Nothing Set ROWSKIPS = Nothing Set ROWCOUNT = Nothing Set OPTIONS = Nothing Set FIELDS = Nothing End Sub Private Function Split(ByVal inp As String, Optional delim As String = ",") As Variant Dim outarray() As Variant Dim arrsize As Integer While InStr(inp, delim) > 0 ReDim Preserve outarray(0 To arrsize) As Variant outarray(arrsize) = Left(inp, InStr(inp, delim) - 1) inp = Mid(inp, InStr(inp, delim) + 1) arrsize = arrsize + 1 Wend ReDim Preserve outarray(0 To arrsize) As Variant outarray(arrsize) = inp Split = outarray End Function ーーーーーーーーーーーーーーーーーーーーーー

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

  • Excel VBAについて

    早速ですがExcelVBAについて質問です。 年齢がN列にあるとき、M列に年代を入れたいと思います。(例:19才なら10代、30才なら30代) 以下のように作成しましたが、すべてに20と入ったり正常に動作しないときがあります。 Excelは2003で作成していますが、いずれ2007でも使いたいです。 もっと正確に実行できるコードを教えてください。 ワークシート関数での解決は望んでいません。データ数も多く他の作業もマクロで処理するのでマクロを希望しています。よろしくお願いします。 -------------------------- Sub ByAge() Range("N1").Value = "年代別" Dim i As Long, N As Integer For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 13).Value >= 60 And Cells(i, 13).Value < 70 Then Cells(i, 14).Value = 60 ElseIf Cells(i, 13).Value >= 50 And Cells(i, 13).Value < 60 Then Cells(i, 14).Value = 50 ElseIf Cells(i, 13).Value >= 50 And Cells(i, 13).Value < 60 Then Cells(i, 14).Value = 40 ElseIf Cells(i, 13).Value >= 30 And Cells(i, 13).Value < 40 Then Cells(i, 14).Value = 30 ElseIf Cells(i, 13).Value >= 20 And Cells(i, 13).Value < 30 Then Cells(i, 14).Value = 20 End If Next i MsgBox "完了!" End Sub --------------------------

  • Excel VBAデータ登録のスピードアップしたい

    下記のようなコードがあります。 ■input データ閲覧・登録・編集シート ■data データを格納するシート inputシートとdataシートでdataの受け渡しを行っているのですが、データレコードを切り替えるだけで20秒ちょっとかかるため、作業効率が悪いです。 この時間を1~2秒ぐらいまで減らすには、どのように修正すれば、いいでしょうか?どうかアドバイスをお願いいたします。 Private Sub datatouroku() ’データを登録する Dim touroku As Integer Dim fRange As Range Set fRange = Sheets("data").Columns(1).Find(What:=Range("BC1").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) touroku = fRange.Row '検索されたNoの行位置を求める Sheets("data").Cells(touroku, 1).Value = Range("BC1:BE1").Value Sheets("data").Cells(touroku, 2).Value = Range("AX1").Value Sheets("data").Cells(touroku, 3).Value = Range("I4").Value   '・・・上記のデータが全部で256件あります。 End Sub ------------------------------------------ Private Sub hyouji() 'データを表示させる Dim fRange As Range Dim kensaku As Long Set fRange = Sheets("data").Columns(1).Find(What:=Range("BC1").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)    If (fRange Is Nothing) Then '見つからなかった?    MsgBox "入力された顧客コードが存在しません。", vbExclamation    Exit Sub    End If    kensaku = fRange.Row '検索された顧客DCの行位置を求める     Range("BC1:BE1").Value = Sheets("data").Cells(kensaku, 1).Value     Range("AX1").Value = Sheets("data").Cells(kensaku, 2).Value    Range("I4").Value = Sheets("data").Cells(kensaku, 3).Value     '・・・上記のデータが全部で256件あります。 Set trg = Sheets("data").Cells(kensaku, 1) End Sub

  • VBAによるエクセルデータの貼り付けについて

    会社で使用しているエクセルにボタンがあり、そのボタンを押すと指定したフォルダー内のファイルのデータをコピーし、貼り付けるようVBAコードが設定されています。 指定したファイルのデータを下記のどの部分でセルを指定しているのかを教えてください。 Sub 読込() Dim WorkFileNAME, FolderNAME, DBYear, DBMonth, ItemNO(45) As String Dim WorkSheetNAME As String Dim i As Integer Dim BASECelladd1, BASECelladd2 As String BASECelladd1 = "C4" BASECelladd2 = "D3" WorkFileNAME = ActiveWorkbook.Name WorkSheetNAME = ActiveSheet.Name Worksheets(WorkSheetNAME).Select FolderNAME = Range("J1").Value & "\" & Range("T1").Value DBYear = Range("D1").Value DBMonth = Range("E1").Value i = 0 Do While i <= 45 ItemNO(i) = Range(BASECelladd1).Cells(i + 1, 1).Value i = i + 1 Loop Data11READ WorkFileNAME, WorkSheetNAME, FolderNAME, DBYear, DBMonth, ItemNO, BASECelladd1, BASECelladd2 End Sub

  • VBA(エクセル)のコンパイルエラー

    お世話になります。 下記のマクロを記述したのですが、ウエから7行目の mid(Cells(i, colNum + 1).Value, 7, 11) のところで、下記のようなコンパイルエラーが出てしまいます。 試しに".Value"をとっても見ましたが、結果は同じでした。 どこをどう直せばよろしいのでしょうか、よろしくご指南くださいませ。 Sub mid_ac() Dim i As Integer Dim colNum As Integer i = 2 colNum = ActiveCell.Column Do Until Cells(i, 1).Value = "" Cells(i, colNum).Value = mid(Cells(i, colNum + 1).Value, 5, 10) i = i + 1 Loop End Sub コンパイルエラー: モジュールではなく、変数またはプロシージャを指定してください (ちなみに、このマクロは選択したセルの右隣にあるセルの左から5文字目~10文字目までを、表示させるものです。答えて下さる方には老婆心かもしれません。。。)