« 2010年3月 | トップページ | 2010年5月 »

2010年4月

2010年4月15日 (木)

HTMLファイルを生成

記事「HTMLファイルの目次を作る 」では
生成したHTMLのソースをイミディエイトウィンドウに出力して
それをメモ帳にコピペして
HTML形式で保存したのですが
今回はファイルの保存までVBAでします。

HTML形式で保存といっても
単に拡張子を「.html」にするだけなので
実際にはテキストファイルを作って
そのファイルの拡張子を「.html」にしただけです。

テキストファイルを作るには
CreateTextFileメソッドを使います。
詳細はVBAのヘルプにあります。

上記記事中のmacro100331aで
変数MyHTMLに入れたHTMLのソースを
テキストファイルを作って書き込んで
名前を付けて保存します。

コードはこちら

HTML形式の目次のHTMLファイルを作るコー ド:

Sub macro100415a()
'macro100330aの改造版
'指定したフォルダ内の
'HTMLファイルの目次を作って
'HTMLファイルを自動生成
    Dim MyPath As String, MyFile As String
    Dim MyHTML As String
    Dim i As Integer
    MyHTML = "<HTML><BODY>" & Chr(10)
   
    'フォルダを指定する
    MyPath = "C:\"
   
    'ファイルの有無を確認
    With Application.FileSearch
        .LookIn = MyPath
        'ファイル名検索
        .Filename = "*.htm*"
        If .Execute() > 0 Then
            MsgBox .FoundFiles.count & _
                " 個のファイルが見つかりました。"
            For i = 1 To .FoundFiles.count
                MyHTML = MyHTML & "<A href = " & Chr(34) _
                    & Dir(.FoundFiles(i)) & Chr(34) & ">" _
                    & Dir(.FoundFiles(i)) & "</A><BR/>" & Chr(10)
               
            Next i
        Else
            MsgBox "検索条件を満たすファイルはありません。"
        End If
    End With
    MyHTML = MyHTML & "</BODY></HTML>"
   
    'HTML形式のファイルを生成
    Dim fs As Object, a As Object
   
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set a = fs.CreateTextFile("c:\index.html", True)
    a.WriteLine (MyHTML)
    a.Close
   
End Sub

同名のファイルが存在する場合、
上書き保存されるようなのでご注意を。

HTMLファイルを自動生成できるようになったので
もっとなんかできそうな気がします。

| | コメント (0) | トラックバック (0)

2010年4月10日 (土)

簡易メール送信

VBAでメールを送信するには
Outlookを操作してって…
めんどくさいです。

別に長文を送りたいわけではなく、
ただ単に外為をモニタしてるパソコンから
タイミングを知らせるだけのメールでいい場合は
こんなんでいかがでしょうか?

手順は、まずExcelのシートにメールアドレスのリンクを作ります。
それを使ってメールを送ります。

簡易メールなので
メールのタイトルで内容をお知らせして、
本文はなしです。
Sendkeysを使いますので
メールのウィンドウが立ち上がったら
触らないようにしてください。

逆に言えば、ウィンドウが立ち上がっても
違うウィンドウを最前面に出してしまえば
メール送信を妨害できます。

まずは、メールのリンクを作るコードです。

メールのリンクを作るコード:

Sub macro100410a()
'メールリンクを作成する

    'メール用シートの追加
    Call SheetAddDel("mail")
   
    '選択したセルにメールリンクを作成する
    ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:= _
        "mailto:メールアドレス", TextToDisplay:="メール送信"
       
    '見た目の設定
    With Selection.Font
        .Size = 12
        .Underline = xlUnderlineStyleSingle
        .ColorIndex = 5
    End With
End Sub

実行結果:
Vba20100410a

そして、これを使って送信するコードはこちら

簡易メールを送信するコード:

Sub macro100410b()
'macro100410aで作ったメールのリンクで
'メールを送信する

    With Sheets("mail").Range("A1").Hyperlinks(1)
        'メールの題名を設定
        .EmailSubject = "メールの題名"
       
        'リンクをクリックするのと同等
        .Follow NewWindow:=False, AddHistory:=True
            
        'メールのウィンドウが立ち上がったか確認できない(?)ので
        'とりあえず5秒待って送信
        '送信のショートカットキーが{Alt} + S
        Application.Wait Time:=Now + TimeValue("00:00:05")
        SendKeys "%{s}", True
       
    End With
End Sub

上のコードを実行すると
下のようなウィンドウが立ち上がって
メールを送信します。
Vba20100410b

SendKeyはアクティブなウィンドウに有効ですので、
メールのウィンドウが立ち上がっても
SendKeysで[ファイル]メニューの[メールを送信する]のショートカットキー
Alt + s を送る前に
違うウィンドウをアクティブにすると
そのウィンドウにAlt+sが送られてしまいます。

| | コメント (2) | トラックバック (0)

2010年4月 9日 (金)

MsgBoxの使い方とビジュアル一覧

ただメッセージを示すだけの場合

MsgBox使い方1:

Sub macro100408a()
'MsgBox使い方1
    MsgBox "ここにメッセージを入れる"
End Sub

実行結果:
Vba20100408a

MsgBoxでユーザーから入力を受け取る場合は
Integer型の変数に代入します。

MsgBox使い方2:

Sub macro100408b()
'MsgBox使い方2
    Dim MyValue As Integer
    MyValue = MsgBox("ここにメッセージを入れる", vbYesNo)
    Debug.Print MyValue
End Sub

実行結果:
Vba20100408b

[はい]を押すとMyValue = 6
[いいえ]を押すとMyValue = 7
になります。

上のMsgBoxは「はい」と「いいえ」の2つのボタンがあるものでしたが、
MsgBoxのボタンの組み合わせは6種類あります。
以下一覧

Vba20100408c

それぞれのボタンが返す値:

[OK] 1
[キャンセル] 2
[中止] 3
[再試行] 4
[無視] 5
[はい] 6
[いいえ] 7

アイコンの種類は、
警告、問い合わせ、注意、情報の4種類です。

Vba20100408d

ボタンとアイコンを組み合わせて使う時は
2つの値を足します。

例えば、
「vbOKCancel」と「vbInformation」を組み合わせて使う場合は
vbOKCancel + vbInformation
とします。

MsgBox使い方3:

Sub macro100408c()
'MsgBox使い方3
    Dim MyValue As Integer
    MyValue = MsgBox("「vbOKCancel」と「vbInformation」を組み合わせ", _
        vbOKCancel + vbInformation)

End Sub

実行結果:
Vba20100408e

MsgBoxの詳細はVBAヘルプの
「MsgBox 関数」の頁にあります。

| | コメント (0) | トラックバック (0)

2010年4月 7日 (水)

ゆる~いリアルタイム為替レートのリソース

Excelでインターネットの情報を取り込むには
Webクエリが簡単ですが、
最近のWebページは
FlashとかJavaとJavaScriptとか使ってあって
WebクエリではExcelに取り込めなくなりつつあるように感じます。

3月の終わりごろまで
外為ドットコムのサイトで
HTML形式でのリアルタイム為替レートがあったので、
そこからWebクエリで1分間隔で更新する
ゆる~いリアルタイム為替レートをエクセルのシートに作って
使ってました。

で、3月の終わりごろにサイトの大幅な変更があり、
Flashを多用したゴテゴテしたサイトになってしまったのです。

「リアルタイム為替レート」で検索して
使えるそうなサイトを探したのですが…
HTML形式で、
自動更新で、
Webクエリで取り込めるサイトはなく
困っていました。

FlashとJavaのリアルタイム為替レートは取り込めないなと
最初から諦めましたが、
JavaScriptで自動更新しているリアルタイム為替レートは
Internet ExplorerをVBAで操作すれば
取り込めるんじゃないかと思ってやってみたところ…

できました~

VBAでInternet Explorerを操作する方法は
他のサイトから学んだので載せません。
「VBA Internet Explorer 操作」等で検索して探してください。

JavaScriptで自動更新しているリアルタイム為替レートは、
DMM.comのヤツがシンプルで使いやすいです。

ちなみに一番上にあるGoogle検索は、
「検索」ボタンで、Web全体を検索します。
「サイト内検索」は、そのままサイト内検索、
「クリア」はテキストボックスの中の文字を消去します。

| | コメント (0) | トラックバック (0)

2010年4月 6日 (火)

ファイル保存時に自動でコピーを作って保存

手動でエクセルのブックを保存する時に
自動でコピーを作って保存します。

何のためにコピーを作るかというと
バックアップの為です。

VBAを使っていると予期せぬ時に
Excelが強制終了してしまうことがしばしばあります。
しかも、そのファイルを開こうとすると
すぐに強制終了して開けなくなることもあります。

あと、マクロを改良していて
前の方がよかったなんて時のために、
保存のたびにその状態のファイルのコピーを残しておきます。

今のパソコンはハードディスクの容量が大きくなったので
Excelのファイルが多少余分にあっても
大した量ではないのでこまめに保存しても問題ないと思います。

消すのはいつでもできます。

方法は、WorkbookのイベントBeforeSaveを使って
ブックを保存する時に、同時にコピーも保存します。

まず、ファイルを名前を付けて保存します。
ここでは、ファイル名を「Book.xls」にします。

「Book.xls」自体は上書き保存する時のファイル名は、常に「Book.xls」です。
コピーのファイルは保存時の日時を付加して名前を付けます。

保存時が2010年4月6日の21:30:21なら
コピーのファイル名を「Book20100406_213021.xls」になるようにします。

WorkBookのイベントを使う具体的な説明をします。
VBEのプロジェクトウィンドウの「ThisWorkbook」のところを
ダブルクリックしてワークブックのモジュールを表示させます。
Vba20100406a

次に「(General)」のところを「WorkBook」を選択します。
Vba20100406b

その隣「(Declarations)」のところを「BeforeSave」にします。
Vba20100406c

以上の操作でこのようになります。
Vba20100406d_2

上の画像の「Private Sub Workbook_BeforeSave…」から
「End Sub」の間にファイルを保存する前に実行するコードを書きます。

コードはこちら

自動でコピーを作って保存するコード:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim wb As String
    '基本の名前をActiveWorkbookの拡張子を除いたものにする
    wb = Replace(ActiveWorkbook.Name, ".xls", "")
    'コピーを保存
    ActiveWorkbook.SaveCopyAs _
        ActiveWorkbook.Path & "\" & wb & _
        Format(Now(), "yyyymmdd_hhmmss") & ".xls"
End Sub

保存するとこのように日時を付加した名前のファイルも保存されます。

Vba20100406e

| | コメント (0) | トラックバック (0)

2010年4月 2日 (金)

文字コードを調べる

Chr関数などで使う文字コードは

VBAのヘルプの[質問]タブを開いて
「ASCII」で検索すると、検索結果に

ASCII 文字セット (0 - 127)
ASCII 文字セット (128 - 255)

の頁があるのでこの頁で調べます。

また、文字コードをInteger型で返すAsc関数を使って
任意の文字の文字コードを取得できます。

使用例:
Asc("A") = 65
Asc("ABC") = 65

Asc関数は1文字目の文字コードのみ返しますので、
指定する文字列が"A"でも、"ABC"でも同じ値を返します。

コードはこちら

Asc関数を使って文字コードを得るコード:

Sub macro100402a()
'Chr関数などで使う文字コードを調べる
'イミディエイトウィンドウに表示する

    Debug.Print Asc("あ")

End Sub

実行後のイミディエイトウィンドウの一例

Vba20100402a

Asc関数を使うとVBAのヘルプにも載っていない
漢字とかの文字コードも得られるようです。

| | コメント (0) | トラックバック (0)

« 2010年3月 | トップページ | 2010年5月 »