シリアル値
エクセルで経過日数を求めるには日付同士を単純に引き算すれば求められます。
エクセルではシリアル値という値を使って日付を管理しているからです。シリアル値は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
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
次のコードはマイクロソフト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では、段落は「改行マークの次から改行マークまで」を指します。これをマクロ(VBA)で取得する基本的な方法は次の通りです。
なお、対象は現在の文書です。
| 内容 |
コード |
| 最初の段落 |
ActiveDocument.Paragraphs(1) |
| 最初の段落の範囲 |
ActiveDocument.Paragraphs(1).Range |
| 最初の段落の範囲の文字列 |
ActiveDocument.Paragraphs(1).Range.Text |
| 最初の段落の範囲の最初の文字 |
ActiveDocument.Paragraphs(1).Range.Characters(1) |
| 段落の数 |
ActiveDocument.Paragraphs.Count |
普通、Excelのマクロは、ボタンを押したり、メニューから選択したときに実行されます。
ワークシートが変わったときに自動的にマクロを実行するようにすることもできます。
その方法は次の通りです。
- 開発-VisualBasicを開く。
- プロジェクトエクスプローラ(左側)で、該当のシートをダブルクリック。
- コード(右側)のオブジェクト(「(General)」となっている)から「Worksheet」を選択。
- プロシージャ(「(Declarations)」となっている)から「Change」を選択。
- コードを書く。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row = 3 And Target.Column = 8 Then
Call プロシージャ
End If
End Sub
このように書くと3行目8列目のセルが変わったときに指定したプロシージャが動作します。
もしIfを使わないとそのシートのどこかのセルが変わったときに動作します。何かをやる度にプロシージャが動作してしまうので意図しない動きをするかもしれません。
Excelで日付や時刻の表示形式を整えるワークシート関数に「TEXT」があります。これに対応するのが、VBAでは「Format」。
「Format」の方が指定できる書式が多いです。
VBAの「Format」にあってワークシート関数の「TEXT」にない書式は次の通り。
| 文字 |
内容 |
| c |
ddddd および t t t t t の書式で表した日付と時刻を、日付、時刻の順序で返します。指定された値に小数部がない場合は日付のみ、整数部がない場合は時刻のみを表す文字列を返します。 |
| w |
曜日を表す数値を返します (日曜日が 1、土曜日が 7 となります)。 |
| ww |
その日が一年のうちで何週目に当たるかを表す数値を返します (1 ~ 54)。 |
| oooo |
月の名前を日本語で返します (1 月 ~ 12 月)。 |
| q |
1 年のうちで何番目の四半期に当たるかを表す数値を返します (1 ~ 4)。 |
| n |
分を返します。1 桁の場合、先頭に 0 が付きません (0 ~ 59)。 |
| nn |
分を返します。1 桁の場合、先頭に 0 が付きます (00 ~ 59)。 |
| t t t t t |
コントロール パネルで設定されている形式で時刻を返します。先頭に 0 を付けるオプションが選択されていて、時刻が午前または午後 10 時以前の場合、先頭に 0 が付きます。既定の形式は、h:mm:ss です。 |
Excel(2007)のVBAには「Format」という関数があり、数値や日付形式などを整形してくれます。
Format(値,表示書式指定文字)
表示書式指定文字に例えば「yyyy」を指定すると西暦の年を表します。
変わったものとしては次の三つ。
「y」 1 年のうちで何日目に当たるかを数値で返します (1 ~ 366)。
普通の感覚だと西暦の年を表すように思いますが、その場合は「yyyy」になります。
「q」 1 年のうちで何番目の四半期に当たるかを表す数値を返します (1 ~ 4)。
1月から3月は「1」、4月から6月は「2」となります。わざわざ関数にすることかと思いますが、使う人がいるのでしょう。
「ww」 その日が一年のうちで何週目に当たるかを表す数値を返します (1 ~ 54)。
これが奇妙な動きをします。
2009年の場合は1月1日(木)から3日(土)は「1」となります。1月8日(日)から14日(土)は「2」となります。
日曜日から始まるカレンダーの何段目に来るか、という数え方なのです。
普通の感覚だと1日から7日は「1」となりそうですが違います。
このあたりを使う場合には十分な検証が必要かもしれません。
文章を書くときには書き始めを1文字分下げるのですが、これがなかなか面倒。
マイクロソフトのWordならば「字下げ」を使えばよいのですが一つ問題があります。
括弧(「)で始まるときは下げないのです。角川文庫だけは下げるみたいですが。
このように通常は1文字下げるけれども括弧のときは下げないようにするためのワードマクロです。 続きを読む…
Twitterの日付形式をExcelのシリアル値に変換する、VBAのコードです。
Function twitter_dateserial(td)
‘Twitterの日付形式をExcelのシリアル値に変換する。
‘変換前「Tue Jul 21 03:23:04 +0000 2009」
ds = Split(td, ” “)hs = Split(ds(3), “:”)
mstr = (InStr(“JanFebMarAprMayJunJulAugSepOctNovDec”, ds(1)) + 2) / 3
twitter_dateserial = DateSerial(ds(5), mstr, ds(2)) + TimeSerial(hs(0) + 9, hs(1), hs(2))
End Function
ウェブからコピーして、Wordにテキストとして貼り付ける場面は多いと思います。
Word2007では
ホーム-貼り付け-形式を選択して貼り付け
を選べばよいのですが、頻繁に使う場合には面倒です。
そこで、キーボードショートカットを設定してみます。
Word2007の場合を想定しています。
「テキストとして貼り付け」マクロを作る
- Wordを開いた状態でAlt+F11を押すなどしてマクロの編集画面(VisualBasicEditor)を出す。
- 「Normal」の標準モジュールに次のようなコードを書き込む。
Sub テキストとして貼り付け()
Selection.PasteSpecial DataType:=wdPasteText
End Sub
キーボードショートカットを設定する
- Wordを開く。
- Officeボタン-Wordのオプション-ユーザー設定を開く。
- ショートカットキーの「ユーザー設定」ボタンをクリック。
- コマンドの指定-分類で「マクロ」を選択。
- 右側にマクロが表示されるので「テキストとして貼り付け」を選択。
- 「割り当てるキーを押してください」にカーソルを移動し、割り当てたいキーを押す。例えば「Ctrl+T」を押す。
- 「割り当て」ボタンをクリック。
次からはCtrl+Tを押すだけで、テキストとして貼り付けが実行されます。
最近のコメント