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

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

エクセルのマクロの組み方について

研究でデータロガーを使ってデータを測定し、エクセルに記録しています。 1秒ごとにプロットしているのですが、それだとデータ量が大きすぎるので 10秒ごとのデータに変換したいと思っています。 マクロで10秒毎に1つのデータを抜き出すようにマクロを組みたいのですが、 マクロを勉強したことがないのでプログラミングの仕方がわかりません。 どのようなプログラムを組めばいいでしょうか? 例えば以下のようにしたいと思っています。 最初の1行目は項目を記入するのでここは消えないようにしたいです。 time result 0   0 1   1 2   2 3   3 4   4 5   5 6   6 7   7 8   8 9   9 10  10 11  11 ・   ・ ・   ・ ・   ・   ↓ time result 0   0 10   10 20   20 30   30 ・    ・ ・    ・ ・    ・ 回答よろしくお願いします。

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

  • ベストアンサー
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のプログラムはだいたいそうなってますが)

関連するQ&A

  • エクセルのマクロの組み方に詳しい方

    エクセルのマクロの組み方に詳しい方はいらっしゃいませんか? 今、売り上げの記入を自動化できるようにマクロを組もうと試みています。 しかし、マクロの本を見てもちんぷんかんぷんです 。 頭の中で考えていることですが… まずデータベースとしてエクセル、またはそれに代用できるファイルに手入力で仕入れの詳細を記入していきます。 これは自分で入力していくので問題ありません。 ここからが問題です。 データベースとは別のエクセルにマクロを登録して、データベースから仕入れ情報を検索したいのです。 例えば… A1商品名、A2重量、A3仕入値…というように項目を作っていきます。 そしてB行に検索したい文字、数値を入力します。 そしてボタン1をクリックすると、B 行に入力した値に一致するデータを行ごとD行に呼び出します。 最後にD行の売上の項目に売上を記入して、更新したD行のデータをシート2、又は別のエクセルファイルに張り付けられるようにしたいです。 データの張り付けを文字のあるセルの最後尾の下の空白のセルに張り付けていけるようにしたいです。 どのようなマクロを組むと良いでしょうか?どのような言語を使うと良いでしょうか? 詳しい方是非是非教えて下さい。。

  • エクセルでのマクロを教えて

    下記のようなものをみたすマクロは組めますか? ファイルにシートが何種類かあります。 sheet1には各店の集計データーがあります。 その中にA列には集計の項目名がAZ列まであり 1行目には店舗名が10種類あります。 sheet2からはsheet名をsheet1に記入されている1行目にしている店舗名にしてあります。 またA列には集計の項目名がありますが sheet1にある項目と全く同じではなく 項目は少なくなっています。 また、sheet2からの店舗名にはsheet1の集計表にはない 店舗名もあります。 このsheet1のデーターをもとに sheet2の1行目の項目と一致する項目の値や数字を sheet1からコピーするというものです。 よろしくお願いします。

  • エクセルのマクロについて

    エクセルで、毎日12行のデータが増えていくシートがあるのですが、集計の都合でどうしても最終行に関数式があり、その式の1行上に毎日「12行挿入」してデータを入れてます。毎日行挿入を何回も繰り返すのは面倒なので、マクロを記録しましたが、挿入する列番号が絶対参照?だったらしく、翌日は変な所に12行挿入してしまいます。マクロで毎日最終行の一つ上に12行挿入する方法をご存知の方、その方法を教えてください。

  • エクセル・マクロについて教えてください

    こんにちは。エクセルのマクロについて教えてください。 エクセルの表で毎日20000~30000行くらいのデータがあり、フィルタを掛けてやるのもいいですが、業務効率を考えて、マクロを使用したいと思っています。 実行したい内容は、C列(担当)は8と721以外は削除、F列(地域)は渋谷と品川以外は削除、G列(コード)は1000未満と空白行は削除、H列(数量)は0以下を削除 簡易記録マクロで記録してみましたが、毎回データの内容が異なるため、H列のマイナスが削除されていなかったり等、実行したい結果が得ることができませんでした。 マクロも少し勉強していますが本やネットでも検索したりしましたが、うまくできませんでした。ご教授ください。

  • エクセルのマクロについて

    現在、数種のデータを格納したファイルが会社のサーバーに保管されています。 各フォルダのデータを閲覧するためルートを作ってあげて目的のフォルダをひらけるようにしたいと考えております。 シートごとに検索項目を設定し、マクロ記録モードでファイルを開く手前まで作成できたのですが、フォルダを開くのがうまくいきません。 フォルダを開くマクロがあれば、教えていただけないでしょうか。 よろしくお願いします。

  • エクセルマクロについて

    いつもお世話になっております。 エクセルのマクロについて質問させていただきます。 仕事上測定した10回データを、エクセルで計算させ平均やσ出すという処理を毎回しているのですが、測定したデータというのが、csvファイルで10個できあがり、それを一つずつ開いては貼っての繰り返しをしています。 この作業をマクロで自動的に出来ないものかと思い質問させていただきました。 装置によって毎回.csvの前のファイル名が変る恐れがあるので、csvファイルの入っているフォルダ(ディレクトリを指定)を指定し、その中にあるcsvファイルを自動的に貼る事が出来る事が理想です。 VBAではこのような処理のサンプルプログラムがあるのですが、VBAはあまり解らないので出来ればマクロの記録からできればと思います。 宜しくお願い致します。

  • エクセルのマクロ

    教えてください。   A     B   C 1 部品番号  ○   済印 2 111111   ○   済 3 222222   ○   済 4 333333   ○ という表があるとします。 B列にマクロのボタンを作っておき、 A列に部品番号を入力したら、マクロのボタンを押して、 C列に済、という字を表示したいのです。 1部品入力するごとに、その表示をさせたいです。 2行目、3行目・・・と一つずつマクロを登録して いく方法は、(マクロについては詳しくないので、マクロの記録、マクロの停止、という方法しかわかりません)入力するデータが100件以上あるため、それもどうかな・・と悩んでいます。超初心者なのですが、何とか完成したいと思っています。 よろしくお願い致します。

  • エクセルのマクロについて

    エクセルのマクロについて教えてください。 毎月、データをダウンロードし、VLOOKUP関数などを使って、 必要項目を入れ、ピポットテーブルで合計を出すという 作業をしています。マクロを使ったら、簡単にできるのでは ないかとやってみましたが、マクロで登録しても 毎月集計をするデータの件数が異なるため、 VLOOK関数で入力されるのが、そのマクロで登録したときの ものまでで、残りのセルが空欄になっていたり、 ピポットテーブルの集計は、データの範囲を選びなおしたり しないといけませんでした。 いい方法はないでしょうか。 マクロに作業を記録して、そのシートではなく、 ほかのファイルのシートで 実行する場合は、そのマクロを登録したときのファイル(シート)を 毎回開かなければならないのでしょうか。 基本的なことがわかっていません。 教えてください。

  • Excelのマクロで別のシートに追加する方法

    入力するためのシート1からデータをためるためのシート2に入力するものをマクロのボタンでできるようにしたいのですがどのようにマクロのVBA打てばいいのか分からないので教えて下さい。 したいことは、データ4列でシート1の1行目は項目の行にして、 2行目にデータを入力する。 入力したデータを切り取って、シート2の2行目に張り付けて 次のデータをシート1の2行目に入力して 同じように切り取って次は3行目、4行目…というマクロ作りたいんです。 どなたかお願いします

  • エクセル マクロでの繰り返し処理について

    エクセル初心者です。エクセル2010を使用しています。 とあるホームページから、ページをコピーして、エクセルに「テキストで貼り付け」をおこない、 A列に8行の項目が入ります。この8行と次の8行の間には、自然に空白行が1行ずつ入ります。 これは、完全に手作業です。 次に、下記の作業を、マクロの自動記録を相対参照で行います。 上記のエクセルのデータを、1つめの8行のデータをコピーして(A1からA8)、C1に「行と列を入れ替え」を選択してC1からJ1に貼り付けます。 その後は、次のデータのまとまりのA10のセルに移ります。これをCtrl+a を押し続けることで、数百件か多いときは4000件ほどの並べ替えをしています。 「データがある間は、この処理を繰り返す。」 というマクロにしたいのですが、参考書等を見ながらチャレンジしてもうまくいきません。 わかる方、教えていただけますか。 以下が、マクロの自動記録でできた物です。データの個数は数百のこともあれば4000件のこともあります。 Sub 行列入れ替え8行() ' ' 行列入れ替え8行 Macro ' ' Keyboard Shortcut: Ctrl+a ' ActiveCell.Range("A1:A8").Select Selection.Copy ActiveCell.Offset(0, 2).Range("A1").Select Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True ActiveCell.Offset(9, -2).Range("A1").Select End Sub どうぞ、ご指導よろしくお願いいたします。