B-Teck!

お仕事からゲームまで幅広く

【JavaScript】指定時間後や定期的に処理を実行する。

  • window.setInterval(function, delay)
    setIntervalは、functionに与えられた関数・処理をdelay(ms)ごとに繰り返す処理。

  • window.setTimeout(function, delay)
    setTimeoutは、functionに与えられた関数・処理をdelay(ms)後に実行する処理。

setIntervalで定義された処理を止める場合は、setIntervalの戻り値に対してclearIntervalを、
setTimeoutで定義された処理を止める場合は、setTimeoutの戻り値に対してclearTimeoutを行う。

<!DOCTYPE html>
<html lang="en">
    <head>
       <meta charset="UTF-8">
       <title>Title</title>
       <script>
       (function(){
           // windowのロード時にidがdatetimeのエレメントに時刻を挿入
           window.addEventListener("load",function(){
               document.getElementById("datetime").innerText = new Date().toString();
           },false);
           
           // 1000ms毎にidがdatetimeのエレメントの時刻を書き換え
           var interVal = window.setInterval(function(){
                               document.getElementById("datetime").innerText = new Date().toString();
                           }, 1000);
           // 10000ms後に繰り返し処理を終了する
           window.setTimeout(function(){
                               clearInterval(interVal);
                           }, 10000);
       })();
       </script>
   </head>
    <body>
        <p id="datetime"></p>
    </body>
</html>

【JavaScript】Objectタグのdata要素を変更する

HTMLElement.setAttribute("data",変更後data要素)だとIEでうまくいかなかったので、
IEも対応する場合はObject要素自体のDOMをreplaceChildで置き換えてやる必要がある。

/**
* changeObjectData
* objectタグの表示内容を更新する
*
* @param {object} element - 変更対象領域のエレメント
* @param {string} data - 変更後のdata要素
* @return {boolean} true
*/
function changeObjectData(element,data){
   //現在のObjectタグの内容を複製
   var cln = element.cloneNode(true);
   //複製したもののdata要素を変更する
   cln.setAttribute("data",data);
   //自分自身をdata要素変更後のエレメントに置き換える
   element.parentNode.replaceChild(cln, element);
   return true;
}

// ex.利用例
changeObjectData(document.getElementById("hoge"),"pdf/fuga.pdf");

【VBA/Excel】Excelの印刷総ページ数を取得してCSVで出力する

Option Explicit
'/**
' * getExcelProp
' * 与えられたパスに存在する、与えられた拡張子のExcelについて
' * [ファイル名],[ページ数]のカンマ区切りの形式でString配列を作成する
' * @param  filePath ファイルの存在するパス 末尾に\が必要
' * @param  fileType 拡張子
' * @return [ファイル名],[ページ数]のカンマ区切りString配列
' */
Function getExcelProp(ByVal filePath As String, ByVal fileType As String) As String()
    Dim wkBook As Workbook: Set wkBook = Nothing    '開くワークブックオブジェクト
    Dim buf As String                               'ファイル名用バッファ
    Dim page As Long                                'ファイル毎の総ページ数
    Dim i As Long                                   'Forのカウンタ
    Dim retVal() As String: ReDim retVal(0)         '戻り値用配列

On Error GoTo Proc_Exit
    ' 処理速度向上の為非表示
    Application.Visible = False
    ' ダイアログ非表示
    Application.DisplayAlerts = False

    buf = Dir(filePath & "*." & fileType)
    Do While buf <> ""
        'ページ数初期化
        page = 0
        
        'ページ数集計
        Set wkBook = Workbooks.Open(filePath & buf)
        For i = 1 To wkBook.Sheets.Count
            '2010以前のバグ対応のため改ページプレビューに切り替える
            wkBook.Sheets(i).Select
            ActiveWindow.View = xlPageBreakPreview
            
            'どっちを書いてもカウントできる
            page = page + wkBook.Sheets(i).PageSetup.Pages.Count
            'page = page + Application.ExecuteExcel4Macro("get.document(50)")
        Next i
        
        '動的に配列増やす(コスト的には微妙…)
        ReDim Preserve retVal(UBound(retVal) + 1)
        'ファイル名,ページ数の形で配列に格納
        retVal(UBound(retVal) - 1) = buf & "," & page
        
        wkBook.Close
        Set wkBook = Nothing
        buf = Dir()
    Loop
    
Proc_Exit:
    ' エラー時にクローズできてないワークブックを閉じる
    If Not wkBook Is Nothing Then
        wkBook.Close
        Set wkBook = Nothing
    End If
    
    'ダイアログ・アプリケーションを表示するように戻す
    Application.DisplayAlerts = True
    Application.Visible = True
    getExcelProp = retVal
End Function

'/**
' * OutputCsv
' * 文字列配列からCSVを作成する
' * @param  varData 文字列配列
' * @return なし
' */
Public Sub OutputCsv(ByVal varData As Variant)
    
    Dim lngFileNum As Long
    Dim strFileNm As String
    Dim strOutPutFile As String
    Dim item As Variant
    
    'ファイル名を現在の日付にする
    strFileNm = Format(Now(), "yyyymmdd") & ".csv"
        
    ' 出力先ディレクトリ設定
    ' とりあえずこのExcelファイルと同じフォルダに出力
    strOutPutFile = ActiveWorkbook.Path & "\" & strFileNm
    
    'ファイル作成(または追記モードでオープン)
    lngFileNum = FreeFile()
    Open strOutPutFile For Append As #lngFileNum
    
    ' 配列の中身を一行ずつ追記
    For Each item In varData
        If item <> "" Then
            Print #lngFileNum, item
        End If
    Next item
    
    Close #lngFileNum

End Sub

Sub test()
    
    'OutputCsv (getExcelProp(ファイルパス, "xls"))
End Sub