カテゴリー「定番処理(プログラムの一部)」の18件の記事

2008年12月 5日 (金)

表・定型句の挿入

プログラムの考え方の紹介です。

別に新しいものではないし、もっと効率的なものがあるかもしれませんが、最近思いついた方法です。

自分としてはなかなか便利だなと思っています。

以前、ワードの標準機能である「定型句の挿入」の機能をつかって、表の挿入や定型句の挿入をする話をしました。(詳細はこちら

あらかじめ定型の表を「定型句」として登録しておき、マクロでその表に必要情報を一気に入力しています。

具体的には、
①文書中の対象箇所に表を挿入
②文書中の情報収集→変数へ格納
③挿入した表に、対応する情報(変数に格納済み)や「本日の日付」などを入力
を自動で行うマクロを使っています。

上記のマクロの発展版です。「定型句の挿入機能を使わないで表を挿入する方法」です。

表を適宜修正・更新する場合には、定型句に登録しなおすのが手間なため、この方法を用いると便利だと思います。

具体的には、「表の挿入」を、以下のように行います。
①表を元ネタ文書に書いて保存する
②表の記載された元ネタ文書を開く
③開いた元ネタ文書中の対応する表をコピー
④元ネタ文書を閉じる
⑤作業中文書に表を貼り付ける

その後、上記と同じように、表に情報を入力します。

表を修正する場合には、元ネタ文書を開いて、通常のワード文書の編集と同じように修正・保存をします。

会社で、複数のひとで、同じ表や同じ様式を使いたい場合にも、サーバ上の共有フォルダに「元ネタ文書」を保存しておくことで対応できます。

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

2008年12月 1日 (月)

テンプレートフォルダの利用について

テンプレートのフォルダに文書を保存する方法です。

既定のフォルダとしてテンプレート用のフォルダとして登録されているものが選ばれるので、どのパソコンにおいても、ワードのテンプレートフォルダが選ばれます。

●テンプレートフォルダの「辞書.doc」ファイルを開く場合
Dim templatePath As String

templatePath = Options.DefaultFilePath(wdUserTemplatesPath)
ChangeFileOpenDirectory (templatePath)
Documents.Open FileName:="辞書.doc"

●テンプレートフォルダに「辞書.doc」ファイルを保存する場合
Dim templatePath As String

templatePath = Options.DefaultFilePath(wdUserTemplatesPath)
ChangeFileOpenDirectory (templatePath)
ActiveDocument.SaveAs FileName:="辞書.doc"

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

2008年11月23日 (日)

文末、文頭へのカーソル移動

以前、「ピリオド・句点までの文字を選択」を書いたときに、文末や文頭を選ぶために、検索用コードをもちいて句点(。)やピリオド(.)を見つける作業をしました。

ところが、最近見つけたのはワードのVBAが標準で持っている機能をつかった、文頭や文末の見つけ方です。

こういう標準の機能を知っていると、プログラムが簡潔になりますね。
まだ、知らないことだらけです。

□まず、カーソル位置の文章を選択するコードです。
Selection.Expand Unit:=wdSentence

これを実行すると、英文であれば、カーソル位置の文章の文頭の文字から、次の文章の文頭前までが選択されます。

よって、ダブルスペースで文章を書いているときには、文章丸ごとと、ピリオドのあとのスペース二つも選択されます。

英文では、文中にあるピリオドが、数値の直後にある場合には、数字の小数点とみなされるのか、そのピリオドが文章の末尾であるとは認識されないみたいです。

日本語の文章では、文章の末尾を句点(。)や改行で認識しているらしいです。

句点のあとにスペースがあると、そのスペースまでを一文としてみなします。

多少変則的な解釈が必要になるかもしれませんが、下記のコードで、文末と文頭とにカーソルを移動することが出来ます。

'○文頭へカーソル移動
Selection.Expand Unit:=wdSentence
Selection.Collapse Direction:=wdCollapseStart

'○文末へカーソル移動
Selection.Expand Unit:=wdSentence
Selection.Collapse Direction:=wdCollapseEnd

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

2008年10月12日 (日)

日付を英語表記にする(前回のつづき)

先日、「日付を英語表記にする」という記事を書きました。その中で、半角数字で記入した日付を、英語の日付に直す方法を無理やり編み出して記載しました。

今日は、そのプログラムの修正です。

英語の表示形式は、書きプログラム中に"mmmm d, yyyy"と記載したように、前回の力わざと比べると簡単に変換することができます。

前回に調べたときには、「できる大辞典 Excel VBA」を参考にして考えました。この本の索引で、「日付」の項目に、いくつかページがのっており、P305, P808, P884を参考にしました。

具体的には、
月の名前の英語表記 Format("2003/4/1, "mmmm") → April
日付一桁表記      Format("2003/4/1, "d") → 1
西暦年を4桁表記       Format("2003/4/1, "yyyy") → 2003
という具合です。

これを使ったので、前回のプログラムは多少長いけれど結果が出せたわけ。

今回は、全てを一括して Format("2003/4/1, "mmmm d, yyyy") → April 1, 2003
と表記することを覚えました。

ワードも、エクセルも、VBAが難しいといわれるゆえんは、コマンドを知らない場合(ヘルプや本で調べきれない場合)、遠回りをして結果にたどり着いてしまうかもしれないということです。

今回のような小さな遠回りであればどうでもいいのですが、もう少し上級のコマンドであると、そのコマンドを知らないがために、やたら多くの条件設定を自分ですることになったりすると思います。

たとえば、split関数はすごく便利でたまに使いますが、この関数があることを知らなかったら、相当複雑なプログラムを組むことになってしまうなと怖くなります。(split関数については、「ワードで実践」のP101を参照ください。)

今回の表現については、後日インターネットで参考のために英語表現への変換マクロを調べていたら、別のコマンドで"mmmm d, yyyy"の表現を使っているものに出会ったので、それを参考にしてみたらうまくいったというわけ。

本だけの調べで満足していましたが、案外、インターネットにいろんな有益な情報が転がっていますね。

●プログラム
前回のものと多少違います。今回のプログラムでは、カーソル位置に日付をテキスト入力します。

英文のレターで、現地代理人のレター送付日、特許庁の指令発行日など日付を書くことが多い方、ちょっと便利かも。

Sub 英語日付()

Dim dateEnglish As String
Dim dateShort As String

dateShort = InputBox("日付を2008/10/5の形式で入力してください。", title:="英語表記への変換")

If dateShort <> "" Then
    dateEnglish = Format(dateShort, "mmmm d, yyyy")
    Selection.TypeText Text:=dateEnglish
Else
    End
End If

End Sub

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

2008年10月 5日 (日)

日付を英語表記にする

簡易に入力した日付(2008/10/5の形式)を英語の表記(October 5, 2008)に変換する処理です。

Dateenglish Dateenglish1 他にもやり方があるのかもしれませんが。。。

FormatDateTime(checkdue, vbLongDate)の関数を使って変換する方法は、以前紹介しました。vbLongDateを指定すると、「地域と言語のオプションのカスタマイズ」の「日付タブ」で「長い形式」に指定された表示形式になります。

しかし、「地域と言語のオプションのカスタマイズ」のデフォルトでは日本語表記になっているので、「2008年10月5日」という表記になってしまい、英語表記になりません。

英語表記にするには、「地域と言語のオプションのカスタマイズ」で、英語表記を設定しなおす必要があり、手間がかかります。

下記のマクロでは、ちょっと力技になりますが、英語の表現に変換してくれます。

●プログラム●

Sub 日付の英語表記()

Dim dateEnglish As String
Dim dateShort As String

dateShort = InputBox("今日の日付を入力して下さい。 " & vbCr & _
                "(2008/10/5の形式で入力)", title:="英語表記への変換")

If dateShort <> "" Then
    dateEnglish = Format(dateShort, "mmmm") & " " & _
                    Format(dateShort, "d") & ", " & _
                    Format(dateShort, "yyyy")
   
    msgbox "今日は" & vbCr & dateEnglish & vbCr & "です。"
   
Else
    End
End If

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

2008年9月 6日 (土)

「文章の作成に使用するテンプレート」の一時変更

テンプレートを変更するコードです。

Templatechange_2
ここでいう「テンプレート」とは、マクロ用のテンプレートではなくて、「文書の作成に使用するテンプレート」のことであり、通常は「Normal.dot」がそれにあたります。左の画像のとおり、テンプレートアドインのダイアログボックスにおける上の欄に記載されるテンプレートのことです。

ActiveDocument.AttachedTemplate = "テンプレート名.dot"

上記の”テンプレート名”に、使いたいテンプレート名を入れます。
特定のマクロプログラム実施中に、所定のテンプレートの情報を使うことができます。

●使用例
さまざまな「定型句」を保存したテンプレートを、「定型句の保管用」とします。
この「定型句の保管用」テンプレートに保存した「一覧表」をマクロ実行中に呼び出したい場合に、現在使っているテンプレートから、「定型句の保管用」のテンプレートに一時変更します。

●プログラムの一部 例
Dim prsntTemplates As String

'現在使われているテンプレートを保管
prsntTemplates = ActiveDocument.AttachedTemplate

'使用するテンプレートを変更
ActiveDocument.AttachedTemplate = "定型句の保管用.dot"

    Application.DisplayAutoCompleteTips = True
    ActiveDocument.AttachedTemplate.AutoTextEntries("一覧表").Insert Where _
        :=Selection.Range, RichText:=True

'プログラム終了時に、もとの設定に戻す
ActiveDocument.AttachedTemplate = prsntTemplates

●プログラムの工夫
現在使用中のテンプレート名を保存して、最後にそのテンプレートに戻すところ。
なかなか粋な計らいだと思います。

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

日付の表示を変換するプログラム

FormatDateTime(日付, 表示形式)

下記の例では、日付の変数をcheckdueとしており、表示形式をvbLondDateとしました。

Dim checkdue As String

checkdue = "2008/9/6"
checkdue = FormatDateTime(checkdue, vbLongDate)
msgbox "今日の日付は" & checkdue & "です。"

上記の場合、
「今日の日付は2008年9月6日です。」と表示されます。

表示形式を vbGeneralDate と記載すると 
「今日の日付は2008/09/06です。」 と表示されます。

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

2008年8月13日 (水)

前提条件が満たされない場合の警告

(追記)8月2日に掲載した内容に追記です。
実は、「Wordで実践」のP.239、P.240にこの内容は書かれていましたね。最近、またこのコードを利用して下記プログラム②を使いましたので追記しました。

(8月2日の記事)
すごく便利なコードを発見しました。

プログラムを書くときに、ある程度前提としている条件があります。たとえば、所定のフォルダに「△△△.doc」というファイルが保存されているとか、所定のファイルが現在開かれている、とか。

このような前提条件があるプログラムを走らせた場合に、その前提条件が満たされていないとエラーになってプログラムが終了してしまいます。前提条件がそろわないのであれば、別の処理をしたいときや、前提条件がそろわない理由を表示するときなどに使えると思います。

●説明
下記に示すプログラムでは、前提条件があわないときに、エラーメッセージとともにエラー番号が表示されます。これをメモしておいて、プログラムの条件文に入れ込みます。下記プログラム①の場合は、「エラー4160が出たら(『キーワードリスト.doc』というファイルが開かれていなかった場合)、メッセージを表示して、プログラムを終了する」というものです。プログラム②の場合は、「エラー5941が出ても、そのまま次へ進め」というものです。

●プログラム①
On Error GoTo errorHandler
errorHandler:
If Err = 4160 Then
    MsgBox "「キーワードリスト.doc」ファイルを開いてください。"
    End
End If

●プログラム②
On Error GoTo errorHandler
errorHandler:
    If Err = 5941 Then
        Resume Next
        End
    End If

●実際に用いているテンプレート
プログラム①:キーワードの囲い文字化のマクロで使用しています。
プログラム②:マクロのオンオフで使用

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

文字を書くときのコード

Selection.TypeText Text:="書きたい文字を入力"

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

変数の設定ミスエラーの回避方法

自分で作ったマクロがほかの人のパソコンで動かない。または、ほかの人が作ったマクロが自分のパソコンで動かないということはよくあるようです。(自分のマクロがほかの人の環境で動かないことがたびたびありました。)

原因のひとつに、変数が正確に定義されていないことがあります。その回避策を紹介します。

●作用
ある設定をすることで、明示的に定義(Dimの書式で宣言)していない変数がプログラム中に用いられた場合に、エラーメッセージを表示させることができます。よって、自分が定義していない変数をプログラム中に用いた場合には、プログラムが動かないため、プログラムのデバグをより正確に実施できます。

この設定をせずにプログラムを動かすことは可能です。しかし、設定せずに、定義していない変数が用いられた場合には、コンピュータが”勝手に”変数を解釈してプログラムを走らせるため、場合によっては誤動作をしてしまうことがあるわけです。結果、私のパソコンではうまく動いたけど、ほかの人のパソコンではうまく動かない(コンピュータがうまく解釈してくれなかった)という事態がおこるようです。

●設定方法 簡単です。

Option Explicit

この一文を、それぞれモジュールの一番先頭に記入します。これで終わり。

たとえば、

Option Explicit

Sub ○○のプログラム()

'セルの番号
Dim nP As Integer

'選択数字の記憶用
Dim NB As String
・・・・

というかんじに表記されます。

モジュールごとに自動的にOption Explicitを記入する方法は、「Wordで実践」のP.14に掲載されています。が、P.16に書かれているとおり、うまくいかないことがある(私のパソコンでは自動入力ができません)ため、自分で入力する癖をつけるのもいいと思います。

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

2008年8月 9日 (土)

フォルダ内のファイル名ゲット

パスを指定したフォルダ内のファイルの種類、ファイル個数、ファイル名を取得します。マクロテンプレートのオンオフ設定のマクロにて使いました。こちらです。

●プログラム前提条件
strPath には、フォルダへのパスを入れます。
.FileName = ".dot" に、文書の種類を設定できます。".doc"とすればワード文書です。

●プログラムの一部
With Application.FileSearch
    .LookIn = strPath
    .FileName = ".dot"
    If .Execute > 0 Then
        FC = .FoundFiles.Count
        For i = 1 To FC
                varTMP(i) = .FoundFiles(i)
            End If
        Next i
    Else
        MsgBox "テンプレートファイルは見つかりませんでした。"
    End If
End With

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

2008年7月22日 (火)

置換マクロ実行後の設定デフォルト化

selection を用いた置換処理のマクロを実行すると、そのマクロでつかった書式が、その次に「検索と置換」の設定に反映されてしまいます。

たとえば、マクロで「置換後の文字列に蛍光ペン」を設定したり、または「検索する文字列に下線の条件」を設定したりすると、その設定が、通常の「検索と置換」のウインドウにそのまま残ってしまいます。

そうすると、設定の解除が面倒です。また、きづかずに検索をしてしまうと、目的の単語を検索できなくなることがあります。

そうならないように、下記のプログラムを、マクロの最後に記載しておきます。これは、書式をすべてデフォルトに戻すための設定です。僕の場合、ワイルドカードをもちいた検索・置換をよくおこなうので、ワイルドカードの設定をオフにして、あいまい検索をオンにするように記載されています。

●下記のプログラム文の説明

1行目: with selection.find 検索・置換窓の設定のことです。

2行目: 「検索する文字列」の書式設定の解除

3行目: 「置換後の文字列」の書式設定の解除

4行目: 「検索する文字列」の入力文字を削除(空欄を入れるという命令文です)

5行目: 「置換後の文字列」の入力文字を削除

6行目: ワイルドカードのチェックマークを消す

7行目: あいまい検索のチェックマークを入れる

8行目: End With 検索・置換の設定終わり

●プログラム文

    With Selection.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Text = ""
        .Replacement.Text = ""
        .MatchWildcards = False
        .MatchFuzzy = True
    End With

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

2008年7月20日 (日)

プログラム中の改行表示の方法

視認性を高めるために、プログラム言語中にも改行を入れることができます。

プログラム言語中にいれる改行は 改行開始箇所に「_」(アンダーバー)を入力して、その続きは、改行後に続けてください。

以下のMessageは、同じことを意味します。
改行した二つ目の記載例のほうが見やすいですね。

●改行をしない記載例
Message = "キーワードの番号を入力してください。" & vbCr & "1:自動車" & vbCr & "2:建物" & vbCr & "3:飛行機" & vbCr & "ほかのキーワードがある場合は入力してください。"

●改行をする記載例
Message = "キーワードの番号を入力してください。" & vbCr _
                & "1:自動車" & vbCr _
                & "2:建物" & vbCr _
                & "3:飛行機" & vbCr _
               & "ほかのキーワードがある場合は入力してください。"

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

InputBoxやMsgBoxでの改行表示

InputBoxやMsgBoxに記載するメッセージ中に改行を入れることができます。このことで、メッセージの視認性が高まります。

●入力方法
改行箇所で & vbcr & を書くだけです。

●例文
defaultには、入力項目にあらかじめ記載したい文字列・数字を書きます。   

Message = "キーワードの番号を入力してください。" & vbCr & "1:自動車" & vbCr & "2:建物" & vbCr & "3:飛行機" & vbCr & "ほかのキーワードがある場合は入力してください。"
Title = "分野検索"
Default = 1
   
varNumber = InputBox(Message, Title, Default)

Kaigyoinputbox_2

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

InputBox 条件の選択と実行

インプット画面で条件を選んで、その選択された条件に応じて異なる処理をするコードです。

『Wordで実践 やさしくて役に立つ「マクロ」事例集』のP.68やP.104のプログラムに例がのっています。

下記の例文では、あらかじめ用意されたキーワードの中から番号を選んだり、用意されたキーワード以外の言葉を入力すると、それに応じて変数wordに入力されるキーワードがかわる(選択された条件に応じた処理をする)ことになります。

●変数の定義 
varNumberを、文字列・数値のどちらでも使えるVariantとして定義することがポイント

●プログラム
InputBoxに入れるMessage, Title, Defaultの変数を、別書きにしています。
このことで、InputBoxのプログラムの文章がすっきりしますし、同じような命令文があったときに、それぞれの変数の内容を書き換えることで使い回しが簡単にできます。

  Dim varNumber As Variant
  Dim word As String
  Dim Message As String
  Dim Title As String
  Dim Default As String


  Message = "キーワードの番号を入力してください。" & vbCr _
                & "1:自動車" & vbCr _
                & "2:建物" & vbCr _
                & "3:飛行機" & vbCr _
               & "ほかのキーワードがある場合は入力してください。"
    Title = "分野検索"
    Default = 1
   
    varNumber = InputBox(Message, Title, Default)
    If varNumber = "" Then End
   
    If varNumber < 1 Or varNumber > 3 Then
        word = varNumber
    End If
   
    If varNumber >= 1 And varNumber <= 3 Then
        Select Case varNumber
            Case 1
                word = automobile
            Case 2
                word = building
            Case 3
                word = airplane
        End Select
    End If

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

画面の更新の設定

マクロプログラムを実行して、検索や置換を繰り返すと、画面がめまぐるしく変わることがあります。

これを避けるために、マクロを実行中は画面の更新をしないように設定できます。

Application.ScreenUpdating = False (プログラム終了時にtrueに設定)

ワードのVBのヘルプには、下記のように記載されています。

引用始まり。

使用例

次の使用例は、画面の更新機能をオフにし、新しい文書を追加します。文書には 500 行の文字列が追加されます。マクロは、50 行ごとに行を選択し、画面を更新します。

Application.ScreenUpdating = False
Documents.Add
For x = 1 To 500
    With ActiveDocument.Content
        .InsertAfter "This is line " & x & "."
        .InsertParagraphAfter
    End With
If x Mod 50 = 0 Then
    ActiveDocument.Paragraphs(x).Range.Select
    Application.ScreenRefresh
End If
Next x
Application.ScreenUpdating = True
引用終わり。

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

選択解除の記述

検索・置換プログラムで選択されたテキストの選択を解除するときに使っています。

Selection.Collapse Direction:=wdCollapseEnd

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

確認用メッセージボックス

プログラム実行前に、実行を許可するためのメッセージボックスです。

msg = MsgBox("●●●を実行します。準備はよろしいですか?", vbYesNo)
  If msg = vbNo Then End
  If msg = vbYes Then 処理

●用途
下記のような場合に、注意を促すために利用したりしています。

・文書の書式や内容を大幅に変更するプログラムの実行前
・実行に際して、特別な準備をする必要があるプログラムの実行前

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