アーカイブ

‘VBA’ タグのついている投稿

日曜日を含まない経過日計算

2011 年 12 月 11 日 コメントはありません

ある日からその日を含んでX日を経過した日をExcelで求めるには「始期となる日+X-1」とすればOKです。

では日曜日を含まないで計算するにはどうしたらよいでしょうか。

たとえば2011年12月8日(木)の7日経過した日は単純に計算すると14日(水)になります。
しかし日曜日を含まない場合、8日(木)の7日経過した日は15日(木)になります。
「木、金、土、月、火、水、木」と日曜日をとばすからです。
この日曜日をとばすという処理が面倒です。 続きを読む…

カテゴリー: Excel タグ: , ,

罫線の下端で改ページするマクロ

2011 年 12 月 9 日 コメントはありません

Excelで罫線を使って表を作る場合は多いです。
一つのシートに複数の表を縦に作っていく場合、表の途中で改ページされると困ることがあります。
そこであらかじめ、それぞれの表の下端で改ページしておく、という方法が考えられます。
これを自動的に実行するマクロを作りました。 続きを読む…

カテゴリー: Excel タグ: , ,

マクロでワイルドカードを使うときの注意

2011 年 11 月 15 日 コメントはありません

Wordのマクロでワイルドカードを使って検索、置換をしようとしたところエラーが出ました。

Sub replace_test()
    With Selection.Find
        .Text = "あけまして*ございます"
        .Replacement.Text = ""
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

エラーメッセージは次の通り。

MatchPhrase、MatchWildcards、MatchSoundsLike、MatchAllWordForms、MatchFuzzyパラメータは、同時にTrueに設定することができません。

Wordで検索、置換をするときはいろいろなオプションがあります。
文書を直に検索、置換するときは矛盾するオプションは選べないようになっていますが、マクロで使うときには正しく設定しないとエラーになります。
例えば、ワイルドカード検索とあいまい検索はどちらが優先するのか、はっきりしないのでエラーになるようです。

ところで、ここで登場した5個のオプションの意味は次の通りです。どれもTrueかFalseを設定します。

MatchPhrase 単語間のすべての空白文字および制御文字が無視されます。
MatchWildcards 検索する文字列にワイルドカードが含まれている場合、このプロパティの値は True です。
MatchSoundsLike True に設定すると、検索文字列に類似した単語が検索対象となります。
MatchAllWordForms True に設定すると、検索文字列のすべての活用形が検索対象となります。
MatchFuzzy True に設定すると、検索時に日本語の文字列のあいまい検索オプションが使用されます。

そこで、MatchWildcardsだけにTrueをセットし、その他はFalseをセットしました。

Sub replace_test()
    With Selection.Find
        .Text = "あけまして*ございます"
        .Replacement.Text = ""
        .MatchPhrase = False
        .MatchWildcards = True
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        .MatchFuzzy = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

しかしこれでも同じエラーが出ます。
セットする順序が影響するようです。

Sub replace_test()
    With Selection.Find
        .Text = "あけまして*ございます"
        .Replacement.Text = ""
        .MatchPhrase = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        .MatchFuzzy = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

順序を変えてMatchWildcardsを最後にしてみたところ正しく動作しました。

カテゴリー: Word タグ: ,

VBAで引数の数を可変にする

2011 年 11 月 12 日 コメントはありません

VBAのユーザー定義関数で引数の数が一定でない場合があります。

Function kansu(a, b, c)

このケースでは、a、b、cが引数です。引数の数は3個です。

Function kansu(a, b, c, d)

このケースでは、a、b、c、dが引数です。引数の数は4個です。
このように、場合によって引数の数が違う場合のユーザー定義関数の作り方を示します。 続きを読む…

カテゴリー: Excel タグ:

Word文書を開いたときに自動的にマクロを実行

2011 年 11 月 10 日 コメントはありません

Word文書を開いたときに自動的にマクロを実行する方法です。
ここでは文書を開いたときに「Hello!」というメッセージボックスを表示させます。 続きを読む…

カテゴリー: Word タグ:

VBAのMsgBoxとInputBoxではキャンセルの返り値が違う

2011 年 11 月 1 日 コメントはありません

VBAでメッセージボックスを表示するには次のようにします。

Sub test_msgbox()
    res = MsgBox("テスト", vbOKCancel)
End Sub

この場合、OKボタンとキャンセルボタンがあるダイアログが表示されます。
OKをクリックした場合、「1」(定数だと「vbOK」)が返ります。
キャンセルをクリックした場合、「2」(定数だと「vbCancel」)が返ります。

一方、ユーザーに入力を促すインプットボックスを表示するには次のようにします。

Sub test_inputbox()
    res = InputBox("テスト", vbOKCancel)
End Sub

この場合、テキストボックスとOKボタンとキャンセルボタンがあるダイアログが表示されます。
OKをクリックした場合、テキストボックスの内容が返ります。
次が注意です。
キャンセルをクリックした場合、長さ0の文字列(“”)を返します。

ここをMsgBoxと混同して、「キャンセルボタンを押すと返り値がvbCancelだから処理終了」というつもりで次のように書くと失敗します。

Sub test_inputbox()
    res = InputBox("テスト", vbOKCancel)
    If res = vbCancel Then
        Exit Sub
    End If
    '後続処理
End Sub

定数「vbCancel」は「2」と同じですので、インプットボックスで「2」を入力した場合、処理が終了してしまいます。
次のように書くとよいです。

Sub test_inputbox()
    res = InputBox("テスト", vbOKCancel)
    If res = "" Then
        Exit Sub
    End If
    '後続処理
End Sub
カテゴリー: デジタル タグ: ,

Excelで文字列リストを元に連続して置換するマクロ

2011 年 9 月 22 日 コメントはありません

以前、Wordで文字列リストを元に連続して置換するマクロについて書いたのですが、今度はExcel版です。

まず「文字列リスト」というシートと「作業」というシートを作成します。

文字列リスト

A B
1 検索文字列 置換文字列
2 エディター エディタ
3 プリンター プリンタ
4 サーバー サーバ

文字列リストにはこのような置換用の表をセットしておきます。

マクロ

Sub 文字列リストに基づき連続して置換する()
    i = 2
    Do
        x1 = Sheets("文字列リスト").Cells(i, 1)
        x2 = Sheets("文字列リスト").Cells(i, 2)
        Sheets("作業").Cells.Replace _
            What:=x1, Replacement:=x2, _
            SearchOrder:=xlByColumns, MatchCase:=True
        i = i + 1
    Loop Until Sheets("文字列リスト").Cells(i, 1) = ""
End Sub

マクロ(VBA)をこのように書きます。

使い方

「文字列リスト」シートに上のような置換用の表をセットします。
「作業」シートに置換を施したい元の内容をセットしておきます。
マクロ「文字列リストに基づき連続して置換する」を実行します。
置換すると元には戻せませんので注意してください。

カテゴリー: Excel タグ: ,

Excelで取消線の付いた文字を削除するマクロ

2011 年 8 月 31 日 コメントはありません

Wordには変更履歴を記録する機能があります。
文字を削除すると自動的に取消線を施すように設定できます。
最終版ができた際は自動的に取消線を消して該当する文字を削除することができます。
Word2007ならばメニューの校閲-変更箇所-承諾-ドキュメント内のすべての変更を反映を選択します。

Excelの場合はどうでしょうか。
Excelでも取消線を施すことができます。セル全体だけでなく文字単位で取消線をセットできます。
しかし変更履歴を記録しているわけではないので、単に文字に取消線が付いているだけの飾りです。

そこで選択範囲の取消線の付いた文字を一気に削除するマクロを考えました。

Sub 選択範囲の取消線の付いた文字を削除()
    For Each myCell In Selection
        textBefore = myCell.Value
        textArter = ""
        For i = 1 To Len(textBefore)
            If myCell.Characters(Start:=i, Length:=1).Font.Strikethrough = False Then
                textArter = textArter & Mid(textBefore, i, 1)
            End If
        Next i
        myCell.Value = textArter
    Next myCell
End Sub

該当する文字を含むセルを選択し、このマクロを実行します。
セル全体に取消線が付いている場合は全体が削除されますし、文字単位で取消線が付いている場合はその文字だけが削除されます。
ただし部分的に色を付けたりサイズを変えたりしている場合は、その効果が消えてしまいますので、注意してください。

カテゴリー: Excel タグ: ,

セルを楕円で囲むマクロ

2011 年 8 月 11 日 コメントはありません

選択したセル範囲を囲むように楕円を描くマクロです。
セルを選択して右クリックをするとセル範囲の内側に合わせて楕円が描かれます。

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    With ActiveSheet.Shapes.AddShape(msoShapeOval, _
        Target.Left, _
        Target.Top, _
        Target.Width, _
        Target.Height)
        .Fill.Visible = msoFalse
        .Line.Weight = 0.75
    End With
End Sub

楕円をもう少し大きくしたければ、次のようにします。5ピクセルずつ上下左右に大きくなります。
「Target」はここではセル範囲を表します。順に左端、上端、幅、高さを表します。

Target.Left - 5, _
Target.Top - 5, _
Target.Width + 10, _
Target.Height + 10

色を指定したい場合は、次のようにします。赤い線になります。

.Line.ForeColor.RGB = RGB(255, 0, 0)
カテゴリー: Excel タグ: , ,

全ワークシートのアクティブセルをホームに移動するマクロ

2011 年 8 月 9 日 コメントはありません

Excelファイルを他人に渡すときなどに、アクティブセル(カーソル)がホーム(A1セル)にあると整った印象を与えます。
しかしシートがたくさんあると面倒です。
そこで考えたのが、編集中のExcelファイルのすべてのワークシートのアクティブセルをホームに移動するマクロです。

Sub 全ワークシートのアクティブセルをホームに移動()
    Dim myWS As Worksheet
    For Each myWS In Worksheets
        myWS.Select
        Range("A1").Select
    Next
End Sub
カテゴリー: Excel タグ: ,