セル範囲の文字列を結合するユーザー関数

Excelには、「CONCATENATE」という、文字列を結合するワークシート関数があります。
CONCATENATE(文字列1,文字列2,...)
このように引数に文字列を指定します。文字列としてセルを指定することもできますが、一つの文字列に指定できるのは一つのセルです。
そこで、セル範囲を指定して、それぞれのセルの文字列を結合するユーザー定義関数「CONCATENATERANGE」を作ってみました。

Function CONCATENATERANGE(ParamArray Elements())
    Dim c, ub As Long
    Dim t As String
    Dim rng, rngs As Range
    ub = UBound(Elements())
    t = ""
    For c = 0 To ub
        Set rngs = Elements(c)
        For Each rng In rngs
            If Not IsEmpty(rng.Value) Then
                t = t & rng.Value
            End If
        Next
    Next c
    CONCATENATERANGE = t
End Function

「=CONCATENATERANGE(A1:C10)」のように引数にセル範囲を指定します。
「=CONCATENATERANGE(A1:B2,C3:D4,A5:B6)」のように複数のセル範囲を指定することもできます。

重複なしでセルの個数を数えるユーザー定義関数

Excelには、「COUNT」という、値の個数を数えるワークシート関数があります。
同じようにして、重複する値を除き、一意の値だけを数えるユーザー定義関数「COUNTUNIQUE」を作ってみました。

Function COUNTUNIQUE(ParamArray Elements())
    Dim a(1000)
    Dim c, i, j As Long
    Dim flg As Boolean
    Dim ub As Long
    Dim rng, rngs As Range
    ub = UBound(Elements())
    i = 0
    For c = 0 To ub
        Set rngs = Elements(c)
        For Each rng In rngs
            If Not IsEmpty(rng.Value) Then
                flg = True
                If i > 0 Then
                    For j = 0 To i - 1
                        If rng.Value = a(j) Then
                            flg = False
                            Exit For
                        End If
                    Next j
                End If
                If flg = True Then
                    a(i) = rng.Value
                    i = i + 1
                End If
            End If
        Next
    Next c
    COUNTUNIQUE = i
End Function

「=COUNTUNIQUE(A1:C10)」のように引数にセル範囲を指定します。

曜日が変わらないカレンダーをJavaScriptで

曜日が変わらないカレンダーについて書きましたが、これをJavaScriptのユーザー定義関数にしてみました。
JavaScriptの通常の日付(日付オブジェクト、ndate)を与えると「ハンキ・ヘンリー・パーマネント・カレンダー」における日付(文字列、pdate)に変換します。
返る値は「2012-1-19」という形式です。
使い道が思い当たりませんが。

function date2hhpc(ndate) {
  var di, ldi, preldi, y, ydi, isext, sdi, pdate;
  //日のインデックス。2012-01-01(初日)を0日目とする
  di = (ndate - (new Date(2012, 0, 1))) / 86400000;
  //対応しているのは2012年から2167年まで
  if(di < 0 || di > 20453) {
    return "error";
  }
  //大晦日のインデックス
  ldi = -1;
  year = 2011;
  while(di > ldi) {
    year++;
    //前年の大晦日
    preldi = ldi;
    isext = String(year).match(/(2015|2020|2026|2032|2037|2043|2048|2054|2060|2065|2071|2076|2082|2088|2093|2099|2105|2111|2116|2122|2128|2133|2139|2144|2150|2156|2161|2167)/) ? 1 : 0;
    ldi += 364 + isext * 7;
  }
  ydi = di - preldi - 1;
  if(ydi > 363) {
    pdate = "E/" + (ydi - 363);
  } else {
    sdi = ydi % 91;
    x = Math.floor(sdi / 30) + 1;
    x = (x > 3) ? 3 : x;
    pdate = (Math.floor(ydi / 91) * 3 + x) + "-" + (sdi - 30 * (x - 1) + 1);
  }
  return year + "-" + pdate;
}

日曜日を含まない経過日計算

ある日からその日を含んでX日を経過した日をExcelで求めるには「始期となる日+X-1」とすればOKです。

では日曜日を含まないで計算するにはどうしたらよいでしょうか。

たとえば2011年12月8日(木)の7日経過した日は単純に計算すると14日(水)になります。
しかし日曜日を含まない場合、8日(木)の7日経過した日は15日(木)になります。
「木、金、土、月、火、水、木」と日曜日をとばすからです。
この日曜日をとばすという処理が面倒です。 (さらに…)

新しい記事

タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報