'/** ' * quickSort ' * 配列をクイックソートする ' * 大小比較できる型ならとりあえずソートできるはず ' * @param Variant aryVal sort対象配列 ' * @param Optional Long left sort範囲左 ' * @param Optional Long right sort範囲右 ' * @return sort後配列 ' */ Sub quickSort(ByRef aryVal As Variant, Optional ByVal left As Long = -1, _ Optional ByVal right As Long = -1) Dim l As Long Dim r As Long Dim pivot As Variant Dim tmp As Variant If left = -1 Or right = -1 Then left = LBound(aryVal) right = UBound(aryVal) End If l = left r = right 'ソート範囲の中央の値を取得 pivot = aryVal(Int((left + right) / 2)) Do '配列の先頭から、中央の値より大きいものを探す Do While aryVal(l) < pivot l = l + 1 Loop '配列の末尾から、中央の値より小さいものを探す Do While aryVal(r) > pivot r = r - 1 Loop 'ソートの必要がなければループ終了 If l >= r Then Exit Do '前半部の大きい値と後半部の小さい値を入れ替える tmp = aryVal(l) aryVal(l) = aryVal(r) aryVal(r) = tmp l = l + 1 r = r - 1 Loop 'ソートが終わるまで再帰的に自分を呼び出し If (left < l - 1) Then Call quickSort(aryVal, left, l - 1) End If If (right > r + 1) Then Call quickSort(aryVal, r + 1, right) End If End Sub '/** ' * bubbleSort ' * 配列をバブルソートする ' * 大小比較できる型ならとりあえずソートできるはず ' * @param aryVal sort対象配列 ' * @return sort後配列 ' */ Sub bubbleSort(ByRef aryVal As Variant) Dim i As Long Dim j As Long Dim tmp As Variant For i = 0 To UBound(aryVal) For j = UBound(aryVal) To i Step -1 If aryVal(i) > aryVal(j) Then tmp = aryVal(i) aryVal(i) = aryVal(j) aryVal(j) = tmp End If Next j Next i End Sub 'テスト用 Sub test() Dim aryQuick() As Variant: ReDim aryQuick(0) Dim aryBubble() As Variant: ReDim aryBubble(0) Dim i As Long '乱数で配列生成 For i = 0 To 10000 ReDim Preserve aryQuick(UBound(aryQuick) + 1) aryQuick(UBound(aryQuick)) = Int(Rnd * 10000) ReDim Preserve aryBubble(UBound(aryBubble) + 1) aryBubble(UBound(aryBubble)) = Int(Rnd * 10000) Next i 'クイックソート開始 Debug.Print Now() Call quickSort(aryQuick) 'クイックソート終了 'バブルソート開始 Debug.Print Now() Call bubbleSort(aryBubble) 'バブルソート終了 Debug.Print Now() End Sub
【VBA】Dir関数で指定パスのサブフォルダを全て取得する
'/** ' * getTargetFolders ' * 与えられたパス配下のフォルダをサブフォルダまで配列で取得する ' * @param strDirectoryPath パス ' * @return フォルダ名のString配列 ' */ Function getTargetFolders(ByVal strDirectoryPath As String) As String() Dim buf As String Dim i As Long: i = 0 Dim folders() As String: ReDim folders(0) Dim nowPath As String folders(0) = strDirectoryPath '親フォルダループ Do nowPath = folders(i) & "\" buf = Dir(nowPath, vbDirectory) '子フォルダループ Do While buf <> "" If GetAttr(nowPath & buf) = vbDirectory _ And buf <> "." And buf <> ".." Then '配列末尾に格納 ReDim Preserve folders(UBound(folders) + 1) folders(UBound(folders)) = nowPath & buf End If buf = Dir() Loop 'フォルダ走査完了 If i = UBound(folders) Then Exit Do Else i = i + 1 End If Loop getTargetFolders = folders End Function
【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>