アーカイブ

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

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 タグ: ,

線形探索と二分探索をVBAで

2011 年 7 月 6 日 コメントはありません

線形探索(逐次探索)と二分探索をVBA(Excel)で行う方法です。

それぞれサンプルを示します。
ここではExcelのシートのA列の1行から40行まで昇順の数値が入っている場合に、ある数値を探し、その行番号を表示することにします。 続きを読む…

カテゴリー: Excel タグ: ,

複数のExcelファイルを1枚にまとめるマクロ

2011 年 7 月 6 日 コメントはありません

複数のExcelファイルの内容を1枚のシートにまとめるには、コピー&ペーストを繰り返せばよいのですが、数が多くなると面倒です。
マクロで実行する方法を考えました。
あるフォルダに保存されている複数のExcelファイルとそのシートをすべて取得し、別の1枚のシートにまとめます。

ただし制限があります。
シートのレイアウトやサイズがすべて同じならばコピー&ペーストでよいのですが、そうとは限らないので、範囲をあらかじめ決めて、その範囲のセルの内容をテキスト形式で取得します。
つまり書式は無視されます。
また1枚のシートにまとめるときに左端にファイル名とシート名をセットします。
無駄な行を削除するために並び替えたりしてもすぐに復元できます。

サンプルは前半と後半に分かれます。
Excelファイルには「matome」というシートを作っておきます。 続きを読む…

カテゴリー: Excel タグ: ,

Wordで1ページずつPDFで保存するマクロ

2011 年 7 月 5 日 コメントはありません

Wordで作成した文書はPDFで保存することができます。
ページを指定することで、特定の部分だけをPDFにすることもできます。
1ページずつ指定すれば、各ページをPDFで保存することができますが、ページ数が増えるとなかなか面倒です。

これをマクロで実行させる方法を考えました。Word2007で確認しました。 続きを読む…

カテゴリー: Word タグ: ,

複数のWord文書に連続して処理を施すマクロ

2011 年 6 月 30 日 コメントはありません

既にできているWord文書に対して一括して処理をしたいことがあると思います。
表紙に通し番号を入れたり、会社名や担当者名が変わったので置換したり、という場面です。

そのためのマクロを考えてみました。 続きを読む…

カテゴリー: Word タグ:

Wordファイルの透かしを削除するマクロ

2011 年 6 月 29 日 コメントはありません

Wordファイルの透かしを削除するには次のようにします(Word2007)。

  1. ページレイアウト-ページの背景-透かしを選択。
  2. 透かしの削除を選択。

これをマクロで実行する方法を考えました。
複数のWord文書に連続して処理を施すマクロに応用することもできます。 続きを読む…

カテゴリー: Word タグ: ,