修正ユリウス日

2010 年 3 月 11 日 コメントはありません

シリアル値

エクセルで経過日数を求めるには日付同士を単純に引き算すれば求められます。
エクセルではシリアル値という値を使って日付を管理しているからです。シリアル値は1900年1月1日を「1」、2日を「2」として延々と日数を数えた値です。

例えば、2001年2月18日から2004年1月1日までの経過日数を求めてみます。
2001年2月18日のシリアル値は「36940」で
2004年1月1日のシリアル値は「37987」ですので、引き算して
37987-36940=1047(日)となります。

なお1900年は閏年ではないのですが、Excelでは閏年として設計されていますので、1900年2月29日が存在する前提で計算されることに注意する必要があります。

JavaScriptにおける日付は1970年1月1日午前0時からの経過ミリ秒で管理されています。
したがって、Excelと同様、日付同士を引き算して、24*60*60*1000で割れば経過日数が求められます。

修正ユリウス日

困るのはExcelでは1900年より前の場合、JavaScriptでは1970年より前の場合です。それぞれのシステムの中では経過日数を計算することができません。
ここで使われるのがユリウス日というものです。これは紀元前4713年1月1日正午からの経過日数を表します。ただしこれを使うととても数値が大きくなるので現代では修正したものを使うのが一般的です。これを修正ユリウス日(MJDと略されます)と言います。1858年11月18日では修正ユリウス日は「1」になります。

この修正ユリウス日には公式があります。
VBA、JavaScriptで書いてみると次の通りです。

VBA

Function MJD(y, m, d)
If m < 3 Then
m = m + 12
y = y - 1
End If
MJD = Int(365.25 * y) + Int(y / 400) - Int(y / 100) + Int(30.59 * (m - 2)) + d - 678912
End Function

JavaScript

function mjd(y,m,d){
if(m<3){
m+=12;
y--;
}
return(Math.floor(365.25*y)+Math.floor(y/400)-Math.floor(y/100)+Math.floor(30.59*(m-2))+d-678912);
}

詳しい説明は省きますが、これを使うとExcelやJavaScriptの制限なしに経過日数を計算することができます。

Excelのヘルプ

Excel2007のヘルプにこんなのがあります。

ユリウス日は、現在の年と 1 月 1 日からの通算日数とを組み合わせて日付を表示するときに使用される場合があります。たとえば、2007 年 1 月 1 日は 2007001 と表され、2007 年 12 月 31 日は 2007365 と表されます。この形式はユリウス暦に基づいているわけではないことに注意してください。

Excelでは「2010年3月10日」は「2010069」をユリウス日と呼ぶそうです。何のために使うのでしょうか。わざわざ説明があるということは使う人がいるのでしょう。

また次のようなことも書かれています。

これとは別に、天文学上で一般的に使用されるユリウス暦の日付もあります。これは、紀元前 4713 年 1 月 1 日を起算点とした通日で表す日付システムです。

こちらの方が一般的だと思います。

まとめ

ユリウス日(ユリウス通日)と修正ユリウス日とExcelのシリアル値の関係をまとめておきます。

  • ユリウス日=修正ユリウス日+2400000.5
  • ユリウス日=シリアル値+2415018.5
  • 修正ユリウス日=シリアル値+15018
カテゴリー: デジタル タグ: , , ,

数独のようなゲーム「Strimko」

2010 年 3 月 6 日 コメントはありません

iPhoneのAppで久しぶりに楽しいゲームを見つけました。

Strimko Lite

数独のようなゲームです。
ルールは三つ。

  • 縦に同じ数字は入らない。
  • 横に同じ数字は入らない。
  • 線で結ばれたグループに同じ数字は入らない。

この手のパズルの面白さは一箇所が解けるとパラパラと別の部分が解ける部分にあると思っていますが、このゲームにはそれがあって気持ちがいいです。

カテゴリー: iPhone タグ:

TOKIOとSMAPと嵐のメンバー年齢比較表

2010 年 3 月 6 日 コメントはありません

妻と娘の会話についていけないのでこんなリストを作ってみました。

TOKIO

SMAP

カテゴリー: 小ネタ タグ: ,

alertとpromptのどちらを使うか

2010 年 3 月 5 日 コメントはありません

ブックマークレットで、取得した何らかの結果を表示させるにはアラートまたはプロンプトを使う。

javascript:(function(){alert(’sample’);})()
javascript:(function(){a=window.prompt(‘title’,’sample’);})()

promptを使った場合は、IEならば、文字列がテキストボックスに出力され、選択状態になるので、コピーが簡単である。

ExcelのVBAでテキストファイルを出力する

2010 年 2 月 12 日 コメントはありません

ExcelのVBAでテキストファイルを出力する方法を考える。
次はアクティブシートのセルA1からA10の内容を「出力結果.txt」というテキストファイルに出力する場合のコードである。
この例ではセルの中身を単純にそのまま書き出しているが、実際には何らかの変換を施して使うのであろう。

Sub テキストとして出力()
fnsave = “出力結果.txt”
numff = FreeFile
Open fnsave For Output As #numff
For i = 1 To 10
temp = Cells(i, 1)
Print #numff, temp
Next i
Close #numff
End Sub

次のコードは出力する内容を変数にため込み、一気に書き込む方法である。
セルの順番を入れ替えたり、セル同士を結合したり、上の例より柔軟に処理ができるかもしれない。
ただし、上と違って、自動的に改行が入らないことに注意する。もし改行を入れるならば「temp = temp & Cells(i, 1)」のところを「temp = temp & Cells(i, 1) & Chr(13)」と書くとよい。

Sub テキストとして出力2()
fnsave = “出力結果.txt”
numff = FreeFile
Open fnsave For Output As #numff
temp = “”
For i = 1 To 10
temp = temp & Cells(i, 1)
Next i
Print #numff, temp
Close #numff
End Sub

ファイル名を変えたり、保存場所を変えたりしたい場合には、1行目の代わりに次のように書くとよい。

fnsave = Application.GetSaveAsFilename(“出力結果.txt”, “テキスト(*.txt),*.txt”)
If fnsave = False Then Exit Sub

カテゴリー: デジタル タグ: , ,

ブックマークレットで目的のウェブサイトを開く方法

2010 年 2 月 12 日 コメントはありません

ブックマークレットを使って特定のページを開く場合は次のような方法があります。

同じウィンドウで開く
javascript:(function(){document.location.href=URL})()

別のウィンドウで開く
javascript:(function(){window.open(URL)})()

表紙の次からページ番号を付ける方法

2010 年 2 月 12 日 コメントはありません

マイクロソフトWord2007で表紙の次からページ番号を付ける方法は次の通り。

  1. 挿入-ページ番号-ページの下部-番号のみ。※既にページ番号を挿入してある時は、挿入-フッター-フッターの編集。
  2. このとき、ヘッダー/フッターツールが開く。
  3. ページ番号-ページ番号の書式設定-開始番号に「0」を入力。これで2ページ目に「1」と表示される。
  4. オプションの先頭ページのみ別指定にチェック。これで表紙のページ番号が消える。

ヘッダー/フッターツールを開くのがポイント。これが最初の状態では開かない。フッターの編集をしようとすると開く。印刷レイアウトで表示されている場合はフッターのあたりをダブルクリックしてもよい。

カテゴリー: デジタル タグ: ,

暦を現代に当てはめるのは正しいか

2010 年 2 月 6 日 コメントはありません

温暖化が叫ばれているのに、昔の暦をそのまま、今も使うのはおかしいと思って、調べてみました。
暦で最も寒い時期とされるのが大寒。2010年ならば1月20日です。
逆に最も暑い時期とされるのが大暑。7月22日です。

つまり暦では最も寒いのは1月、暑いのは7月。

では実際はどうか。
気象庁のサイトに日本各地の観測開始からの毎月のデータが載せられています。
次は東京の年月別の値の載ったページ。

気象庁|観測開始からの毎月の値(東京)

そして1900年代、1950年代、2000年代とそれぞれ10年ずつの平均をとってみます。

1900 1950 2009
1月 3.0 4.3 6.3
2月 3.4 5.0 7.0
3月 6.6 8.3 10.0
4月 12.4 13.8 15.1
5月 16.5 18.0 19.1
6月 20.1 21.0 22.7
7月 23.1 24.9 26.4
8月 24.8 26.3 27.4
9月 21.5 22.7 24.2
10月 15.9 16.9 18.8
11月 10.1 11.6 13.6
12月 5.3 6.8 8.7

これを見ると、100年前に比べると、どの月も約3度、気温が上昇しています。
一方、月別の変動はほとんど同じで、昔も今も最も寒いのは1月、最も暑いのは8月となります。

暦と比べると、大寒は合っていますが、大暑はずれています。もっとも、これは小学校で習ったとおりなのですが。
この程度ならば昔の暦がおかしいというのは言い過ぎかもしれません。

暦は太陽の動きから作られたもので、実際の気温を元にしてはいません。
夏至や冬至、春分や秋分は太陽の動きから割り出されているので、今も昔も変わりません。
しかし、その他の暦(二十四節気)は単純に等分したものなので、実際とずれるのは当然です。
例えば啓蟄(虫が穴から出てくる)や霜降(霜が降り始める)は昔と今では気温が違うのだから、ずれるでしょう。
啓蟄は3月ですが、100年前の3月の気温は現在の1月の最も寒い時期に相当します。

カテゴリー: 小ネタ タグ: , ,

Wordのマクロでインデントを操作する

2010 年 2 月 4 日 コメントはありません

次のコードはマイクロソフトWordのマクロ(VBA)で文書内のすべての段落のインデントを10ポイントにする例である。

Sub インデントテスト()
For i = 1 To ActiveDocument.Paragraphs.Count
a = ActiveDocument.Paragraphs(i)
ActiveDocument.Paragraphs(i).Range.Select
With Selection.ParagraphFormat
.LeftIndent = 10
.FirstLineIndent = 0
End With
Next i
End Sub

段落の数を数え、それぞれの段落についてインデントを設定する。
LeftIndentにポイント数を入れ、左インデントを設定する。
FirstLineIndentは最初の行の左インデントを設定するためのもので、字下げやぶら下げをしない場合は「0」とする。

字下げやぶら下げをする場合は段落ダイアログを使う場合と違う挙動をするので注意を要する。

字下げをする場合は
LeftIndent = 10
FirstLineIndent = 10
とする。この場合、段落全体のインデントは10ポイントで、最初の行のインデントは20ポイントになる。

□□日本国民は、正当に選挙された国会におけ
□る代表者を通じて行動し、われらとわれらの
□子孫のために、

ぶら下げをする場合は
LeftIndent = 10
FirstLineIndent = -10
とする。この場合、最初の行のインデントは0ポイントで、二行目以降のインデントは10ポイントとなる。
つまり「LeftIndent」は二行目以降のインデントを表し、「FirstLineIndent」は最初の行のインデントと二行目以降とのインデントの差を表す。ぶら下げをする場合は、最初の行を「字上げ」すると考えると分かりやすい。

日本国民は、正当に選挙された国会における代
□表者を通じて行動し、われらとわれらの子孫
□のために、

実は、これだけならば、特にマクロを使う必要はない。
コードの3行目の「a = ActiveDocument.Paragraphs(i)」の部分を使えば、文字列の内容を判断してインデントの処理を振り分ける、というような使い方ができる。
なお、ここでは、インデントを直にセットする方法を書いたが、スタイルを使う方法もある。

カテゴリー: デジタル タグ: , ,

Wordのマクロで段落を操作する

2010 年 2 月 4 日 コメントはありません

マイクロソフトのWordでは、段落は「改行マークの次から改行マークまで」を指します。これをマクロ(VBA)で取得する基本的な方法は次の通りです。
なお、対象は現在の文書です。

内容 コード
最初の段落 ActiveDocument.Paragraphs(1)
最初の段落の範囲 ActiveDocument.Paragraphs(1).Range
最初の段落の範囲の文字列 ActiveDocument.Paragraphs(1).Range.Text
最初の段落の範囲の最初の文字 ActiveDocument.Paragraphs(1).Range.Characters(1)
段落の数 ActiveDocument.Paragraphs.Count
カテゴリー: デジタル タグ: ,