新規記事の投稿を行うことで、非表示にすることが可能です。
2023年01月10日
VBA 特定のExcelファイルだけマクロを有効にする
マクロは便利だが、様々な事が出来てしまうため、セキュリティリスクとなる場合がある。
そのため、「警告を表示してすべてのマクロを無効にする」が初期設定されている。
しかし、この設定だとその都度マクロを有効にしなければならず、
だからといって「すべてのマクロを有効にする」にしてしまうと、セキュリティリスクが高まってしまう(※)。
※ダウンロードしたものやメールで入ってきた悪意のあるファイルに対しても無条件でマクロが有効となってしまうため
では、特定のファイルだけ常にマクロを有効にしたい場合はどうすればよいか。
どうやら特定のファイルだけマクロを有効にするという設定は無い様子。
だが、Excel 2007以降では「信頼できる場所」に存在するファイルだけは常にマクロを有効にすることが可能となっている。
そのため、自分で作ったマクロなど、安全であることが分かっているファイルは「信頼できる場所」へ移動させ、セキュリティリスクを高めることなくマクロを利用する。
なお、「信頼できる場所」へ移動したファイルは「警告を表示せずに全てのマクロを無効にする」の設定になっていてもマクロの利用が可能。
「信頼できる場所」への追加設定方法
1.「ファイル」を選択
2.「オプション」を選択
3.「セキュリティ センター」を選択
(利用しているExcelのバージョンにより「セキュリティ センター」「トラスト センター」など表記が違う)
4.「セキュリティ センターの設定」を選択
(利用しているExcelのバージョンにより「セキュリティ センターの設定」「トラスト センターの設定」など表記が違う)
5.「信頼できる場所」を選択
6.初期設定されているフォルダにExcelファイルを保存する。
(もしくは、「新しい場所の追加」ボタンからExcelファイルを保存しているフォルダを指定する)
2022年12月05日
VBA Bookを上書き保存する際に複製したファイル(バックアップファイル)を自動で作成する
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim path As String
Dim name As String
path = ThisWorkbook.path
name = Format(Now(), "yyyymmdd") & "_" & "backup" & ThisWorkbook.name
ThisWorkbook.SaveCopyAs Filename:=path & "\" & name
End Sub
【補足】
上書き保存の際にVBAを起動するには、「ThisWorkbook」から「BeforeSave」を選択する。
2022年09月28日
VBA Excel起動時に目印となる線を現在の時間へ移動する
Excel起動時に目印となる線を現在の時間へ移動するプログラム
Private Sub Workbook_Open()
Application.ScreenUpdating = False
Worksheets(1).Activate
'1行目より一致する時間を選択する
Rows(1).Find(What:=Hour(Now()), LookIn:=xlValues).Select
'線を移動させる
With ActiveSheet.Shapes("時間").Select
Selection.ShapeRange.Top = ActiveCell.Top '開始行を指定
Selection.ShapeRange.Left = ActiveCell.Left + ActiveCell.Width / 2 '横位置をセルの中央に指定
End With
'A1セルを選択
Range("A1").Activate
Application.ScreenUpdating = True
End Sub
【補足1】
目印となる線を事前に作成しておく。
また、線の名前は「時間」にする。
【補足2】
ファイルを開いた際にVBAを起動するには、「ThisWorkbook」から「Open」を選択する。
2022年08月23日
VBA 最終行までの空白セルを選択する
B2セルから最終行までの空白セルを選択するプログラム
Sub SelectBlankCell()
Dim blankCell As Range
Set blankCell = Range("B2", "B" & Cells(Rows.Count, 2).End(xlUp).Row).SpecialCells(xlCellTypeBlanks)
blankCell.Select
MsgBox Selection.Count '選択したセル数を確認する
End Sub
Sub SelectBlankCell()
Dim blankCell As Range
Set blankCell = Range("B2", "B" & Cells(Rows.Count, 2).End(xlUp).Row).SpecialCells(xlCellTypeBlanks)
blankCell.Select
MsgBox Selection.Count '選択したセル数を確認する
End Sub
2022年02月14日
VBA 条件に一致したセル数を数える
条件に一致したセル数を数える場合はCountIfを利用する
Sheet2のC2セルから最終行までのデータ数をカウントする(※対象データは「test」)
Sub MatchCellsCount()
Dim maxRow As Integer
Dim dateCount As Integer
maxRow = Sheets("Sheet2").Cells(Rows.Count, 3).End(xlUp).Row
dataCount = WorksheetFunction.CountIf(Sheets("Sheet2").Range("C2", "C" & maxRow), "test")
MsgBox "testは" & dataCount & "件です"
End Sub
2021年11月02日
VBA 最終行までの空白セル数を取得する
B2セルから最終行までの空白セル数を取得するプログラム
Sub GetBlankCells()
Dim blancCellCount As Integer
blankCellCount = WorksheetFunction.CountBlank(Range("B2", "B" & Cells(Rows.Count, 2).End(xlUp).Row))
MsgBox blankCellCount
End Sub
2021年08月13日
VBA VBA(VBE)のモジュール名を変更する
VBAを使って業務アプリケーションを作成していくと、どんどんプロシージャの数が増えていく。
このとき「標準モジュールの名前を変更したい」と思い、モジュール名を右クリックしてもメニューに[名前の変更]というコマンドは見つからない。
モジュール名を変更するには、以下の操作を行う。
1)プロジェクトから名前を変更したいモジュールを選択
2)メニューバーの「表示」→「プロパティ ウィンドウ」をクリック
3)プロパティウィンドウが表示される
4)「(オブジェクト名)」の右側に表示されたモジュール名を変更する
5)Enterキーを押下するかマウスカーソルをテキストフィールドからはずせば、モジュール名が変更される
このとき「標準モジュールの名前を変更したい」と思い、モジュール名を右クリックしてもメニューに[名前の変更]というコマンドは見つからない。
モジュール名を変更するには、以下の操作を行う。
1)プロジェクトから名前を変更したいモジュールを選択
2)メニューバーの「表示」→「プロパティ ウィンドウ」をクリック
3)プロパティウィンドウが表示される
4)「(オブジェクト名)」の右側に表示されたモジュール名を変更する
5)Enterキーを押下するかマウスカーソルをテキストフィールドからはずせば、モジュール名が変更される
2021年03月08日
VBA 関数に変数を利用する
原則として文字列はダブルクォーテーション(")で囲む必要がある。
つまり、文字列の両端は必ずダブルクォーテーション(")でなければならない。
では、行番号などの変数を式の中に組み込む場合はどうするか。
ダブルクォーテーションに囲まれた間は文字列として扱われるため、「&」演算子と変数はダブルクォーテーションで囲まれた外側に置かなければならない。
注意すべきは、関数の引数に文字列を指定する場合。
その場合はダブルクォーテーションを2つ("")並べて利用する。
C列で0以上の数をカウントしA1セルへ表示するプログラム
Sub CountNumber()
Dim rowsNumber As Integer
rowsNumber = Cells(Rows.Count, 3).End(xlUp).Row
Range("A1").Value = "=COUNTIF(C1:C" & rowsNumber & ","">=0"")"
End Sub
2020年09月29日
VBA Sub と Function の使い分け
「Subは、単独で実行できる」、「Functionは、呼ばれて動く」という役割がある。
また、「Subは、戻り値がない」、「Functionは、戻り値を返せる」という特徴もある。
【Subプロシージャ】
・マクロとして呼び出すことが出来る
・戻り値を返すことができない
【Functionプロシージャ】
・マクロとして呼び出すことが出来ない
・戻り値を受け渡せる
使い分けとしては、「戻り値を受け取るか、受け取らないか」「マクロとして呼び出すか、呼び出さないか」で使い分ける。
「マクロ」として呼び出す必要がある場合はSub関数が必須となり、
「戻り値を受け取る」必要がある場合はFunction関数が必須となる。
また、「Subは、戻り値がない」、「Functionは、戻り値を返せる」という特徴もある。
【Subプロシージャ】
・マクロとして呼び出すことが出来る
・戻り値を返すことができない
【Functionプロシージャ】
・マクロとして呼び出すことが出来ない
・戻り値を受け渡せる
使い分けとしては、「戻り値を受け取るか、受け取らないか」「マクロとして呼び出すか、呼び出さないか」で使い分ける。
「マクロ」として呼び出す必要がある場合はSub関数が必須となり、
「戻り値を受け取る」必要がある場合はFunction関数が必須となる。
2020年07月21日
VBA RangeとCellsの範囲指定サンプル
RangeとCellsを利用した範囲指定のサンプル
B1セルの指定
Range("B1")
Cells(1, 2)
Cells(1,”B”)
A1〜B3セルの範囲指定
Range("A1:B3")
Range("A1", "B3")
Range(Cells(1, 1), Cells(3,2))
Range("A1", Cells(3,2))
Range("A1:A3", "B1")
A1とB3セルの指定
Range("A1,B3")
1〜3行の範囲指定
Range(Rows(1), Rows(3))
Range("1:3")
1〜3列の範囲指定
Range(Columns(1), Columns(3))
Range("A:C")
全セル指定
Range(Rows(1), Columns(1))
Cells ※行・列を指定しない
※Cellsで取得できるセルは1つか全てであり、行や列などの複数セルは選択できない
隣接していない複数セルの範囲指定
Union(Range("K1:K7"), Range("P1:P7")).Select
※隣接していない複数セルの範囲指定には Union を利用する
(注)Rangeの引数について
Rangeの引数は2つまでしか指定できない
Range(引数1,引数2)
誤)
Range("A1","B2","C1").Select
※コンパイルエラーが発生する
正)
Range("A1,B2,C1").Select
【関連記事】 Rangeの利用例
B1セルの指定
Range("B1")
Cells(1, 2)
Cells(1,”B”)
A1〜B3セルの範囲指定
Range("A1:B3")
Range("A1", "B3")
Range(Cells(1, 1), Cells(3,2))
Range("A1", Cells(3,2))
Range("A1:A3", "B1")
A1とB3セルの指定
Range("A1,B3")
1〜3行の範囲指定
Range(Rows(1), Rows(3))
Range("1:3")
1〜3列の範囲指定
Range(Columns(1), Columns(3))
Range("A:C")
全セル指定
Range(Rows(1), Columns(1))
Cells ※行・列を指定しない
※Cellsで取得できるセルは1つか全てであり、行や列などの複数セルは選択できない
隣接していない複数セルの範囲指定
Union(Range("K1:K7"), Range("P1:P7")).Select
※隣接していない複数セルの範囲指定には Union を利用する
(注)Rangeの引数について
Rangeの引数は2つまでしか指定できない
Range(引数1,引数2)
誤)
Range("A1","B2","C1").Select
※コンパイルエラーが発生する
正)
Range("A1,B2,C1").Select
【関連記事】 Rangeの利用例