見出し画像

【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
引用元:https://youseful.jp/microsoft/excel/vba-ifstatement/
引用元:https://youseful.jp/microsoft/excel/vba-ifstatement/

繰り返し処理(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")


いいなと思ったら応援しよう!

リアン
よろしければ応援よろしくお願いいたします。いただいたチップは我が子に全額還元させていただきます!!!