Excelファイルがあるフォルダとその下の全xlsxファイルを順に開いて閉じる

開いたExcelファイルは1秒後に閉じます。繰り返し処理の間、止めることもできないのでDoEventsでを入れてます。

ディスクトップにExcelファイルを作ってVBEを開いて標準モジュールに貼り付け実行するとディスクトップ以下のxlsx拡張子のファイルを全部開き閉じます。

Sub OpenAndCloseAllXLSXFiles()
    Dim fso As Object
    Dim folderPath As String
    Dim folder As Object
    Dim file As Object

    ' フォルダのパスを指定します
    folderPath = Excel.ThisWorkbook.Path

    ' FileSystemObjectを作成
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    ' フォルダが存在するか確認
    If Not fso.FolderExists(folderPath) Then
        MsgBox "指定されたフォルダが存在しません。", vbExclamation
        Exit Sub
    End If

    ' フォルダ内のすべてのファイルとサブフォルダを処理
    ProcessFolder fso.GetFolder(folderPath)
    
    MsgBox "全てのファイルが処理されました。", vbInformation
End Sub

Sub ProcessFolder(folder As Object)
    Dim file As Object
    Dim subFolder As Object
    Dim wb As Workbook

    ' フォルダ内のすべてのファイルを処理
    For Each file In folder.Files
        VBA.DoEvents 'マウス操作可能にするの途中で止めれる。、処理中に変な操作厳禁
        If Excel.ThisWorkbook.Path & "\" & Excel.ThisWorkbook.Name <> folder & "\" & file.Name Then   '自分自身ファイルは開かない
            If Right(file.Name, 5) = ".xlsx" Then
                ' xlsxファイルを開く
                On Error Resume Next ' エラーを無視する
                Debug.Print file.Path 'イミディエイトウィンドウへ出力。ディバッグ用
                Set wb = Workbooks.Open(file.Path)
                If Not wb Is Nothing Then
                    Application.Wait Now + TimeValue("0:0:1")'1秒待つ
                    ' ファイルを閉じる
                    wb.Close False
                    Set wb = Nothing
                End If
                On Error GoTo 0 ' エラーハンドリングをリセット
            End If
        End If
    Next file

    ' サブフォルダを再帰的に処理
    For Each subFolder In folder.SubFolders
        ProcessFolder subFolder
    Next subFolder
End Sub
カテゴリー: 13 ファイル処理、メモ帳とのデータ処理 | コメントする

プロジェクトまたはライブラリが見つかりません。というコンパイルエラー

VBAコードのRangeの位置でエラーになる。

VBAのツールの参照設定で参照できないファイルがあるはず。私の場合、Rangeで名前の参照ができないエラーで遭遇する。Rangeは関係ない。参照設定を確認しましょう。

カテゴリー: とりあえず | コメントする

Exclマクロ特有?引数なしのプロシージャ

何それ?

文中に?があるし、変ですが。

「引数なしのプロシージャ」について語りたい。

世間で見るのは引数なしプロシージャ。引数?って方はこちら

メリット

  1. マクロ実行できる
  2. 引数が無いのでマウスクリックで実行できる
  3. デバッグ時の実行が簡単

デメリット

あるかな?

  1. 引数が無いと何を処理するプロシージャか一見わからない
  2. Excelのセルやグローバル変数を使いがち。で読みにくい?
  3. となると、プロシージャごとにExcelのセルやグローバル変数?をチェックが必要で。読みにくい

以下は、標準モジュールのコード

Option Explicit

Sub main()
    a
End Sub


Sub a(Optional x = 1)
    Debug.Print x
End Sub

aプロシージャは、引数があるから実行できない。いくらOptionalでも。しかし、mainは引数無しだからマウスクリックで実行できる。それに、マクロ登録も可能。

カテゴリー: Excel基本操作, 2 VBEを使うための基本操作と知識 | コメントする

ffmpegで複数の動画、一括再生スピードをアップ

再生スピードはスマホなら2倍程度なら可能です。でも4倍?Youtubeでも2倍までですね。

DaiGoさんが3倍速くらいで速聴すると右脳を開花させるらしいです。

で、ファイルがいっぱいあってファイル名も変えてコピーする。

そんなエクセルマクロをぐだぐだと作ってみます。

ffmpegのインストールと使い方はこちら

カテゴリー: 13 ファイル処理、メモ帳とのデータ処理 | コメントする

(応答なし)無限ループにならないようにする

無限ループになってもコードの一部はExcelの機能で復活します。

でも、コードを書くスピードが落ちるのでVBA.DoEventsを入れましょう。

Windowsというオペレーティングシステムは、メッセージを受け取って処理します。各ウィンドウがメッセージを受け取ります。ループ処理中にDoEventsを入れておくとマウス操作などを受け付けるので「応答なし」状態にならない。

Windowsメッセージは、マウスイベント、キーボード操作です。メッセージ番号は決まっているのでマウスの右か左かは受け取ったアプリ側で判断できます。

VBAの処理は、一行一行処理して途中に余計なWindowsからメッセージで処理手順が狂うといけないので(応答なし)となるのです。Windowsメッセージで受け取らないように以下のコマンドを実行することがある。

Excelにはイベント処理があり、イベントの処理中に同じイベントを受け取ると何度も実行してしまう。これを回避するために維持的にFalseにする。イベント処理の回避が続くとイベントを受け付けなくなるので必ずTrueする。

カテゴリー: 6 制御文と条件式  VBA | コメントする