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の通常の日付(日付オブジェクト、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日(木)になります。
「木、金、土、月、火、水、木」と日曜日をとばすからです。
この日曜日をとばすという処理が面倒です。 (さらに…)