2017年6月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

トップページ | 2007年4月 »

2007年3月31日 (土)

◆Outlook VBA(Outlookメール情報をExcel一覧化)

VBAの話題は久しぶりになりますが、今回はOutlook VBAについて書いてみます。

OutlookでVBAってちょっとマイナーな気がしますが皆さんはいかがでしょうか?ネット上でも話題は少ない気がします。Outlookと自動化はあまり関係が無いような感じです。自分自身でもあまりアイデアがありません。

とっかかりとして、こんなことが出来るのだというところで、選択したメールの情報をExcelの一覧にしてみます。メールの内容をExcelで管理できるようになるので何かと便利です。以下がその例です。

Sub 選択メールの情報をExcel一覧化( )
    Dim myOlApp As New Outlook.Application
    Dim myOlExp As Outlook.Explorer
    Dim myOlSel As Outlook.Selection
    Dim MsgTxt As String, a As String
    Dim Files As Variant, oF As Variant
    Dim myExlApp As Object, oNewWb As Object, oSel As Object
    Dim i As Integer, j As Integer
    Dim lSubject As String
    Dim lMsg As String
    Dim lSentOnBehalfOfName As String
    Dim lSenderName  As String
    Dim lReceivedByName  As String
    Dim lReceivedOnBehalfOfName   As String
    Dim lReplyRecipientNames  As String
    Dim lTo  As String
    Dim lCC  As String
    Dim lBCC  As String
    Dim lCreationTime  As String
    Dim lSize  As Long
    Dim lsenderemailaddress  As String
    Dim lTempFile  As String
      
    Set myOlApp = CreateObject("Outlook.Application")
    Set myOlExp = myOlApp.ActiveExplorer
    Set myOlSel = myOlExp.Selection
   
    '新規ブック作成
    Set myExlApp = CreateObject("excel.Application")
    Set oNewWb = myExlApp.workbooks.Add
    '一覧整形
    myExlApp.ActiveWindow.Zoom = 85
    With oNewWb.sheets(1)
        .Cells.WrapText = True
       
        .Range("A1:N1") = Array("件名", "本文", "添付ファイル", "受信日時", "サイズ", "送信者表示名", "送信者", "受信者表示名", "受信者", "", "TO", "CC", "BCC", "送信者Address")
        .Columns("A:A").ColumnWidth = 32
        .Columns("B:B").ColumnWidth = 40
        .Columns("D:D").ColumnWidth = 15.71
        .Columns("K:k").ColumnWidth = 15.71
        .Rows("2:2").Select
    End With
    myExlApp.ActiveWindow.FreezePanes = True
    With oNewWb.sheets(1)
        .Range("A1").Select
    End With
   
    i = 1
    '選択されているメールの添付ファイルを保存
    For Each oSel In myOlSel
       
        lSubject = oSel.Subject
        lMsg = oSel.Body
        lSentOnBehalfOfName = oSel.SentOnBehalfOfName
        lSenderName = oSel.SenderName
        lReceivedByName = oSel.ReceivedByName
        lReceivedOnBehalfOfName = oSel.ReceivedOnBehalfOfName
        lReplyRecipientNames = oSel.ReplyRecipientNames
        lTo = oSel.To
        lCC = oSel.CC
        lBCC = oSel.BCC
        lCreationTime = oSel.ReceivedTime
        lSize = oSel.Size
        lsenderemailaddress = oSel.senderemailaddress
      
        lTempFile = ""
        For Each oF In oSel.Attachments
            lTempFile = lTempFile & oF.DisplayName & Chr(10)
            j = j + 1
        Next
       
        i = i + 1
       
        oNewWb.sheets(1).Cells(i, 1).Value = lSubject
        oNewWb.sheets(1).Cells(i, 2).Value = lMsg
        oNewWb.sheets(1).Cells(i, 3).Value = lTempFile
        oNewWb.sheets(1).Cells(i, 4).Value = lCreationTime
        oNewWb.sheets(1).Cells(i, 5).Value = Format(Int(lSize / 1024), "##,###") & "KB"
        oNewWb.sheets(1).Cells(i, 6).Value = lSentOnBehalfOfName
        oNewWb.sheets(1).Cells(i, 7).Value = lSenderName
        oNewWb.sheets(1).Cells(i, 8).Value = lReceivedByName
        oNewWb.sheets(1).Cells(i, 9).Value = lReceivedOnBehalfOfName
        oNewWb.sheets(1).Cells(i, 10).Value = lReplyRecipientNames
        oNewWb.sheets(1).Cells(i, 11).Value = lTo
        oNewWb.sheets(1).Cells(i, 12).Value = lCC
        oNewWb.sheets(1).Cells(i, 13).Value = lBCC
        oNewWb.sheets(1).Cells(i, 14).Value = lsenderemailaddress
       
    Next

    myExlApp.Visible = True
   
p_Error:
    Set oF = Nothing
    Set oSel = Nothing
    Set myExlApp = Nothing
    Set oNewWb = Nothing
    Set myOlApp = Nothing
    Set myOlExp = Nothing
    Set myOlSel = Nothing
    MsgBox "終了しました。総数:" & i - 1
End Sub

では解説してみましょう。CreateObject("Outlook.Application")でOutlookオブジェクトを生成します。選択したメールをSet myOlSel = myOlExp.Selectionで取得します。

次にSet myExlApp = CreateObject("excel.Application")でExcelオブジェクトを生成します。For Each oSel In myOlSelで選択したメール1件ずつ繰り返し処理します。メールの情報は以下のものを取得しています。詳しくはVBAヘルプで確認してみてください。

    件名               oSel.Subject
    本文               oSel.Body
    受信日時         oSel.ReceivedTime
    サイズ               oSel.Size
    送信者表示名   oSel.SentOnBehalfOfName
    送信者            oSel.SenderName
    受信者表示名   oSel.ReceivedByName
    受信者            oSel.ReceivedOnBehalfOfName
    TO                  oSel.To
    CC                 oSel.CC
    BCC               oSel.BCC
    送信者Address oSel.senderemailaddress

ざっくりこれが処理の説明ですが、ここから重要です。

この処理を何処に書けばよいでしょうか。Excelとほぼ同じですが、メニュー「ツール」→「マクロ」→「Visual Basic Editor」→VbaProject.OTMに標準モジュールを追加して処理を記述します。しかし、Excelはブック毎にVBAProjectが存在しますが、OutlookではVbaProject.OTMが唯一のプロジェクトです。

これでメニュー「ツール」→「マクロ」→「マクロ」→「選択メールの情報をExcel一覧化」で実行できるわけですが、実際に実行するとOutlook VBAに慣れていない方は多少驚きと煩わしさを感じることでしょう(始めは私もそうでした)。それは、セキュリティの問題です。昨今のウィルスによるメール大量送付は大抵このVBAや親戚(?)のWSHによるものなので、VBAを実行するといちいち以下のような防御のメッセージが表示されます。「アクセスを許可する時間」で指定した時間内はかろうじてVBA処理が許可されるしくみです。最大10分まで選択できるので選択して「はい」で実行することができます。

Outlook

長くなりましたので今回はここまでとします。次回はOutlookのカスタマイズと配布方法について書いてみます。

※私が作成したVBAツールです。よかったら使ってみてください。

2007年3月29日 (木)

♪Piano

母親が長年の夢であるピアノを習い始めると宣言し突然アップライトピアノを購入した影響で、ピアノに触るようになった。

もともと高校時代にハードロックバンドのキーボードをやっていたこともあって、キーボードは持っていたので全くの素人よりは多少指は動くだろうと高をくくっていた。まして、これまた親のクラシック好きの影響で小さいころからクラシックコンサートに言っていたこともあり、ピアノ曲を耳にしていたので、自分も練習すればあんな風に美しく優雅に弾けるようになるかなぁと漠然と甘く考えていた節があった。

ところが、初めて弾いた(学校においてあったピアノは触ったことはあるが弾いてはいない)アップライトピアノは鍵盤が重い!指がつるっ!でも毎日さわっていくうちに指も動くようになってきて、何とかトリルも多少できるようになってきた。

1年ほど経ったあるとき、NHKの「スーパーピアノレッスン」を見て、グランドピアノの音色に心を奪われてしまった。艶やかでどこまでも伸びていくような響き。それからというもの、グランドピアノの購入に向けてネットでいろいろ調べてみた。グランドピアノといっても海外、国内、メーカーもいろいろ、同じ機種であっても固体それぞれの音色があると知った。やはり、実際に試弾して見なければと想い、カワイと島村楽器にいってみた。注目していたのはヤマハ,カワイ、ディアパソン、スタインウェイ、ボストンあたりで、実際に試弾してみた。

もともとカワイのアップライトだったのでまずはカワイの営業さんにグランドを試弾させてとお願いしていたので、前日気合をいれて調律しました!というピアノが弾けた。

今も販売しているか分からないが、その頃販売に力を入れていたRXシリーズのヨーロッパ仕様やボストンを弾いた。営業さんはRX-2GEUを勧められたが、弾いた感じはどうしても”スーパーピアノレッスン”の音とは程遠く購入意欲が湧かない(あちらはフルグランドなのであたりまえか)。ボストンの中古があったのだが、そちらのほうが多少くせはあったが甘~く艶のある音で余韻が長く続く好きな音だった。その日はそれでおしまい。

一つサイズアップしたRX-3GEUを弾きたかったが東京青山にあると聞いて、後日試弾しにいってきた。そこではRX-2GEU,3GEU、SK-2、SK-3を弾いてみた。RX-2GEUは最初に弾いたものよりも響きが良かった。フロアの音響のせいか。SKシリーズはなにか昔学校で聴いたピアノのようなとても懐かしい音がした。

さらに後日、島村楽器のピアノ専門店にいってみた。事前に連絡していたのですぐに試弾させてもらえた。機種は覚えていないがスタインウェイ、ベーゼンドルファ、ディアパソン、ヤマハを順々に弾いてみた。先入観からかもしれないがやはり、スタインウェイは別格と感じた(値段もだけど)。その中で、ディアパソンが素晴らしかった。他のピアノを弾いても興味が持てなくなる位一度弾いただけで魅了されてしまった。2台あって、たしかD-164とDR-300だったが、DR-300が特に気に入った。RX-3GEUに比べ鍵盤のレスポンスが多少鈍いかなと感じたが音がほんとうに魅力的だった。事前にもらっていたRX-3GEUの見積もりと比べ高いので泣く泣く諦めたが、あのときのすばらしい印象は今でも忘れられない。

値段と鍵盤が多少引っかかり、結局、RX-3GEUを購入した。購入して2年経つがだいぶ音も良くなってきたように思う。良くなったとは、始めは多少固めで、音域によって音の質が変わるような統一感がないように感じていたのだが、全体の音の鳴りというか響きが豊かになり、やわらかくなったように思う。天候によっても音色が変わることが感じられるし、天板の開き具合でも当然全く違う。普段は音の漏れや防塵から最小の開き(専門的になんと言うのかわからないが)にしている。

音色についてあれこれ書いたが、グランドピアノに触れて真っ先に感じたのは総じて鍵盤が軽いことだった。なんて弾きやすいのだろうと。音の強弱を指先でコントロールしたり、トリルやアルペジオのし易さなど自分が上達した錯覚を起こさせてくれる。カワイの営業曰く、鍵盤は昔に比べどんどん軽くなっているそうだ。プロがコンサートで演奏する曲数が増えているので演奏者の負担を考慮してのことだそうだ。

グランドピアノを本当に楽しむ最小のサイズは170ほしいとピアノの先生から伺ったことがある、子供や大人になってからピアノを始めようとするなら、設置可能な空間と予算と多少の防音があるのであればアップライトよりグランドから購入してしまうということも考えても良いと思う。

グランドピアノにしてからというもの、ピアノの音の響きに、曲を奏でる楽しさに益々魅せられている今日この頃である。

2007年3月24日 (土)

◆Excel VBA(Excel起動時に前回終了ウィンドウ状態を再現2)

今回はExcelをカスタマイズするシリーズの本当の最終回とします。

前回はちょっと前置きが長くなりましたが、要はExcelを起動したときに前回保存したウィンドウの状態を再現し、タスクバーに隠れないようにウィンドウを自動的に移動するということになります。前回書き忘れましたが、実はこのウィンドウ位置を自動調節してくれるフリーソフトは存在します(名前は忘れましたが)。以前私も使用していましたが、なぜか使用しなくなりました。わざわざソフトを常駐させておきメモリーを消費するのがいやになったからかもしれませんが理由は覚えていません。

さて、ここからが本題です。前回の処理の概略に沿って説明します。

    (1)自分好みに調節したExcelウィンドウの縦横サイズと表示座標を取得する

    (2)Excel終了時に(1)の情報を保存する(保存先はレジストリでも良いが手軽なiniファイルへの保存を採用することとする。WindowAPI関数が必要)

      この(1)、(2)の処理の例は以下の通り

        lngWindowHandle = FindWindow("XLMAIN", vbNullString)
       
        If lngWindowHandle = 0 Then Exit Sub
            
        With Application
            If .WindowState = xlMinimized Then
                .WindowState = xlNormal
            End If
            lrc = GetWindowRect(lngWindowHandle, lpRect)
            If lrc = 0 Then
                Exit Sub
            End If
        End With
       
        With lpRect
            lVal = _
                    gEt_Left & "=" & .Left & vbNullChar & _
                    gEt_Top & "=" & .top & vbNullChar & _
                    gEt_Right & "=" & .Right - .Left & vbNullChar & _
                    gEt_Bottom & "=" & .Bottom - .top & vbNullChar & vbNullChar
        End With
        Call WritePrivateProfileSection(gSc_ExcelWindowSize, lVal, "iniファイルパス")

       解説ですが、GetWindowRect関数で現在のウィンドウ位置を取得するのですが、ウィンドウハンドルを必要としますのでFindWindowで取得します。WritePrivateProfileSectionでiniファイルに書き込みをします。当然以下をモジュールの先頭に記述しておく必要があります。これらの処理をWorkbook_BeforeCloseから呼び出せばよい訳です。

       Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
           ByVal lpszClass As String, ByVal lpszWindow As String) As Long

        Private Declare Function GetWindowRect Lib "user32" _
            (ByVal hWnd As Long, _
            lpRect As RECT) As Long

       Public Declare Function WritePrivateProfileSection Lib "kernel32" _
             Alias "WritePrivateProfileSectionA" _
             (ByVal lpAppName As String, _
             ByVal lpString As String, _
             ByVal lpFileName As String) As Long

    (3)Excel起動時にiniファイルから情報を取得する

    (4)取得したウィンドウ位置などを設定する(当然これもWindowsAPI関数)

       (3)、(4)の処理については以下の通り。

        lngWindowHandle = FindWindow("XLMAIN", vbNullString)

        If lngWindowHandle = 0 Then Exit Sub
            
        rtn = m_GetSecIni(pIniNm, gSc_ExcelWindowSize, larr)
        If rtn = False Then Exit Sub
       
        For i = LBound(larr) To UBound(larr)
            Select Case larr(i)(0)
            Case gEt_Left
                lngMoveLeft = larr(i)(1)
            Case gEt_Top
                lngMoveTop = larr(i)(1)
            Case gEt_Right
                lngMoveRight = larr(i)(1)
            Case gEt_Bottom
                lngMoveBottom = larr(i)(1)
            End Select
        Next

        lngWin32apiResultCode = _
            MoveWindow(lngWindowHandle, _
                       lngMoveLeft, _
                       lngMoveTop, _
                       lngMoveRight, _
                       lngMoveBottom, _
                       True)

       Thisworkbookに記述したWorkbook_openから上記の処理を呼び出すことで実現できます。m_GetSecIniでは、GetPrivateProfileSection関数を呼んで、iniファイルの指定セクションに含まれるキーの値を一括取得しています(詳細は割愛します、ネット上にたくさん例がありますので)。iniファイルには以下の通り記述されていて、ExcelWindowSizeセクションの情報を一括取得するわけです。そして、MoveWindow関数で前回保存した値でExcelのウィンドウ位置を変更します。必要な宣言は以下の通り。

          [ExcelWindowSize]
            Left=50
            Top=0
            Right=973
            Bottom=767

        Private Declare Function MoveWindow Lib "user32.dll" _
               (ByVal hWnd As Long, _
                ByVal x As Long, _
                ByVal y As Long, _
                ByVal nWidth As Long, _
                ByVal nHeight As Long, _
                ByVal bRepaint As Long) As Long
       
        Public Declare Function GetPrivateProfileSection Lib "kernel32.dll" _
                Alias "GetPrivateProfileSectionA" _
                (ByVal lpAppName As String, ByVal lpReturnedString As String, _
                ByVal nSize As Long, ByVal lpFileName As String) As Long

いやぁ~長くなりましたが以上で実現できます。

これらの処理を記述したExcelブックをMS-OfficeがインストールされているフォルダにあるXLStartに格納しておけば、Excelを毎回起動する度に前回保存状態を再現してくれるようになります。Excelブックは非表示状態にしておくと邪魔にならず良いでしょう。お試しあれ。

さて、Excelのカスタマイズシリーズは一旦終了とします。また、ネタが見つかったら書き込んでみたいと思います。それでは。

※私が作成したVBAツールです。よかったら使ってみてください。

2007年3月23日 (金)

◆Excel VBA(Excel起動時に前回終了ウィンドウ状態を再現)

今回はExcelをカスタマイズするシリーズの第6弾(最終回)、Excel起動時に前回終了ウィンドウ状態を再現について述べたいと思います。

ちょっと話しが脱線しますが、私はWindowsXPを使用しているのですが、タスクバーを左側にして利用しています。もともとパソコンを使い始めたころから、Excelなどのソフトのメニューは上部にあるのにタスクバーが下にあるとマウスの移動が大きく面倒だなと不満を感じていたので上部にして使用していました。あるとき、同僚が左側にしているのを見たのをきっかけに左側にして使用するようになりました。初めは「え~変わった使い方だなぁ」と思ったのですが、よくよく自分の使い方を考えてみると、上部だとタスクバーの利用と、ソフトのメニューの利用ととても接近していて便利なのですが、ソフトの縦の情報がタスクバーの高さ分だけ減少してしまいます(ノートPCの利用が多いので上下の数行は貴重)。どちらかというと、上下よりも左右の情報(特に右側)は必要度が低いのでタスクバーを左側に持ってくれば上下の情報が少しでも稼げると感じました。タスクバー上のボタンも、ソフトのメニューも適度に近いし慣れると結構快適であると感じています。

ということで長々と書いてきましたがタスクバーを左側に置くと、最もよく使うExcelで1点弊害が出てきました。それは、Excelを起動すると必ず左端に開くということです。つまり、Excelの一部がタスクバーの裏に隠れてしまうのです。タスクバーの設定で、「常にほかのウィンドウの手前に表示する」というのがありますが、この設定にしてもダメです。Excelを最大化しておけば大丈夫なのですが、理由があって最大化したくないのです。

このように隠れてしまう弊害を解消するために、ウィンドウのサイズと表示位置を保存しておき、次回起動時にそれを再現するという機能をExcelに持たせればよいと考えました。

これを実現するためには以下のワザを駆使する必要があります。

    (1)自分好みに調節したExcelウィンドウの縦横サイズと表示座標を取得する(WindowsAPI関数を利用する必要有り)

    (2)Excel終了時に(1)の情報を保存する(保存先はレジストリでも良いが手軽なiniファイルへの保存を採用することとする。WindowAPI関数が必要)

    (3)Excel起動時にiniファイルから情報を取得する(これもWindowAP関数I)

    (4)取得したウィンドウ位置などを設定する(当然これもWindowsAPI関数)

以上が処理の概略です。

ちょっと前置きというか脱線というかVBAの説明に入る前の話しが長くなったので今回はここまでとします。次回が本当の最終回ということで。。。 それでは。

※私が作成したVBAツールです。よかったら使ってみてください。

2007年3月21日 (水)

◆Excel VBA(タイトルバーの動的な変更)

本日は第5弾として、タイトルバーの動的な変更です。

タイトルバーの変更自体は難しいことではありません。以下の命令で変更できます。flgによってタイトルバーの変更/戻しを実行する例です。

    If flg = False Then
        Application.Caption = ""                      ’タイトルバーの戻し
    Else
        Application.Caption = "ほげほげ"         ’タイトルバーの変更
    End If
   

しかし、わざわざ”動的”と謳っているのは意味があります。

皆さんはブックを開いたあとでこのブックはどこのフォルダから開いたファイルだったかなぁと思ったことはありませんか?

そこで、今アクティブにしているブックのパスをタイトルバーに表示することを考えました。

つまり複数ブックを開いて作業しているときに、アクティブにしたブックのパスを動的に表示するわけです。

これを実現するにはクラスモジュールを用意しなければなりません。

ちょっと高度ですが、なにも考えず以下の手順で作成してみてください。(5)はパスだけではなくファイルサイズも表示する例です。

(1)処理を記述するためのブックを新規作成する。

(2)VBEのVBAProject上で右クリックをし、「挿入」→「クラスモジュール」を選択する

(3)Thisworkbook に Dim Aw As New Class1 を記述する

(4)Thisworkbook に 以下のWorkbook_openを追加する

     Private Sub Workbook_open()
         Set Aw.App = Application
     End Sub

(5)(2)で作成したClass1に以下の処理を記述する

    Private Sub App_WindowActivate(ByVal wb As Excel.Workbook, ByVal Wn As Excel.Window)
        If wb.Path = "" Then
            Application.Caption = ""
        Else
            Application.Caption = "Microsoft Excel " & wb.FullName & " (" _
                        & Format(FileLen(wb.FullName), "###,##0") & "Byte" & ")"
        End If
    End Sub

(6)一旦新規ブックを保存し、Excelと新規ブック共に再起動するとあら不思議、複数ブックをアクティブにしていくとタイトルバーが動的に変化します。よね?変化すれば完成です。今回作成した新規ブックは非表示にしておくと良いでしょう。邪魔にならないので。

少し解説すると、(3)(4)はおまじないだと思ってください。深く知りたい方はVBAヘルプでまず「Application オブジェクトでイベントを使用する」を検索していろいろ読み進めていってください。ネット上にもたくさん解説ページがあります。

次に、処理本体の(5)ですが、App_WindowActivateというExcel標準のクラスイベントを定義しています。これはウィンドウがアクティブになった時に発生するExcelが予め持っているイベントです。ここに処理を書いておくことで今回の目的を実現しています。さらにwbはアクティブになったブックオブジェクトが渡されますので処理に利用しています。If wb.Path = "" Thenは、一度も保存されていないブックがアクティブにされたことを想定しています。つまり、保存されていないのでパスが取得できないわけです。

実はこのイベントだけでは、Excelで作業をしていく上でいろいろ不都合が発生します。例えば、書き換えたタイトルバーの初期化(=戻し)の問題です。ま、これは他にもクラスイベントがあるのでそれらを参考に作成してみてください。

以上でタイトルバーの動的変更についての説明はおしまいです。ちょっと難しかったですがクラスイベントは自分で作成することが出来て、Excelを拡張する手段として奥が深いので研究してみてはいかがでしょうか。

次回は、Excel起動時に前回終了ウィンドウ状態を再現について。

※私が作成したVBAツールです。よかったら使ってみてください。

2007年3月20日 (火)

◆Excel VBA(カスタムツールバー)

本日は第4弾として、カスタムツールバーの作成方法です。

カスタムツールバーとは自分で作成するツールバーのことです。

例えば、Excelには標準で”標準”や”書式設定”、”図形描画”

などがありますね。これらのツールバー以外に自分用に作成する

ことができます。

以下は、VBAから動的に作成する例です。

Set myBar = CommandBars.Add(Name:="ボタンの変更", Position:=msoBarTop, _
    Temporary:=True)
myBar.Visible = True

もちろんアイコンボタンに処理を割り当てて自分用のツールバー

を作成できるのですが、アイコンが登録済みのものしか利用できないので

私は次の別の方法を採用しています。

ツールバーの上で右クリックをし「ユーザ設定」

を選択すると、「新規作成」ボタンがありますがそれを実行すると

新しいツールバーを作成することができます。

次に、コマンドタブのマクロでユーザー設定ボタンをツールバーに

ドラッグ&ドロップすればボタンを追加することが出来ます。

次に、ボタンの上で右クリックしボタンイメージの編集で自由に

アイコンを変更できます。こうしてボタンを追加していけば

自分用のツールバーが出来上がります。

Toolbar_1

では、このツールバーをブックに割り当てるにはどうしたら

良いでしょうか?

先ほどの「ユーザー設定」画面にある「添付」をクリックし、

コピーすればツールバーをアクティブブックに登録すること

ができます。

さらに、そのブックのThisworkbookに以下の処理を追加します。

Private Sub Workbook_open()

    '自分自身ツールバー表示
    Application.CommandBars("ツールバー名").Visible = True
   

end sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error Resume Next

    'ツールバーを削除
    Application.CommandBars("ツールバー名").DELETE
End Sub

これでツールバーの表示・非表示の制御が完成です。

以上でツールバーの作成方法の説明はおしまいです。お試しください。

次回はちょっと高度な、動的なタイトルバーの変更について

※私が作成したVBAツールです。よかったら使ってみてください。

2007年3月18日 (日)

◆Excel VBA(シートタブメニューをカスタマイズ)

本日は第3弾として、シートタブメニューのカスタマイズ方法です。

シートタブメニューとは私が勝手に呼んでいるのですが、例えば

Sheet1のタブ上で右クリックした時に表示されるメニューです。

デフォルトでは”挿入”や”名前の変更”などがありますよね。

これをVBAマクロで変更することが出来ます。

Photo_1

例えば以下の通りです。

フラグによって、メニュー項目の追加と削除を行う例です。

右クリックメニュー変更の応用ですが、CommandBars("Ply")

CommandBarsのうち、"Ply"がExcelが内部管理している

シートタブメニューの名称です。詳細はVBAのヘルプをご覧ください。

        'キー割当て
        If pFlg Then
            Set Newb = Application.CommandBars("Ply").Controls.Add
            With Newb
                .Caption = "アクティブシートを非表示にする"
                .OnAction = "m_シート非表示"
                .FaceId = 2587
            End With
        Else
            For Each oCb In Application.CommandBars("Ply").Controls
                If oCb.Caption = "アクティブシートを非表示にする" Then
                    oCb.DELETE
                End If
            Next oCb
        End If

次回はカスタムツールバーについて。

※私が作成したVBAツールです。よかったら使ってみてください。

2007年3月17日 (土)

◆Excel VBA(ショートカットキーをカスタマイズ)

本日は第2弾として、ショートカットキーのカスタマイズ方法です。

ショートカットキーとは例えばCtrlキー+Sでブックの上書き保存

など、キーボード操作を便利にする機能ですね。

これをVBAマクロで変更することが出来ます。

例えば以下の通りです。

フラグによって、キー割り当てと割り当て解除を行う例です。

Ctrl+aで処理名を実行する例ですが詳細はVBAのヘルプをご覧ください。

        lOnKey = "^{a}"

        lMacro = "処理名"

        If pFlg = True Then
            Application.OnKey lOnKey, lMacro    'キー割り当て
        Else
            Application.OnKey lOnKey            'キー解除
        End If

次回はシートタブメニューについて。

※私が作成したVBAツールです。よかったら使ってみてください。

2007年3月15日 (木)

◆Excel VBA(右クリックメニューをカスタマイズ)

今日からExcelカスタマイズ特集をしてみよう。

本日は第1弾として、右クリックメニューのカスタマイズ方法です。

右クリックメニューとは任意のセル上でマウスの右クリックをした

時に表示されるメニューです。

これをVBAマクロで変更することが出来ます。

Photo

例えば以下の通りです。

フラグによって、メニューの追加と削除を行う例です。

いくつかポイントがありますが、まず、

"Cell", "Column", "Row"はExcelが内部管理している

メニューの種類です。セル上のメニュー、列選択したときのメニュー

、行選択したときのメニューということです。

次に、Controls.Add(type:=msoControlButtonですが、ボタン形式

のメニューということです。さらに、そのアイコンはFaceIdの番号

で指定します。詳細はVBAのヘルプをご覧ください。

For Each oCb In Application.CommandBars
      Select Case oCb.Name
      Case "Cell", "Column", "Row"
            With oCb
                    If pFlg = True Then
                        'キー割当て
                        With .Controls.Add(type:=msoControlButton, id:=266, Temporary:=True)
                            .Caption = "処理名(メニュー名)"
                            .OnAction = "m_処理"
                            .BeginGroup = True
                            .FaceId = 496
                        End With
                    Else
                        'キー割当て解除
                        For Each oCc In .Controls
                            If oCc.Caption = "処理名(メニュー名)" Then
                                oCc.DELETE
                            End If
                        Next
                    End If
           End With
      End Select
Next oCb

次回はショートカットキーについて。

※私が作成したVBAツールです。よかったら使ってみてください。

2007年3月13日 (火)

◆ネット自動ログインツール

最近ではますますインターネットサービスが充実してきていますね。でもそういったサービスにはユーザIDやパスワードがつき物です。いろいろなサービスを利用しているといちいちユーザID/パスワードを入力するのが面倒です(私だけ?)。また、たまに利用するとユーザIDやパスワードを忘れてしまったりしませんか?金融機関などは決してパスワードは教えてくれませんので再度パスワード変更などの手続きが発生してしまいます。

そこでExcel VBAを駆使して、サイトの自動ログインツールを作成しました!

以下のようなことをインターネットで実施している方にはとても便利だと思います。

    ・銀行などのインターネットサービス、ダイレクトサービスによる残高照会など

    ・証券会社などのインターネット取引

    ・ブログなど自分のページへのログイン

    ・懸賞応募やネットオークション

    ・プロバイダーや各種企業へのユーザ登録やその変更

巷ではいろいろな自動ログインツールがあるようですが、煩わしいインストール作業があったり、OSが変わったら動作しなくなったり、登録したユーザID/パスワードを一覧表示できなかったり、会社のパソコンには余計なソフトはインストールできなかったり(そんなの当たり前といわれそうですが)といろいろ弊害がありますね。

でも当ツールは、とても身近であるExcelとネット接続できる環境であればどこでも利用でき、複数のログインID/パスワードを表形式で一元管理することができます。さらに、多少HTMLの知識がある方であれば、自分でカスタマイズすることができます。サンプルを掲載するので、気に入って頂けたら是非ご購入をお願いします。

☆サンプル:sample.xlsの画像

    「sample.EXE」をダウンロード

    右クリックの「対象をファイルに保存」でダウンロードしてください。ダウンロード後、ファイルをダブルクリックすれば自動解凍してExcelファイルが出来ます。

 

2007年3月11日 (日)

◆Excel VBA(ファイル起動と同時にマクロを実行)

ブログデビューしました。

何をはじめに書こうかちょっと悩みましたがすぐに決まりました。

ブログを始める理由はこれだからです。

つまりVBAの裏ワザなどネットで仕入れ&応用したものを公開した

マイページを補完することです。

マイページは追々公開していこうと思います。

でも1発目のネタは悩みますね、記念すべき最初のネタですからね。

うむむ。。。

無難なところで、ファイルを開いたと同時にVBAを実行する方法にしよう。

以下を実装すればOKです。お試しあれ。

●Excelの場合

Sub Workbook_open()をVBAProjectのThisworkbookに作成すればよい。

●Outlookの場合

Sub Application_Startup()をVBAProject.OTMのThisOutlookSessionに作成すればよい。

※私が作成したVBAツールです。よかったら使ってみてください。

トップページ | 2007年4月 »