• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA & easycomm で長時間測定の問題)

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

このQ&Aのポイント
  • エクセルVBAとフリーソフトeasycommを使用して複数の同じ機種の測定器からデータを取得し、エクセルに張り付けるプログラムを作成しています。
  • しかし、長時間の測定ではプログラムが頻繁にフリーズしてしまいます。
  • どうすれば長時間安定して動作させることができるでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.2

エクセルのバージョンが古ければ、行数の制限に引っかかっている可能性はあります。 ファイルに書き出すには、何通りかの方法があります。 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の行をそのように変えればよいだけです。 このように変更して落ちなければ多分エクセルの行数制限に引っかかっているのだと思います。 書かれたデータを、何に、どのように読み込むかはまた、別問題です。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.1

>かなりの頻度でフリーズしてしまいます うまくいくときもあるが、ほとんどの場合エラーで落ちるのではなく、フリーズ状態になるということでしょうか? エクセルのバージョンは2007以降ですか? OSはなんですか? フリーズするときのメモリ使用率はどの程度ですか? アドバイスとしては、データを一旦テキストファイルなどにに書き出しその後ファイルが出来上がってから、エクセルで処理されると良いと思います。 

toraoyaji
質問者

補足

早速の回答、有難うございます! うまくいっても、4時間ほど(15000回程度)でフリーズします。ダメな時は1000回くらいでフリーズ(砂時計表示で、エクセル自身も終わらせれられなくなります)します。  エクセルは97-2300ブックで保存しています。OSはXPです。 メモリー使用率は、当方、PCに詳しくないので分かりません・・・ <アドバイスとしては、データを一旦テキストファイルなどにに書き出しその後ファイルが出来上がってから、エクセルで処理されると良いと思います ですが、どうやってVBAでテキストファイルに書き出すのでしょうか?ご指導よろしくお願いします! 

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセル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

  • コンボボックスのvba 作成の仕方

    私は、月別にデータを作っています。なので、月ごとにデータを見られるようなボタンを作成したいです。 現在組んでいるマクロは、ボタン(普通の四角いもの)を押すごとに、翌月データをコピペするというものになっています。 (以下、現在のコード記載) Sub auto_open() Dim wkm As Long Dim wkn As Long Dim wkt As Variant Dim wks As Variant Dim dt As Date Dim mi As Integer dt = Date mi = Month(dt) wkt = Array(0, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9) wks = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) wkm = wkt(mi) Call Macro1(wkm) Sheets("住宅資金").Range("A3") = wks(mi) End Sub Sub Next_Month() Dim wks As Variant Dim dt As Date Dim mi As Integer wks = Array(0, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9) If Sheets("住宅資金").Range("A3") = 12 Then wkm = 10 Else wkm = wks(Sheets("住宅資金").Range("A3") + 1) End If Call Macro1(wkm) wks = Array(0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3) Sheets("住宅資金").Range("A3") = wks(wkm) End Sub Sub Macro1(ByVal wkm As Long) With Sheets("入力") Sheets("住宅資金").Range("D5:D23").Value = .Range("C5:C23").Offset(, wkm - 1).Value Sheets("住宅資金").Range("J5:J23").Value = .Range("C28:C46").Offset(, wkm - 1).Value Sheets("住宅資金").Range("P5:P23").Value = .Range("T28:T46").Offset(, wkm - 1).Value Sheets("住宅資金").Range("O5:O23").Value = .Range("T5:T23").Offset(, wkm - 1).Value Sheets("住宅資金").Range("F5:F23").Value = .Range("O5:O23").Value Sheets("住宅資金").Range("L5:L23").Value = .Range("O28:O46").Value End With With Sheets("目標") Sheets("住宅資金").Range("C5:C23").Value = .Range("B4:B22").Offset(, wkm - 1).Value Sheets("住宅資金").Range("I5:I23").Value = .Range("B27:B45").Offset(, wkm - 1).Value End With With Sheets("前年同期") Sheets("住宅資金").Range("H5:H23").Value = .Range("C5:C23").Offset(, wkm - 1).Value Sheets("住宅資金").Range("N5:N23").Value = .Range("C28:C46").Offset(, wkm - 1).Value Sheets("住宅資金").Range("Q5:Q23").Value = .Range("T5:T23").Offset(, wkm - 1).Value End With End Sub さて、現在作りたいと思っているものを以下に記述します。 普通の四角いボタンではなく、コンボボックスを使用して、矢印(▼)を押すことによってリストが表れ、 「1月」に合わせたら1月のデータがコピペされる、「8月」に合わせたら8月のデータがコピペされる、というものを作りたいと思っています。 以下のような空欄の表を作成したシートがあります。        A    B    C   D 1      目標  実績  …   … 2 ○支所   3 △支所 4  ・ 5  ・ 6  ・ 別のシートに、手入力した月別のデータがあります。 空欄のシートのどこかにコンボボックスを作り、別シートの○月のデータを貼り付けられるようにしたいと思っています。 コンボボックスの作り方がわからず、後一歩のところでつまずいてしまいました。 知恵をお貸しください。 よろしくお願いいたします。

  • キーボードウェッジ機能付きのターミナルソフト

    RS232Cの通信I/Fを持った計測器とPCのUSB仮想COMポートで通信をするために、キーボードウェッジ機能を持ったターミナルソフトを探しています。 計測器はUSBハブ+USBシリアル変換ケーブルを介して複数同時接続しますが、一度に通信するのは特定の1台のみです。 割り当てたショートカットキーで特定の計測器(仮想COMポート)に予め登録したデータ送信要求コマンドを送出し、帰ってきた測定値をキーボードウェッジ機能でアクティブウインドウに出す、というものです。 キーボードウェッジ単体やターミナルソフト単体は見つかるのですが、両方を兼ね備えたソフトが見つけられません。有償でも良いので紹介いただけると助かります。 上記仕様そのままでなくとも、近いものがあればご紹介ください。

  • EXCEL VBA で データを集計したい。

    よろしくお願いします。 添付の資料の通り、データを格納しているシートがあります。 項目は、  ・処理日  ・科目  ・D列  ・E列  ・F列 とあったとし、抽出条件は、  ・処理日の範囲指定  ・科目の指定 としたいと思っています。 VBAで処理したいのですが、まずはEXCEL関数のDSUMを使用し、添付の通り指定して、 抽出されることを確認しました。 これと同様の抽出をVBAで行いたく、VBAでワークシート関数を使用するために、  Dim x As Variant x = Application.WorksheetFunction.DSum(Range(Cells(3, "A"), Cells(15, "E")), "D列", Range(Cells(3, "O"), Cells(4, "Q"))) とし、正しく値を取得することができました。 ですが、条件を指定する部分を、セルで指定するのではなく、例えば  "処理日" >= 20151001 and "処理日" <= 20151002 and "科目" = "01" のように、式をVBAで生成して作成したいのですが、方法はありませんでしょうか? ACCESSのDSUM関数のような記述ができませんでしょうか? お手数をおかけします、よろしくお願いいたします。

  • エクセルの列削除がうまくいかない。

    CSV変換データの不要な列を削除しようとしているのですが、思うような動作しません。 CSV変換マクロを起動と同時にA,B,E,F,O,P,Q,R列を削除しようとしているのですが、うまくいかない。 教えていただけないでしょうか。 添付データは元のファイルです。 Option Explicit Sub EasyCopyCSV() Dim CSV_filename As Variant, target As Variant Dim CSV_SheetName As Variant Dim FileCount As Long Dim kk As Long CSV_filename = Application.GetOpenFilename(filefilter:="CSVファイル(*.csv;*.prn),*.csv;*.prn", MultiSelect:=True) If IsArray(CSV_filename) Then Else MsgBox "キャンセルされました" Exit Sub End If FileCount = UBound(CSV_filename) '配列のサイズからファイル数を調べる For kk = 1 To FileCount 'ファイル数カウンタ初期化しファイル数分カウンタを回す Workbooks.Open CSV_filename(kk) 'ファイルを開く CSV_SheetName = Worksheets(1).Name '開いたシートの名前=ファイル名を取得 Sheets(CSV_SheetName).Move Before:=ThisWorkbook.Sheets(1) Next '不要列を削除 With ActiveSheet .Range(.Columns(1), .Columns(2)).Delete Shift:=xlShiftToLeft .Range(.Columns(5), .Columns(6)).Delete Shift:=xlShiftToLeft .Range(.Columns(15), .Columns(18)).Delete Shift:=xlShiftToLeft End With End Sub

  • チェックボックス選択後、フォームに移して編集したい

    チェックボックスの選択では Private Sub 選択_Click() If Me!選択 Then CurrentDb.Execute "UPDATE 申請履歴Q SET 選択 = False;" Me.Refresh End If End Sub でチェックボックスを1つづつ選択可能にしたのですが、 フォームに移動しようとすると最初の(001)のデータがフォームに 出てきてしまいます。 Private Sub 編集_Click() Dim mode As Variant mode = Me.選択.Value DoCmd.OpenForm FormName:="編集F", DataMode:=acFormEdit うまく選択できていないのは分かるのですが、本を何冊も広げてみても 良い回答に行きつきません。 何卒、ご指導の程宜しくお願い致します。

  • VBを使い測定器のデータをPCへ取り込む方法

    VBをPCとRS232で接続した測定器から、測定データを出力したいと考えています。 まずフォームで、計測器と通信するための「通信開始ボタン」をつくり、 テキストBOXに測定データを受信するものを作成しました。 しかし、これを起動して測定器と接続すると、測定データは受信できるのですが 1個データを受信したら「フレームエラー」と言うエラーが出て、途中で止まってしまい ます。 このエラーを解決する方法はないでしょうか。 みなさん教えてください。 御願いします。 <作成した構文> Private Sub tushin_Click() '通信開始ボタンのClickイベント Serial.PortOpen = Not Serial.PortOpen '交互の制御 If Serial.PortOpen = True Then cmdOpen.Caption = "通信停止" '表示の切り替え Else cmdOpen.Caption = "通信開始" End If End Sub Private Sub Form_Load() ' MSCommコントロールの初期設定 Serial.CommPort = 2 '通信ポートNo2指定 Serial.Settings = "9600,n,8,1" '通信条件設定 Serial.Handshaking = comNone 'フロー制御無し Serial.RTSEnable = False 'RTS制御無し Serial.RThreshold = 1 '1バイト受信毎にOnCommイベント発生 Serial.SThreshold = 1 '送信バッファ空でOnCommイベント発生 End Sub Private Sub Serial_OnComm() '変数宣言 Dim Buffer As Variant '受信バッファの宣言 'CommEventプロパティに対する処理 Select Case Serial.CommEvent 'イベントの区分 Case comEvCD '何もしない Case comEvCTS Case comEvDSR Case comEvRing Case comEvReceive '受信データを表示 Buffer = Serial.Input txtInputData.Text = txtInputData.Text & Buffer Case comEvSend Case comEvEOF '以下エラーダイアログ表示のみ Case comEventBreak MsgBox "中断信号受信", vbExclamation, "通信エラー" Case comEventFrame MsgBox "フレームエラー", vbExclamation, "通信エラー" Case comEventOverrun MsgBox "オーバーランエラー", vbExclamation, "通信エラー" Case comEventRxOver MsgBox "受信バッファオーバー", vbExclamation, "通信エラー" Case comEventRxParity MsgBox "受信パリティエラー", vbExclamation, "通信エラー" Case comEventTxFull MsgBox "送信バッファフル", vbExclamation, "通信エラー" Case comEventDCB MsgBox "DCB取得エラー", vbExclamation, "通信エラー" Case Else MsgBox "未定義エラー発生", vbExclamation, "通信エラー" End Select End Sub <計測器の情報> 使用コード:JIS 8ビットコード データの印字及び改行:CR LF ポートレート:9600bps パリティー:奇数 ストップビット:2ビット データ長:8ビット

  • Excel マクロでボタンを押してリンク先に行く

    前回はお世話になりました。 ボタンを押した時にボタンの裏のセルに隠れているURL先に行くマクロを作っています。 具体的には D列から最大F列までの13行から下(変動します)にボタンがあり、 それぞれ行きたいURLがボタンの裏に書かれています。 D13にあるボタンをクリックすると、その裏にあるURLに行くイメージです。 http://okwave.jp/qa/q210243.html を参考に、セルの位置を取得するまでは出来ました。 次に objIE.Navigate Range("○●")の要領で Sell Range("○●")を作りたいのですが、 ○●の表し方が間違っているためかURL先に行けません。 Dim tmp As Variant tmp = Split(ActiveSheet.Shapes(Application.Caller).TopLeftCell.Address, "$") Shell Range(tmp(1) & tmp(2)) としてみたり、色々試してみましたがダメでした。 他の方法でも構いませんのでご教授願います。

  • 測定の問題2

    以下の問題を教えてください 25℃においてA→Bになる反応の反応物濃度〔A〕を種々の 時刻で測定したこの反応は〔A〕=A。exp(-kt) に従うとしてA。、kを求めよ t  〔A〕 秒  moldm^-3 0 0.1000 1 0.0819 2 0.0670 3 0.0549 4 0.0415 5 0.0378 どうかご教授お願いします

  • 騒音測定器の測定時間について

    現在、ちょっとした余興で人の声の大きさを測りたいと思っています。 そこで騒音測定器を購入しようと思っているのですが、検討中の商品の価格が~7000円程度のものは一体どの程度の時間で測定可能なのでしょうか。 具体的に言うと人が「わっ!」と言った声だけでその瞬間的な音の大きさを測定できるものなのでしょうか。 それほどの短い時間では測定できない場合、どれくらいの時間がかかるものなのでしょうか。 測定機をお持ちの方、使用したことのある方、ご回答をよろしくお願いします。

専門家に質問してみよう