複数のシートのデータをひとつにまとめてCSVデータにするマクロ

991ti_download_01

無題

Sub CSV()
Application.DisplayAlerts = False

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'データが入ったワークブックを先ず開く

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    フルパス = Application.GetOpenFilename("*.xls,*.xls*") '※2
    If フルパス = "False" Then Exit Sub         '[キャンセル]ボタンがクリックされた場合
    Workbooks.Open Filename:=フルパス

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '先頭にシートをひとつ追加して、
    '2枚目以下のシートのデータをまとめる

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    
    '先頭に追加するシートの名前
    ShN = "data" & Format(Now, "yymmddhhnnss")
    ActiveWorkbook.Worksheets.Add(Before:=Worksheets(1)).Name = ShN
    
    Dim sWS As Worksheet  'データシート(コピー元)
    Dim dWS As Worksheet  '集約用シート(コピー先)
  
    Set dWS = Worksheets(1)
    
    '集約用シートの2行目以降を削除
    dWS.UsedRange.Offset(1, 0).Clear
    
    '各シートの2行目以降のデータを、集約用シートの末尾にコピー
    For Each sWS In Worksheets
        If sWS.Name <> dWS.Name Then
            With sWS.UsedRange
            
                'コピー元シートにデータが1件以上ある場合
                If .Rows.Count > 1 Then
                    .Offset(1, 0).Resize(.Rows.Count - 1).Copy _
                        Destination:=dWS.Cells(Rows.Count, 1). _
                                        End(xlUp).Offset(1, 0)
                End If
                
            End With
        End If
    Next sWS
    
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'こまかい修正

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    
    '練習会回数データを値化
    Columns("B:B").Select
    Selection.Copy
    Range("B1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    
    '余計なデータを削除
    Range("1:1").Delete
    Range("H:L").Delete
    Range("A:A").Delete

    '集計用シートをA列で並べ替え
    dWS.UsedRange.Sort Key1:=Range("F1"), Header:=xlYes
    
    '余計な行は削除
    e = Worksheets(1).Range("F1").End(xlDown).Row + 1
    Rows(e & ":" & e + 300).EntireRow.Delete
    'セル内改行データがあったら削除
    Cells.Select
    Cells.Replace What:=vbLf, Replacement:=""
    
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'ファイル保存

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'csvデータとして保存
    Range(Cells(1, 1), Cells(e, 6)).Select
    Selection.Copy
    Workbooks.Add
    ActiveSheet.Paste
    Application.CutCopyMode = False
    
    '保存するファイル名
    FlN = "data-" & Format(Now, "yymmddhhnnss")
    
    '保存する場所を指定(ここでは C:UsersadminDesktop と指定)
    'ActiveWorkbook.SaveAs Filename:="C:UsersadminDesktop" & FlN & ".csv", _
     '   FileFormat:=xlCSV, CreateBackup:=False
    
    ファイル名 = "data"
    ファイルの種類 = 6                         '※ csv
    Application.Dialogs(xlDialogSaveAs).Show arg1:=ファイル名, arg2:=ファイルの種類
    
    ActiveWindow.Close
     
    Range("A1").Select

End Sub




window.onload = function() {
dp.SyntaxHighlighter.ClipboardSwf = ‘http://tmh.main.jp/lib/js/dp.SyntaxHighlighter/Scripts/clipboard.swf’;
dp.SyntaxHighlighter.HighlightAll(‘code’);
};

※CSVデータをDBに投入する際、改行コードを1レコードの区切りとするため、元データにセル内改行が含まれていると当該箇所で区切りとなるため、上のマクロにも改行削除をいれておく(行70)。

ちなみに、Googleスプレッドシートのデータを取得するためには、元のスプレッドシートのデータから必要な部分だけを他のスプレッドシートで読み込み、それをCGIでfile_get_contentsすればいい(file_get_contentsするためには、当該スプレッドシートが公開設定になっている必要があるが、単なる「12」等他からみたら全く無意味なデータのみであれば全くOKだろう。& 他のスプレッドシートをひとつ非公開シートとして経由させれば、より万全)。

他のスプレッドシートのデータをコピーするスクリプト(Google Apps Script)は以下のとおり。

function copyValues2() {
var ss_copyFrom = SpreadsheetApp.openById('スプレッドシートのID');
  var ss_copyTo = SpreadsheetApp.getActiveSpreadsheet();
  var sheet_copyFrom = ss_copyFrom.getSheetByName('view');
  var sheet_copyTo = ss_copyTo.getSheetByName('view');
 
  var copyValue = sheet_copyFrom.getRange('A1:B1').getValues();
  sheet_copyTo.getRange('A1:B1').setValues(copyValue);
}

→これを、30分の時間トリガー設定して、定期的にデータを取得させる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です