項目
内容説明
Excelの図形描画での最小単位は0.75ポイント(0.2646mm)です。従ってExcelでは精密な図形描画は出来ません。
mmを0.75ポイントの倍数に変換するMM2PT関数を示します。
'mmを描画単位0.75ptの倍数に変換 Function MM2PT(mm) MM2PT = Int(72 / 25.4 * mm / 0.75 + 0.5) * 0.75 End Function一般的に、指定値の倍数になるよう数値を丸めるMROUND2関数は次のようになります。
'MROUND2(数値, 倍数) '数値 丸める数値を指定します '倍数 倍数数値を指定します Function MROUND2(vv,bb) MROUND2 = Int(vv / bb + 0.5) * bb End Function追記)長さ変換のメソッド
InchesToPoints メソッド
インチ単位の数値をポイント単位に変換します。
項目
内容説明
'■ヘルプを起動する関数例 Sub test_Help1() 'Excelフォルダのxxx.hlpのヘルプトピックHelpContextID=2を起動 Application.Help Application.Path & "\xxx.hlp", 2 End Sub Sub test_Help2() 'ThisWorkbookフォルダのxxx.chmを起動 Application.Help ThisWorkbook.Path & "\xxx.chm" End Sub
'■ヘルプトピックの設定例 Sub testHelpTopicAdd() testHelpTopicDel With Application.CommandBars.Add(Name:="testHelpTopic", Temporary:=True) .Visible = True With .Controls.Add(Type:=msoControlButton) .Caption = "Aaa" .FaceId = 266 .OnAction = "aaa" .HelpFile = "c:\ddd\eee\fff.hlp" .HelpContextID = 3 End With End With End Sub Sub testHelpTopicDel() On Error Resume Next Application.CommandBars("testHelpTopic").Delete End Sub
VBEの[ツール]-[VBAProjectのプロパティ]を開き [ヘルプファイル名] に使用するヘルプを設定 ユーザーフォームのプロパティで次の2つを設定 HelpContextID プロパティ ヘルプトピックのコンテキストID(正の整数値)を指定 WhatsThisHelp プロパティ Trueを指定 '■マクロで[VBAProjectのプロパティ]の[ヘルプファイル名]の設定例 ThisWorkbook.VBProject.HelpFile = ThisWorkbook.Path & "\xxx.chm" 注)VBIDEインターフェイスを使用するため[セキュリティ]-[信頼のおけるソース元]のチェックが必要。
'■マクロでMacroOptionsメソッドでの設定例 Application.MacroOptions Macro:="proc", _ Description:="arg1:引数1の説明" & vbCrLf & "arg2:引数2の説明", _ HelpContextID:=1, HelpFile:="c:\ddd\eee\fff.chm"
MsgBox(prompt[,buttons][,title][,helpfile,context]) InputBox(prompt[,title][,default][,xpos][,ypos][,helpfile,context]) helpfile :ヘルプファイルの名前 context :ヘルプトピックに指定するコンテキストID
項目
内容説明
Sub test1_E97M038() 'Excelを最小化してユーザーフォームのみ表示するサンプル Application.WindowState = xlMinimized 'Excelウィンドウを最小化 'ウィンドウを最小化すると他にフォーカスが移るのでAppActivateで戻す AppActivate Application.Caption 'Excelをアクティブにします UserForm1.Show 'ユーザーフォームの表示 'DialogSheets("Dialog1").Show 'ダイアログの表示 'Application.WindowState = xlNormal 'Excelウィンドウを元に戻す End Sub次ぎの例はVisibleプロパティを用いてオブジェクト(この場合Excel)を非表示にします。
Sub test2_E97M038() 'Excelを非表示にする例 Application.Visible = False '非表示 'UserForm1.Show 'ユーザーフォームの表示 MsgBox "Excelを非表示にしました." & vbCrLf & _ "タスクバーにも表示されていません." & vbCrLf & _ "[OK]ボタンをクリックすると元に戻ります." Application.Visible = True '表示 End Sub何よりも先にユーザーフォームを表示する方法
Private Sub Workbook_Open() Application.Visible = False '非表示 UserForm1.Show End Sub次に、Excelアプリケ−ション(xls,xla)の[ショートカット]を作り、[ショートカット]の[プロパティ]で[実行時の大きさ]を[最小化]に設定しておきます。
項目
内容説明
[Esc]キーによる強制終了を出来ないようにマクロを記述するにはEnableCancelKeyプロパティにxlDisabledを設定します。
このプロパティは慎重に扱って下さい。無限ループのような自分で停止しないプロシージャを止めることが出来なくなります。
次の1行をプロシージャに記述します。
Application.EnableCancelKey = xlDisabled '強制終了を無視します[Esc]キーによる強制終了を有効にするには次の様にxlInterruptを設定します。 なお、プロシージャが終了するとEnableCancelKeyプロパティは常にxlInterruptに戻されます。
Application.EnableCancelKey = xlInterrupt[Esc]キーが押されて強制終了した時に何らかの後処理が必要な場合は、EnableCancelKeyプロパティにxlErrorHandlerを設定しエラートラップを行います。
Sub test_E97043() 'Escキーが押された場合のエラートラップ例 Dim ii&, jj& On Error GoTo HandleErr Application.EnableCancelKey = xlErrorHandler MsgBox "この処理には時間がかかります。強制終了は[Esc]キーを押してください" Application.DisplayStatusBar = True For ii = 1 To 1000 Application.StatusBar = "実行中です。 " & ii & "/1000" For jj = 1 To 500000 ' Next Next Application.StatusBar = False Exit Sub HandleErr: If Err = 18 Then 'ESCが押された MsgBox "強制終了しました" Else MsgBox "エラー:" & Err & vbCrLf & Error End If Application.StatusBar = False End Sub
項目
内容説明
使い方は、セル範囲を選択しkSameOn関数を実行します。
選択範囲は複数でもOKです。
元に戻すには、[書式]-[セル]-[表示形式]を変更します。又、セルの値を変更した場合にも自動的には反映されませんので再度関数を実行します。
'上のセルと値が同じなら〃と表示する関数 '範囲を選択して関数を実行します '表示形式を変えているだけなのでセル値は変わらない Sub kSameOn() Dim sc As Range For Each sc In Selection.Cells If sc.NumberFormat = """〃"";""〃"";""〃"";""〃""" Then sc.NumberFormat = "G/標準" If sc.Row > 1 And sc <> "" Then If sc = sc.Offset(-1, 0) Then sc.NumberFormat = """〃"";""〃"";""〃"";""〃""" End If End If Next End Sub
項目
内容説明
'OnEntry等でプロシージャを指定する際に引数を渡す方法 'プロシージャ名と引数をシングル クォーテーションで囲んだ文字列で指定 '文字列の作成 "'プロシージャ名 引数1'" '引数が文字列の場合は引数をダブルクウォーテーションで囲む Sub test_E97039() Dim aa, bb, prc$ aa = "abc" bb = 123 'prc = "'prc0 """ & aa & """'" '文字変数の指定 'prc = "'prc0 " & bb & "'" '数値変数の指定 'prc = "'prc0 ""abc""'" '文字列の指定 'prc = "'prc0 123'" '数値の指定 'prc = "'prc0 ""abc"",123'" '文字変数と数値変数の指定 prc = "'prc0 """ & aa & """," & bb & "'" '文字列と数値の指定 MsgBox prc Worksheets(1).OnEntry = prc End Sub Sub prc0(aa, Optional bb) MsgBox aa If Not IsMissing(bb) Then MsgBox bb End Sub
項目
内容説明
'省略可能な引数を受け取るプロシージャの記述例 Sub test1_E97038() Dim p1, p2 a_E97038o "aaa" a_E97038o 111, "aaa" a_E97038o "aaa", "bbb", 999 End Sub Sub test2_E97038(aa, Optional o1, Optional o2) If IsMissing(o1) Then o1 = 1 If IsMissing(o2) Then o2 = 1 MsgBox aa & " " & o1 & " " & o2, , "パラメータ" End Sub参照:E95M002任意の数の引数を受け取るプロシージャの記述
項目
内容説明
条件により異なるコ−ドを実行する(条件判断構造)
If...Then...Else ステートメントの構文
式の値に基づいて、条件付きの実行を行うフロー制御ステートメントです。
If condition Then [statements][Else elsestatements]
または 次に示すブロック形式の構文を使用することもできます。
If condition Then
Select Case ステートメントの構文
条件式の値に従って、複数のステートメント ブロックのいずれかを実行させるフロー制御ステートメントです。
Select Case testexpression
同じコ−ドの反復実行(ル−プ)
Do...Loop ステートメントの構文
指定した条件が真 (True) である間、または条件が真 (True) になるまで、一連のステートメントを繰り返し実行するフロー制御ステートメントです。
Do [{While | Until} condition]
For...Next ステートメントの構文
指定した回数だけ、一連のステートメントを繰り返すフロー制御ステートメントです。
For counter = start To end [Step step]
For Each...Next ステートメントの構文
配列やコレクションの各要素に対して、一連のステートメントを繰り返し実行するフロー制御ステートメントです。
For Each element In group
項目
内容説明
Option Explicit '変数の明示的な宣言を強制する
Sub プロシージャの構文
[Private | Public] [Static] Sub name [(arglist)]
項目
内容説明
ダイアログを表示するShowメソッドに代えてkDlgScroll関数を用いて下さい。
ダイアログでの操作中に、アクセスキー([Alt]+[S]キー)を押すとスクロールが可能となります。ダイアログのコントロールにフォーカスを戻すとスクロール不可となります。
処理過程でダイアログの枠外に [エディットボックス]と[コマンドボックス]を作成し機能を実現しています。
また、[OK]ボタンへ[マクロの登録]をしているので既に他のマクロを登録してある場合は一部修正が必要です。
'ダイアログの表示中にワークシートのスクロールや切り替えを行うkDlgScroll関数 'ダイアログを表示するShowメソッドに代えてkDlgScroll関数を用いて下さい。 '引数 dlg:表示するダイアログ名 ' ac :アクセスキー。省略可、省略値は"S" ' [Alt]+[S]キーを押すとスクロールが可能となる。 ' コントロールにフォーカスを戻すとスクロール不可となる。 Sub kDlgScroll(dlg, Optional ac$ = "s") Dim ds As Object Set ds = ThisWorkbook.DialogSheets(dlg) On Error Resume Next ds.EditBoxes("kDlgS_E").InputType = xlReference If Err = 1004 Then ds.EditBoxes.Add(ds.DialogFrame.Left, ds.DialogFrame.Top - 15, 50, 13).Name = "kDlgS_E" ds.EditBoxes("kDlgS_E").InputType = xlReference: Err = 0 End If ds.DrawingObjects("kDlgS_B").Accelerator = ac If Err = 1004 Then ds.Buttons.Add(ds.DialogFrame.Left, ds.DialogFrame.Top - 15, 30, 13).Name = "kDlgS_B" ds.DrawingObjects("kDlgS_B").Accelerator = ac ds.DrawingObjects("kDlgS_B").OnAction = "kDlgScroll1" End If On Error GoTo 0 ds.DrawingObjects("ボタン 2").OnAction = "kDlgScroll2" '[OK]ボタンへ[マクロの登録] ds.Show End Sub Sub kDlgScroll1() ActiveDialog.Focus = ActiveDialog.EditBoxes("kDlgS_E").Name End Sub Sub kDlgScroll2() 'この関数を[OK]ボタンへ[マクロの登録] ActiveDialog.EditBoxes("kDlgS_E").Text = "" End Sub 'kDlgScroll関数のTEST 'ダイアログの表示中にスクロールを行う Sub test_kDlgScroll() kDlgScroll "Dialog1" End Sub
Excel技<Excel Tips>−マクロ |