
【Excel VBA】久しぶりに使うときに思い出したいこと
思い付き次第、今後もちょこちょこ足したりしていきたいなと。
(見づらかったので無言でアプデしてますゴメンネ)
1|おまじない:Option Explicit
Option Explicit
Sub おまじない()
~~~~~~~
End Sub
VBAは変数を宣言せずに使うことができちゃうので、おまじないしておく。変数名の打ち間違いエラーなどで無駄な時間を減らす!
2|変数:データ型(よく使うものだけね)
変数とは?データ型とは?などはググってくださいな。
(調べることもきっと勉強に役立つはずシランケド)
「Long」長整数型
Integerより範囲の広い整数を入れられる。
For文回す時とか、整数を代入するときはとりあえずLong入れとこ。
「String」文字列型
格納できるデータは任意の長さの文字列。
文字列やセルの文字列値を代入するときはこれ。
「Variant」バリアント型
格納できるデータはすべてのデータ。配列使うときはこれ。
「Worksheet」オブジェクトデータ型
Worksheetだっけ?Worksheetsだっけ?ってなるやつね!
『Worksheetオブジェクトの集まりがWorksheetsコレクション』なので
以下のように使います。
Dim ws As Worksheet
Set ws = Worksheets("シート名")
MsgBox ws.Name
「Date」日付型
実行日をセルに入れたり
ファイル名に日付や時間入れたりして使う場面多々あり。
年、月、日を取得するときは
それぞれYear関数、Month関数、Day関数、
時、分、秒を取得するときは
それぞれHour関数、Minute関数、Second関数を使うよ。
曜日を取得するWeekday関数なんかもあるよ。
書き方いろいろなので以下参照ください。
MsgBox Date '現在のシステムの日付
⇒結果「2024/12/13」
MsgBox Now '現在の日時
⇒結果「2024/12/13 10:34:02」
MsgBox Year(Now) '日付から年を抽出(数値が返される)
⇒結果「2024」
MsgBox Month(Now) '日付から月を抽出(数値が返される)
⇒結果「12」
MsgBox Day(Now) '日付から日を抽出(数値が返される)
⇒結果「13」
MsgBox Format(Now, "dddd, mmmm dd, yyyy")
⇒結果「Friday, December 13, 2024」
Dim d1 As Date
'現時点の年月日を取得
d1 = Date
'結果「2024/12/13」
Dim d2 As Variant '現時点の年月日を8桁で取得
d2 = Format(Date, "yyyymmdd")
⇒結果「20241213」
Dim d3 As Variant '現時点の年月日を「yyyy年mm月dd日」形式で取得
d3 = Format(Date, "yyyy年mm月dd日")
⇒結果「2024年12月13日」
3|構文について
VBAは『オブジェクト階層構造』です。
Application
┗Workbook
┣Worksheet
┃ ┣Range(Cells)
┃ ┣Range(Cells)
┃ ┗Range(Cells)
┗Worksheet
┣Range(Cells)
┣Range(Cells)
┗Range(Cells)
アプリケーションはExcelのこと、ワークブックは
Book1、Book2などのブック全体のことを指します。
ブック内には複数のシートがあり、シートには複数のセルがあります。
このように
Application、Workbook、Worksheet、Range(Cells)
の流れでオブジェクト階層構造となっているのです。
VBAで処理を書くときの基礎なので、覚えておくべし!
詳しいことはググってくださいな。
ぶっちゃけExcel VBAは
条件分岐と繰り返し処理が理解できればいける気がするので
そちらをピックアップしておくことにする。
条件分岐(If)
If 条件A Then
~条件式Aに当てはまる場合の処理内容~
ElseIf 条件B Then
~条件Bに当てはまる場合の処理内容~
Else
~いずれの条件式にも当てはまらない場合の処理内容~
End If


繰り返し処理(For Next)
For 変数 = 初期値 To 終了値
'繰り返したい処理
Next 変数
Sub SAMPLE()
Dim i As Long
For i = 1 to 5
Cells(i, 1).Value = 10
Next i
End Sub
繰り返し処理(Do ~Loop)
Do While ~Loop
条件を満たしている間処理を繰り返す。
Do Loop ~While
条件を満たしている間処理を繰り返すが
判定タイミングは実行後。
Do Until ~Loop
条件が満たさせるまで繰り返す。
以下のサイトがわかりやすかったのでご参考まで。
4|その他便利知識
変数の適用範囲について
書く場所と書き方で使える範囲変わるんよね…
・Dim(プロシージャの中):そのプロシージャの中で使える
・Dim(プロシージャの外):そのモジュールの中で使える
・Public(プロシージャの外):プロジェクト全体でどこからでも使える
=グローバル変数
MsgBox関連
アイコン指定は割と毎回使っちゃう。
・vbInfomation(情報)
・vbExclamation(注意)
・vbQuestion(問い合わせ)
・vbCritical(警告)
'実行確認メッセージ
Dim rc As VbMsgBoxResult
rc = MsgBox("実行しますか?", vbYesNo + vbQuestion)
If rc = vbNo Then
MsgBox "処理を中止します。", vbExclamation
End
End If
バッチファイルの作成と実行
VBAの実行の中に
「バッチファイルの作成と実行(毎回上書き作成)」
を組み込むパターン。
ファイル名一覧を取得したりするときに使う。
Dim listPath As String, DataPath As String
'各パスを変数に代入
listPath = ThisWorkbook.Path 'リスト出力先フォルダ
DataPath = Sh_01.Range("A1").Value 'メールデータフォルダ
'↑直接パス代入してもいいし、上記のようにセルにパス入れといてもおけ
'batファイルの作成および実行(毎回上書き作成)
Open listPath & "\一覧取得.bat" For Output As #1
Print #1, "@echo off"
Print #1, "dir /b " & DataPath & "\*.txt >" & listPath & "\list.txt"
Print #1, "exit /b"
Close #1
Shell listPath & "\一覧取得.bat", vbNormalFocus 'batファイル実行
テキストファイルを1行ずつ読み込む
上記の続きとしても!
テキストファイルを1行ずつ読み込んで処理するパターン。
データ集計とかデータ処理には使えるのかも?
(テスト実行するときは上記とセットにしてみてね)
Dim dmy As String, str As String
str = "検索文字列" '検索したい文字列を入れる
'txtのリスト一行ずつ読み込む
Open listPath & "\list.txt" For Input As #1
Do Until EOF(1)
Line Input #1, buf
fullpath = DataPath & "\" & buf
'txtデータを開く
Open fullpath For Input As #2
Line Input #2, dmy
If InStr(dmy, str) <> 0 Then '検索文字列が含まれている場合
'~処理入力~
End If
Close #2
Loop
Close #1
5|小ネタ
シート操作はObject名で制御
これ見つけてからとっても楽になったので是非!!!
Application.ScreenUpdating
高速化ってよりは画面チラチラうざかったら使うかな?
Application.ScreenUpdating = False
Application.ScreenUpdating = True
Application.Wait
ちょっと待機させたいときに。
'ちょっと待機
Application.Wait Now() + TimeValue("00:00:01")
いいなと思ったら応援しよう!
