• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルのマクロの組み方について)

エクセルのマクロでデータ変換する方法

このQ&Aのポイント
  • エクセルのマクロを使用してデータの変換を行う方法について解説します。
  • データロガーで計測したデータを1秒ごとではなく、10秒ごとのデータに変換することが目的です。
  • マクロを組むことで、10秒ごとのデータを抽出するプログラムを作成することが可能です。

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

  • ベストアンサー
noname#144013
noname#144013
回答No.3

こんにちは。#2です。 > なので、ロギングする時点で10秒毎に1つデータを抜き出すのではなく、すでにあるデータ > から10秒ごとにデータを抜き出したいと思っています。 なるほど、既に別ファイルとしてロギングデータがあり、   「その中から特定のデータを抽出したい」 ということだった訳ですね。 #2で見当違いの回答をしてしまい、すみませんでした。 ということで下記の件、 > また、10秒ごとなどではなくて、結果に大きな変化があったときだけデータを抜き出すという > プログラムはできないでしょうか? も含めて、あらためてExcelブック及びマクロを組み直してみました。 ■前提条件 1)ロギングデータファイルは、    ・Excel形式のワークブックファイル(*.xls)    ・CSV 形式のテキストファイル(*.csv)  の何れかの形式であること。 2)ロギングデータは以下のようなフォーマットであること。   1行目   : 項目名(データのタイトル)   2行目以降: データ(以下の形式)           1カラム目: 観測時間(ロギング開始からの経過秒数)           2カラム目: 観測値(整数値)   <データ例>    time  result    0    0    1    1    2    2    3    3    4    4    5    50    6    51    7    52    8    53    9    54   10    55   11   100   12   120   13   150    :    :    :    :   ※CSVファイルの場合は、上記のようなデータがカンマ区切りで記録    されていること。 ■マクロを組み込むExcelワークブックの形式  ・シートは1シートとし、以下のような構成とします。       A     B    C      D              E             1  Time  Result      データファイル名   Data1.xls    ←データファイル名を入力   2    0     0       抽出タイプ       ○ 指定の時間間隔    ←オプションボタン1   3    5    50                    ◎ 変化時(判定値以上) ←オプションボタン2   4    11   100                                       5    13   150       抽出時間間隔(秒)       10  ←数値を入力   6    15   200       変化の判定値          30  ←数値を入力   7    19   300       [ 抽出実行 ]  ←コマンドボタン   8    20   330    :    :    :    :    :    :        ↑    ↑      抽出したデータ   A列  : 抽出したロギングデータの観測時間(経過秒数)を表示します。         ・表示形式: 標準   B列  : 抽出したロギングデータの観測値を表示します。         ・表示形式: 標準   E1セル: ロギングデータの「ファイル名」を入力するようにします。         ・表示形式: 文字列         ※[抽出実行]ボタンが押されたら、このファイルを開いてデータ抽出を          行います。         ※ドライブ名、フォルダ名を除いたファイル名のみを入力します。         ※ファイルは、マクロを組み込んだExcelワークブックと同じフォルダに          あるものとします。   オプションボタン1、2 : 抽出する方式を選択するようにします。     ・指定の時間間隔 : E5セルに入力された時間間隔ごとにデータを抽出します。     ・変化時      : E6セルに入力された判定値を基準とし、ロギングデータ                  の前後の差(1つ前のデータとの差)が判定値以上の                  時に抽出するようにします。   E5セル: 抽出時間間隔(秒数)を入力します。         ・表示形式: 数値(小数点以下の桁数 =0)         ※オプションボタンで「指定の時間間隔」が選択された時に有効です。   E6セル: 変化の判定値を入力します。         ・表示形式: 数値(小数点以下の桁数 =0)         ※オプションボタンで「変化時」が選択された時に有効です。   [抽出実行]ボタン: ボタンクリックで抽出処理を実行します。   ※添付画像は上記構成のExcelワークブックのシート画面です。 ■マクロソース 注)インデントのため全角スペースを入れています。   コピペする際は半角スペースorタブに置換して下さい。 <ThisWorkbookモジュール> /////↓ここから////////// Option Explicit ' '抽出Workbookのオープン時の処理 ' Private Sub Workbook_Open()   Dim vPickType1 As Variant  '抽出タイプ(OptionButton1)   Dim vPickType2 As Variant  '抽出タイプ(OptionButton2)   Dim vPickSpan As Variant  '抽出時間間隔   Dim vJudgValu As Variant  '変化の判定値   '抽出シートの設定値の取得(Variant値)   vPickType1 = Worksheets(1).OptionButton1.Value '抽出タイプ(OptionButton1)   vPickType2 = Worksheets(1).OptionButton2.Value '抽出タイプ(OptionButton2)   vPickSpan = Worksheets(1).Range("E5").Value   '抽出時間間隔   vJudgValu = Worksheets(1).Range("E6").Value   '変化の判定値   '抽出タイプのオプションボタンの初期化(2つ共Falseの時)   If vPickType1 = False And vPickType2 = False Then     Sheets(1).OptionButton1.Value = True     Sheets(1).OptionButton2.Value = False   End If   '抽出時間間隔の初期化(設定値が無効な時)   If vPickSpan = "" Or vPickSpan < 1 Then     Sheets(1).Range("E5").Value = 10   End If   '変化の判定値を初期化(設定値が無効な時)   If vJudgValu = "" Or vJudgValu < 0 Then     Sheets(1).Range("E6").Value = 50   End If End Sub /////↑こままで////////// <ワークシートモジュール(シート名=Sheet1)> /////↓ここから////////// Option Explicit ' '抽出シートの[抽出実行]ボタンのクリック時処理 ' Private Sub CommandButton1_Click()   Call DataPickUp 'データ抽出処理の呼出し End Sub /////↑こままで////////// <標準モジュール> /////↓ここから////////// Option Explicit ' 'DataPickUp : データ抽出メイン ' Sub DataPickUp()   Dim strBookPath As String  'Workbookのパス名   Dim strDataFn As String   'データファイル名   Dim vPickType1 As Variant  '抽出タイプ(OptionButton1:Variant値)   Dim vPickType2 As Variant  '抽出タイプ(OptionButton2:Variant値)   Dim vPickSpan As Variant  '抽出時間間隔(Variant値)   Dim vJudgValu As Variant  '変化の判定値(Variant値)   Dim nPickType As Integer  '抽出タイプ(Integer値)   Dim nPickSpan As Long    '抽出時間間隔(Long値)   Dim nJudgValu As Long    '変化の判定値(Long値)   Dim fgErr As Integer    'エラー判定用   Dim strMsg As String    'メッセージ文字列   Dim bkPick As Workbook   '抽出Workbookのオブジェクト   Dim shPick As Worksheet   '抽出シートのオブジェクト   Dim bkData As Workbook   'データWorkbookのオブジェクト   Dim shData As Worksheet   'データシートのオブジェクト   '本ブックのパス名(フォルダ名)を取得   strBookPath = ThisWorkbook.Path   'データファイル名のチェック&取得   strDataFn = Sheets(1).Range("E1").Value   If strDataFn = "" Then     strMsg = "データファイル名を入力して下さい。"     MsgBox strMsg, vbOKOnly Or vbExclamation     Exit Sub   End If   strDataFn = strBookPath & "\" & strDataFn  'フルパスのファイル名   '抽出シートの設定値の取得(Variant値)   vPickType1 = Sheets(1).OptionButton1.Value '抽出タイプ(OptionButton1)   vPickType2 = Sheets(1).OptionButton2.Value '抽出タイプ(OptionButton2)   vPickSpan = Sheets(1).Range("E5").Value   '抽出時間間隔   vJudgValu = Sheets(1).Range("E6").Value   '変化の判定値   '抽出タイプのチェック&取得(Integer値)   nPickType = 0   If vPickType1 = True Then     nPickType = 1   ElseIf vPickType2 = True Then     nPickType = 2   End If   If nPickType = 0 Then     strMsg = "抽出タイプを選択して下さい。"     MsgBox strMsg, vbOKOnly Or vbExclamation     Exit Sub   End If   '抽出時間間隔のチェック&取得(Long値)   If nPickType = 1 And vPickSpan = "" Then     strMsg = "抽出時間間隔を入力して下さい。"     MsgBox strMsg, vbOKOnly Or vbExclamation     Exit Sub   End If   If nPickType = 1 And vPickSpan < 1 Then     strMsg = "抽出時間間隔は1以上の値を入力して下さい。"     MsgBox strMsg, vbOKOnly Or vbExclamation     Exit Sub   End If   nPickSpan = vPickSpan   '変化判定値のチェック&取得(Long値)   If nPickType = 2 And vJudgValu = "" Then     strMsg = "変化の判定値を入力して下さい。"     MsgBox strMsg, vbOKOnly Or vbExclamation     Exit Sub   End If   If nPickType = 2 And vJudgValu < 0 Then     strMsg = "変化の判定値は0以上の値を入力して下さい。"     MsgBox strMsg, vbOKOnly Or vbExclamation     Exit Sub   End If   nJudgValu = vJudgValu   '画面更新を停止   Application.ScreenUpdating = False   'データファイルを開く(オープン失敗なら戻る)   fgErr = 0   On Error GoTo L_ERR1   Workbooks.Open Filename:=strDataFn, ReadOnly:=True   On Error GoTo 0   If fgErr <> 0 Then     strMsg = "データファイルが開けません。"     MsgBox strMsg, vbOKOnly Or vbExclamation     Application.ScreenUpdating = True     Exit Sub   End If   'データファイルのWorkbookオブジェクトとデータシートを取得   Set bkData = ActiveWorkbook   Set shData = bkData.Worksheets(1)   '本ブックのWorkbookオブジェクトと抽出シートを取得   Set bkPick = ThisWorkbook   Set shPick = bkPick.Worksheets(1)   '抽出シートに切替え   shPick.Activate   '画面更新を再開   Application.ScreenUpdating = True   'データ抽出実行   If nPickType = 1 Then     '抽出時間間隔での抽出     Call DataPickUpSub1(nPickSpan, shPick, shData)   Else     'データ変化による抽出     Call DataPickUpSub2(nJudgValu, shPick, shData)   End If   'データファイルを閉じる   '※抽出終了後に自動でデータファイルを閉じたい場合は   ' 下記を有効化する。   'bkData.Close   '取得した各種オブジェクトの解除   Set shData = Nothing   Set bkData = Nothing   Set shPick = Nothing   Set bkPick = Nothing   Exit Sub '==エラー処理== L_ERR1:   fgErr = 1  'エラー判定値セット   Resume Next 'エラー箇所の次行に戻る End Sub ' 'DataPickUpSub1 : データ抽出サブ1(抽出時間間隔での抽出) ' Sub DataPickUpSub1(ByVal nPickSpan As Long, _     ByRef shPick As Worksheet, ByRef shData As Worksheet)   Dim nTopRow As Long   'データ先頭行   Dim nLastRow As Long  'データ最終行   Dim rgCur As Range   'カレントRangeオブジェクト   Dim nObsTim As Long   '観測時刻(経過秒)   Dim nObsRes As Long   '観測値   Dim nPickCnt As Long  '抽出カウンタ   Dim strMsg As String  'メッセージ文字列   '抽出時間間隔のチェック   If nPickSpan < 1 Then     strMsg = "抽出時間間隔が無効な値です。"     MsgBox strMsg, vbOKOnly Or vbExclamation     Exit Sub   End If      'データシートのデータ有無チェック   nTopRow = 2   nLastRow = shData.Range("A" & shData.Rows.Count).End(xlUp).Row   If nLastRow < nTopRow Then     strMsg = "データファイルにデータがありません。"     MsgBox strMsg, vbOKOnly Or vbExclamation     Exit Sub   End If   '抽出シートのデータエリアをクリア   shPick.Range("A2:B" & shPick.Rows.Count).Select   Selection.ClearContents   shPick.Range("A2").Select   '==データ抽出処理==   nPickCnt = 0  '抽出カウンタクリア   'データシートのデータ範囲上をループ   For Each rgCur In shData.Range("A" & nTopRow & ":A" & nLastRow)     nObsTim = rgCur.Value        '観測時刻を取得     nObsRes = rgCur.Offset(0, 1).Value '観測値を取得     If (nObsTim Mod nPickSpan) = 0 Then '観測時刻が抽出時間間隔か?       nPickCnt = nPickCnt + 1     '抽出カウンタUP       '抽出シートにデータを貼付け       shPick.Range("A" & 1 + nPickCnt).Value = nObsTim       shPick.Range("A" & 1 + nPickCnt).Offset(0, 1).Value = nObsRes     End If   Next End Sub ' 'DataPickUpSub2 : データ抽出サブ2(データ変化による抽出) ' Sub DataPickUpSub2(ByVal nJudgValu As Long, _     ByRef shPick As Worksheet, ByRef shData As Worksheet)   Dim nTopRow As Long   'データ先頭行   Dim nLastRow As Long  'データ最終行   Dim rgCur As Range   'カレントRangeオブジェクト   Dim nObsTim As Long   '観測時刻(経過秒)   Dim nObsRes As Long   '今回観測値   Dim nObsResB4 As Long  '前回観測値   Dim nPickCnt As Long  '抽出カウンタ   Dim strMsg As String  'メッセージ文字列   '変化判定値のチェック   If nJudgValu < 0 Then     strMsg = "変化判定値が無効な値です。"     MsgBox strMsg, vbOKOnly Or vbExclamation     Exit Sub   End If      'データシートのデータ有無チェック   nTopRow = 2   nLastRow = shData.Range("A" & shData.Rows.Count).End(xlUp).Row   If nLastRow < nTopRow Then     strMsg = "データファイルにデータがありません。"     MsgBox strMsg, vbOKOnly Or vbExclamation     Exit Sub   End If   '抽出シートのデータエリアをクリア   shPick.Range("A2:B" & shPick.Rows.Count).Select   Selection.ClearContents   shPick.Range("A2").Select   '==データ抽出処理==   nPickCnt = 0  '抽出カウンタクリア   '前回観測値を先頭の観測値で初期化   nObsResB4 = shData.Range("B" & nTopRow).Value   'データシートのデータ範囲上をループ   For Each rgCur In shData.Range("A" & nTopRow & ":A" & nLastRow)     nObsTim = rgCur.Value        '観測時刻を取得     nObsRes = rgCur.Offset(0, 1).Value '今回観測値を取得     'データ先頭または前回観測値と今回観測値の差が変化判定値以上     'ならデータ抽出     If nPickCnt = 0 Or _       Abs(nObsRes - nObsResB4) >= nJudgValu Then       nPickCnt = nPickCnt + 1     '抽出カウンタUP       '抽出シートにデータを貼付け       shPick.Range("A" & 1 + nPickCnt).Value = nObsTim       shPick.Range("A" & 1 + nPickCnt).Offset(0, 1).Value = nObsRes     End If     nObsResB4 = nObsRes '前回観測値を今回観測値に更新   Next End Sub /////↑こままで////////// 以上です。 宜しければ試してみて下さい。 希望に合わない部分があれば、ご自身で改造してみて下さい。

ohayogurt
質問者

お礼

ありがとうございます。 大変詳しく長い回答ありがとうございます。 さぞかし苦労したと思います。 あまり理解ができない部分が多いですが、なんとか理解するようにがんばります!! 実はインターンシップでFT-IRを使用したときに、10秒ごとにデータを抜き出すマクロを使用したのですが忘れてしまったのです。 そのときは10行ぐらいのプログラムだったのですが、 回答者様はよりくわしく書いてくれたみたいですねヾ(*´∀`*)ノ♪

その他の回答 (4)

noname#144013
noname#144013
回答No.5

こんにちは。 FarEyesです。 > また、変化したらプロットするようにで、数値の変動値じゃなくて前の結果に対して、 > 例えば10%変化したらプロットするようにするにはどうすればいいですか? これはプログラミングというよりも、数学(または算数)の問題になるかと思います。 質問者さんは、どうお考えされたのでしょう? 一度、プログラミングを離れて、手書きで表を作る場合にどう計算すれば良いか を考えてみてはどうでしょう? 以下は一例です。 上記の課題を、   「前回の値」と「今回の値」の差が、「前回の値」の10%の値以上だった場合に   今回の値を抽出する と解釈して宜しいでしょうか? ※もし解釈が違っていたらすみません。 そうだとした場合で、#3のサンプルを改造したものです。 ■サンプルマクロ(改造版) ※データ抽出部分のみ抜粋しています。 ============================ ' 'DataPickUpSub2 : データ抽出サブ2(データ変化による抽出) ' Sub DataPickUpSub2(ByVal nJudgValu As Long, _     ByRef shPick As Worksheet, ByRef shData As Worksheet)   Dim nTopRow As Long   'データ先頭行   Dim nLastRow As Long  'データ最終行   Dim rgCur As Range   'カレントRangeオブジェクト   Dim nObsTim As Long   '観測時刻(経過秒)   Dim nObsRes As Long   '今回観測値   Dim nObsResB4 As Long  '前回観測値   Dim nJudgWk1 As Long  '変化量ワーク(1)   Dim nJudgWk2 As Long  '変化量ワーク(2)   Dim nJudgWk3 As Long  '変化量ワーク(3)   Dim nPickCnt As Long  '抽出カウンタ   Dim strMsg As String  'メッセージ文字列   '変化判定量のチェック   If nJudgValu < 0 Then     strMsg = "変化判定量が無効な値です。"     MsgBox strMsg, vbOKOnly Or vbExclamation     Exit Sub   End If      'データシートのデータ有無チェック   nTopRow = 2   nLastRow = shData.Range("A" & shData.Rows.Count).End(xlUp).Row   If nLastRow < nTopRow Then     strMsg = "データファイルにデータがありません。"     MsgBox strMsg, vbOKOnly Or vbExclamation     Exit Sub   End If   '抽出シートのデータエリアをクリア   shPick.Range("A2:B" & shPick.Rows.Count).Select   Selection.ClearContents   shPick.Range("A2").Select   '==データ抽出処理==   nPickCnt = 0  '抽出カウンタクリア   '前回観測値を先頭の観測値で初期化   nObsResB4 = shData.Range("B" & nTopRow).Value   'データシートのデータ範囲上をループ   For Each rgCur In shData.Range("A" & nTopRow & ":A" & nLastRow)     nObsTim = rgCur.Value        '観測時刻を取得     nObsRes = rgCur.Offset(0, 1).Value '今回観測値を取得     '判定量(%)を観測値相当量に変換(※検証のため下記3種類を計算)     nJudgWk1 = (Abs(nObsResB4) * nJudgValu) \ 100      '小数点以下切り捨て     nJudgWk2 = Int(Abs(nObsResB4) * nJudgValu / 100 + 0.9) '小数点以下1桁切り上げ     nJudgWk3 = Int(Abs(nObsResB4) * nJudgValu / 100 + 0.5) '小数点以下1桁四捨五入     'データ先頭または前回観測値と今回観測値の差が判定量以上ならデータ抽出     '※ここでの判定量は小数点以下切り捨ての値を使用     If nPickCnt = 0 Or _       Abs(nObsRes - nObsResB4) >= nJudgWk1 Then       nPickCnt = nPickCnt + 1     '抽出カウンタUP       '抽出シートにデータを貼付け       shPick.Range("A" & 1 + nPickCnt).Value = nObsTim       shPick.Range("A" & 1 + nPickCnt).Offset(0, 1).Value = nObsRes     End If     nObsResB4 = nObsRes '前回観測値を今回観測値に更新   Next End Sub ============================ 添付画像は、上記マクロ実行後のシート画面をキャプチャしたものです。 ・左側がマクロ実装側のシート、右側がデータシートです。 ※見辛かったらすみません。 以上です。参考になれば幸いです。

ohayogurt
質問者

お礼

FarEyesさん。 回答ありがとうございます。 いろいろとお世話になりました。 あとで修論のデータ整理を行うときにやってみます。 今回はありがとうございました。

noname#144013
noname#144013
回答No.4

#3です。 #3で訂正があります。   誤: /////↑こままで//////////   正: /////↑ここまで////////// すみませんでした。

ohayogurt
質問者

お礼

ありがとうございます。 また、変化したらプロットするようにで、数値の変動値じゃなくて前の結果に対して、 例えば10%変化したらプロットするようにするにはどうすればいいですか?

noname#144013
noname#144013
回答No.2

こんにちは。 タイマーイベントを使ったサンプルマクロを作ってみました。 処理内容は10秒毎にセルにデータを追記していくものです。 データのロギング処理部分は実現できないので、仮の処理として、   「1つ上のセルの値を+10した値を記録していく」 ということを行っています。 質問者さんのご希望のものと違っていた場合はすみません。 また、Excelのバージョンにより上手く動作しない可能性があります。 ※当方ではExcel2000を使用しています。 ■サンプルマクロ 注)インデントのため全角スペースを入れています。   コピペする際は半角スペースorタブに置換して下さい。 <ThisWorkbookモジュール> /////↓ここから////////// Option Explicit ' 'Workbookオープン時の処理(起動時のイニシャル処理) ' Private Sub Workbook_Open()   tim_mod = 0 'タイマーモードの初期化   tim_set = 0 'タイマーイベント発生時刻の初期化   tim_sta = 0 'ロギング開始時刻の初期化   'ワークシート上のコマンドボタン名の初期化   Sheets(1).CommandButton1.Caption = "ロギング開始" End Sub /////↑こままで////////// <ワークシートモジュール(シート名=Sheet1)> /////↓ここから////////// Option Explicit ' 'ワークシート上のコマンドボタンのクリック時処理 ' Private Sub CommandButton1_Click()   'タイマーモード別の処理   If tim_mod = 0 Then     '==タイマー停止中だった時     'ワークシート上のコマンドボタン名を「ロギング停止」に     CommandButton1.Caption = "ロギング停止"     'タイマー開始(タイマー値=10秒)     Call TimerStart(TimeSerial(0, 0, 10))   Else     '==タイマー起動中だった時     'ワークシート上のコマンドボタン名を「ロギング開始」に     CommandButton1.Caption = "ロギング開始"     'タイマー停止     Call TimerStop   End If End Sub /////↑こままで////////// <標準モジュール> /////↓ここから////////// Option Explicit '==グローバルデータ== Public tim_mod As Integer  'タイマーモード               ' =0:タイマー停止中、=1:タイマー起動中 Public tim_set As Variant  'タイマーイベントの発生時刻 Public tim_sta As Variant  'ロギング開始時刻 ' 'ロギングタイマー開始処理 ' Sub TimerStart(ByVal nTimeNum As Variant)   Dim tim_now As Variant '現在時刻   Dim nLastRow As Long  'データ最終行の行位置   'A列のデータ最終行を取得   nLastRow = Range("A" & Rows.Count).End(xlUp).Row   '現在時刻を取得   tim_now = Now   'ロギング開始時(タイマーモード=0)なら各種初期値セット   If tim_mod = 0 Then     tim_mod = 1     'タイマーモード=1(タイマー起動中)     tim_sta = tim_now  'ロギング開始時刻を保存     '操作対象セルを選択     Range("A" & nLastRow + 1).Select     '経過時間を初期化     Selection.Value = TimeSerial(0, 0, 0) * 1     'ロギングデータの初期値セット     Selection.Offset(0, 1).Value = 0     '操作情報に「ロギング開始」を記録     Selection.Offset(0, 2).Value = "Restart"   End If   'タイマーイベントセット   tim_set = tim_now + nTimeNum   Application.OnTime tim_set, "TimerEvent", , True End Sub ' 'ロギングタイマー停止処理 ' Sub TimerStop()   Dim nLastRow As Long  'データ最終行の行位置   'ロギング停止(タイマーモード=0)   tim_mod = 0   'タイマーイベントリセット   Application.OnTime tim_set, "TimerEvent", , False   '操作情報に「ロギング停止」を記録   nLastRow = Range("A" & Rows.Count).End(xlUp).Row   Range("A" & nLastRow).Select   Selection.Offset(0, 2).Value = "Stop" End Sub ' 'タイマーイベント処理 ' Sub TimerEvent()   Dim nLastRow As Long  'データ最終行の行位置   'A列のデータ最終行を取得   nLastRow = Range("A" & Rows.Count).End(xlUp).Row   'A列のデータ最終行の1行下のセルを選択   Range("A" & nLastRow + 1).Select   '経過時間をセット   Selection.Value = (Now - tim_sta) * 1   'ロギングデータをセット   '※ここでは仮に1行上のセルの値に+10した値をセット   If Selection.Row <= 2 Then     Selection.Offset(0, 1).Value = 0   Else     Selection.Offset(0, 1).Value = Selection.Offset(-1, 1).Value + 10   End If   'タイマーを再設定(タイマー値=10秒)   Call TimerStart(TimeSerial(0, 0, 10)) End Sub /////↑こままで////////// ■サンプルマクロについての補足 1)ワークシート上の各セルの設定・書式等は下記のような設定だとします。        A       B      C     1   Time     Result  Action    2   0:00:00       0  Restart   3   0:00:10      10          4   0:00:20      20          5   0:00:30      30          6   0:00:40      40          7   0:00:50      50  Stop     8   0:00:00       0  Restart   9   0:00:10      10          10   0:00:20      20          11   0:00:30      30  Stop     :     :        :     :     :     :        :     :     A列 : ロギング開始からの経過時間        ・表示形式: ユーザー定義→[h]:mm:ss   B列 : ロギングデータ        ・表示形式: 標準        ※今回のサンプルでは仮のデータです。   C列 : 操作状態        ・表示形式: 標準        Restart = ロギング開始        Stop   = ロギング停止 2)ワークシート上にコマンドボタンを配置して、そのボタンによりロギングの開始  および停止を行うようにしています。   コマンドボタンの名前(キャプション)は下記のようにロギング状態によりマクロ   で切替えています。     ・ロギング停止中(タイマー停止中) : 「ロギング開始」     ・ロギング実行中(タイマー起動中) : 「ロギング停止」 3)ロギングの記録がワークシートの最大行に達した時のエラー処理等は行って  いません。 参考までに、上記構成のExcelブックのキャプチャ画像を添付しました。 以上です。参考になれば幸いです。

ohayogurt
質問者

お礼

とても素晴らしい回答ありがとうございます。 僕は環境工学について勉強しておりまいして、現在排ガス(NOx)処理の研究をしています。 データはFT-IRにてもうすでに取っていてます。現在は修論発表会に向けてデータ整理を行っています。 今僕が使用しているパソコンでは、データ量が多くて処理能力が足りていない状態です。 なので、ロギングする時点で10秒毎に1つデータを抜き出すのではなく、すでにあるデータから10秒ごとにデータを抜き出したいと思っています。 また、10秒ごとなどではなくて、結果に大きな変化があったときだけデータを抜き出すというプログラムはできないでしょうか? 例えば、以下のようなプログラムを作りたいです。 time result 0   0 1   1 2   2 3   3 4   4 5   50 6   51 7   52 8   53 9   54 10   55 11  100 ・   ・ ・   ・ ・   ・   ↓ time result 1   0 5   50 11  100

回答No.1

10秒のタイマーイベントを使って その時にロがーからデータ取得するようにすればよいです イベントドリブンなプログラミングが必要になります (windowsのプログラムはだいたいそうなってますが)