• 車種別
  • パーツ
  • 整備手帳
  • ブログ
  • みんカラ+

カブゴンのブログ一覧

2020年05月31日 イイね!

例のExcelでオーディオのプレイリストを管理するプログラムができました

例のExcelでオーディオのプレイリストを管理するプログラムができましたこんにちは。
車やバイクのトラブルが発生したら、とりあえず KURE5-56 を噴射する男、カブゴンです。
これで大概のことは解決します。笑

今日はフィットのボンネットを開くと、ストラットタワーバーの取り付け部に腐食(錆)を発見した上に、結構浸潤が進んでいたため、カーマホームセンターでちょっと高級なやつを買ってきて噴射しておきました。
alt



さて、先月(だったっけ?)にブログに書いた、一生使えるカーオーディオのプレイリストを管理するExcel VBAが完成しました!!!!!!パチパチパチパチ

このプログラムは2段構えになっています。
まずは、パソコン内部や外付けHDD(SSD)に保存された音楽の一覧をExcel上に書き出し、データベース化するセクションです。
曲名のほか、アーティスト名、フルパス、再生用のハイパーリンクボタンが列記されます。
alt


そして、各曲を格納したいフォルダをプルダウンで選択し、
alt


次のセクションでは、フォルダ分け実行ボタンを押し、保存したいSDカードやUSBメモリを選択すると、あっという間に、各曲を振り分けてくれます。

下記にコードを記述しますが、作成途中は、楽曲一覧を取得する部分で、2層3層…と何層にもなるフォルダ分、取得プログラムを再帰させるところがチンプンカンプンでした。
一方、フォルダ振り分けの際も、3階層分のフォルダを自動生成させるので「また再帰かぁ」と思いましたが、コードを適当に書いてみたら意外とあっさり動きました。
本来ならエラーを出しそうなコードなのに何で動いたんだろう……?
まぁ動くんだからいっか!!(適当)

ではコードを…
(1)楽曲データを取得し一覧化する
――――――――――――――――――――――――――――――――――――――‐
Sub ファイルパス一覧作成()

    '≪A~E列の情報を書き込むセルとB1セルとI1をクリアし、F~H列のフォルダ分け欄は数式と値のクリアを最初に行う。ついでに、念のためそれ以外のセルもクリアする≫
    Range(Cells(3, 1), Cells(Rows.Count, 5)).Clear
    Cells(1, 2).Clear
    Cells(1, 9).Clear
    Range(Cells(3, 6), Cells(Rows.Count, 8)).ClearContents
    Range(Cells(3, 9), Cells(Rows.Count, Columns.Count)).Clear
    
  
    '≪取得したいフォルダをダイアログボックスを開いて選択する≫
    Dim 指定フォルダのパス As String
  
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "ファイル一覧を作成したいフォルダを選択してください"
        If .Show = -1 Then
            指定フォルダのパス = .SelectedItems(1)
            Cells(1, 2).Value = "情報を取得するフォルダ:" & 指定フォルダのパス
        Else
            MsgBox "中止しました。"
            Exit Sub
        End If
    End With
  
  
    '≪ファイルパス一覧を作成する≫
    Dim myFSO As New FileSystemObject
    Dim myRootFolder As Folder

    Set myRootFolder = myFSO.GetFolder(指定フォルダのパス)

    Cells(3, 1).Select 'ファイル情報を表示する最初のセルを選択する

    ファイルパス書出 myRootFolder '後述の「ファイルパス書出」を呼び出して実行する。
    
    Set myFSO = Nothing 'メモリリークによるエラーを防ぐためにFSOを終了させる
    
       
    '≪拡張子なしのファイル名を書き込む≫
    Dim objFSO As New FileSystemObject
    Dim 拡張子無ファイル名 As String
    Dim フルパス As String
    Dim 行数 As Long
    Dim 最終行 As Long
    
    最終行 = Cells(Rows.Count, 1).End(xlUp).Row
    
    For 行数 = 3 To 最終行
         
        フルパス = Cells(行数, 5).Value
        拡張子無ファイル名 = objFSO.GetBaseName(フルパス)
        Cells(行数, 2).Value = 拡張子無ファイル名
        
    Next 行数
    
    Set objFSO = Nothing  'メモリリークによるエラーを防ぐためにFSOを終了させる
    
    
    '≪アーティスト名を書き込む≫
    Dim Shell As Variant
    Dim Folder As Variant
    Dim 拡張子付ファイル名 As Variant
    Dim フルパスその2 As Variant
    Dim ファイルのフォルダパス As Variant
    Dim 行数その2 As Long
    Dim 最終行その2 As Long

    最終行その2 = Cells(Rows.Count, 1).End(xlUp).Row

    For 行数その2 = 3 To 最終行その2
        
        拡張子付ファイル名 = Cells(行数その2, 1).Value
        フルパスその2 = Cells(行数その2, 5).Value
        ファイルのフォルダパス = Replace(フルパスその2, 拡張子付ファイル名, "") 'フルパスから拡張子付ファイル名を抜くようにVBAのReplace関数を使った
        Set Shell = CreateObject("Shell.Application")
        Set Folder = Shell.Namespace(ファイルのフォルダパス)
        Cells(行数その2, 3).Value = Folder.GetDetailsOf(Folder.ParseName(拡張子付ファイル名), 20) 'アーティスト名の取得(引数20番がアーティスト名)と書き込み
        
    Next 行数その2

    Set Shell = Nothing  'メモリリークによるエラーを防ぐためにFSOを終了させる
    Set Folder = Nothing  'メモリリークによるエラーを防ぐためにFSOを終了させる
    
    
    '≪再生用ハイパーリンクを作る≫
    Dim フルパスその3 As String
    Dim 行数その3 As Long
    Dim 最終行その3 As Long
    
    最終行その3 = Cells(Rows.Count, 1).End(xlUp).Row
    
    For 行数その3 = 3 To 最終行その3
        
        フルパスその3 = Cells(行数その3, 5).Value
        ActiveSheet.Hyperlinks.Add Anchor:=Cells(行数その3, 4), Address:=フルパスその3, TextToDisplay:=Cells(行数その3, 2).Value
            
    Next 行数その3
    
    
    '≪最上段を表示した状態にしておきたいのでA3セルを選択状態にする≫
    Cells(3, 1).Select
    
     
    '≪最後に書き出しが完了したことをお知らせする≫
    MsgBox "ファイル情報の書き出しが完了しました。"

End Sub

Sub ファイルパス書出(ByRef myParentFolder As Folder)

    Dim myFolders As Folders
    Dim myFolder As Folder
    Dim myFiles As Files
    Dim myFile As File

    Set myFolders = myParentFolder.SubFolders

    If myFolders.Count <> 0 Then
        For Each myFolder In myFolders
            ファイルパス書出 myFolder
        Next myFolder
    End If

    Set myFiles = myParentFolder.Files

    If myFiles.Count <> 0 Then
        For Each myFile In myFiles
            With ActiveCell
                .Value = myFile.Name  'ファイル名を取得する
                .Offset(0, 4) = myFile.Path 'フルパスを取得する
                .Offset(1, 0).Select
            End With
        Next myFile
    End If
    
End Sub
―――――――――――――――――――――――――――――――――――――‐

(2)楽曲をフォルダ分けする
――――――――――――――――――――――――――――――――――――――‐
Sub 各曲をフォルダにコピーする()
    
    Dim 行数 As Long
    Dim 最終行 As Long
    
    最終行 = Cells(Rows.Count, 1).End(xlUp).Row


    '≪コピー先のドライブフォルダを指定する≫
    Dim 指定ドライブフォルダのパス As String
  
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "コピー先にしたいドライブフォルダを選択してください"
        If .Show = -1 Then
            指定ドライブフォルダのパス = .SelectedItems(1)
            Cells(1, 9).Value = "コピー先ドライブフォルダ:" & 指定ドライブフォルダのパス
        Else
            MsgBox "中止しました。"
            Exit Sub
        End If
    End With


    '≪第1階層に「車で聞かない」が入力されたときは第2,第3階層にも「車で聞かない」を入力する≫
    
    For 行数 = 3 To 最終行
        
        If Cells(行数, 6).Value = "車で聞かない" Then
            Cells(行数, 7).Value = "車で聞かない"
            Cells(行数, 8).Value = "車で聞かない"
        End If
    
    Next 行数


    '≪データコピー先のフルパスを作成する≫
    Dim データコピー先のフルパス As String
    Dim 第1階層のフォルダ名 As String
    Dim 第2階層のフォルダ名 As String
    Dim 第3階層のフォルダ名 As String
    
    For 行数 = 3 To 最終行
        
        第1階層のフォルダ名 = Cells(行数, 6).Value
        第2階層のフォルダ名 = Cells(行数, 7).Value
        第3階層のフォルダ名 = Cells(行数, 8).Value
        データコピー先のフルパス = 指定ドライブフォルダのパス & "\" & 第1階層のフォルダ名 & "\" & 第2階層のフォルダ名 & "\" & 第3階層のフォルダ名 & "\" & Cells(行数, 1).Value
        Cells(行数, 9).Value = データコピー先のフルパス
        
    Next 行数
    
    
    '≪フォルダを作成する≫
           
    '第1階層のフォルダ作成
    For 行数 = 3 To 最終行
        If Dir(指定ドライブフォルダのパス & "\" & Cells(行数, 6).Value, vbDirectory) = "" Then
            MkDir 指定ドライブフォルダのパス & "\" & Cells(行数, 6).Value
        End If
    Next

    '第2階層のフォルダ作成
    For 行数 = 3 To 最終行
        If Dir(指定ドライブフォルダのパス & "\" & Cells(行数, 6).Value & "\" & Cells(行数, 7).Value, vbDirectory) = "" Then
            MkDir 指定ドライブフォルダのパス & "\" & Cells(行数, 6).Value & "\" & Cells(行数, 7).Value
        End If
    Next
    
     '第3階層のフォルダ作成
     For 行数 = 3 To 最終行
        If Dir(指定ドライブフォルダのパス & "\" & Cells(行数, 6).Value & "\" & Cells(行数, 7).Value & "\" & Cells(行数, 8).Value, vbDirectory) = "" Then
            MkDir 指定ドライブフォルダのパス & "\" & Cells(行数, 6).Value & "\" & Cells(行数, 7).Value & "\" & Cells(行数, 8).Value
        End If
     Next


    '≪音楽ファイルを指定したフォルダにコピーする≫
    Dim コピー元のフルパス As String
    Dim コピー先のフルパス As String
    
    For 行数 = 3 To 最終行
        コピー元のフルパス = Cells(行数, 5).Value
        コピー先のフルパス = Cells(行数, 9).Value
        FileCopy コピー元のフルパス, コピー先のフルパス
    Next 行数


    '≪コピーがきちんと行われたか確認する≫
    Dim コピー先のフルパスその2 As String
    
    For 行数 = 3 To 最終行
        コピー先のフルパスその2 = Cells(行数, 9)
        If Dir(コピー先のフルパス) <> "" Then
            Cells(行数, 10).Value = "OK"
        Else
            Cells(行数, 10).Value = "NG"
        End If
    Next 行数
    
    
    '≪全ての処理が完了したメッセージを表示する≫
    MsgBox "コピーが完了しました。"
    
End Sub
――――――――――――――――――――――――――――――――――――――‐
おしまい。
Posted at 2020/05/31 14:27:03 | コメント(0) | トラックバック(0) | VBA備忘録 | 日記
2020年05月10日 イイね!

一生使えるカーオーディオのプレイリストを作るツールの開発を始めました

一生使えるカーオーディオのプレイリストを作るツールの開発を始めましたこんばんは。
明日から会社でお仕事。カブゴンです。

いきなりですが、僕は、車内でかける音楽に並々ならぬこだわりを持っています。
季節や昼夜、市街地かワインディングか等、それぞれのシーンに合わせてその都度フォルダを変えます。
しかし、自宅にある音楽のマスターデータは、曲を購入した月ごとにフォルダ管理しています。
ということは、カーオーディオに入れてあるSDカードのデータと自宅のSSDのデータで齟齬が発生してしまいます。そして、SDカードに入っているデータのフォルダ構成はSDカードのパソコンで中身を開かないとわからない状態になっています。
というわけで、自宅にあるマスターデータと車用SDカードデータの連携をきちんとデータベースで管理しながら、柔軟にSDカード内のフォルダ構成(プレイリスト)を変更できるツールをExcelで作ってやろうという企画を開始しました。完成すれば一生使える上に、応用すればスマホのGooglePlayMusicのプレイリストまでも連携させられる可能性を秘めているので結構便利そうです。。。

今日は、ダイアログボックスでフォルダを選択したら、一斉に、曲名とアーティスト名、フルパスをシートに書き込むようにするところまで作りました。その中で各ファイルのアーティスト名の取得に関して、「GetDetailsOf」というコードを使うのですが、ネットにもVBA辞典にも全然その情報が無くて、何回修正してもエラーの連発だったので疲れました。最後は、閉じ括弧の位置が違うだけのことに気づかずに30分以上苦戦してしまいました。(´;ω;`)
ホント、数学苦手なのに頭を使い過ぎて脳みそがブローするかと思いました。笑

音楽の趣味がバレてしますので恥ずかしいですが、今日の成果はこんな感じです。
alt


最後に備忘録としてコードも…
―――――――――――――――――――――――――――――――――――――――
Sub ファイルパス一覧作成()

    '≪A3以降のファイル情報を書き込むセルとD1セルを最初にクリアにする≫
    Range(Cells(3, 1), Cells(Rows.Count, Columns.Count)).Clear
    Cells(1, 2).Clear
    
  
    '≪取得したいフォルダをダイアログボックスを開いて選択する≫
    Dim 指定フォルダのパス As String
  
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "ファイル一覧を作成したいフォルダを選択してください"
        If .Show = -1 Then
            指定フォルダのパス = .SelectedItems(1)
            Cells(1, 2).Value = "情報を取得するフォルダ:" & 指定フォルダのパス
        Else
            MsgBox "中止しました。"
            Exit Sub
        End If
    End With
  
  
    '≪ファイルパス一覧を作成する≫
    Dim myFSO As New FileSystemObject
    Dim myRootFolder As Folder

    Set myRootFolder = myFSO.GetFolder(指定フォルダのパス)

    Cells(3, 1).Select 'ファイル情報を表示する最初のセルを選択する

    ファイルパス書出 myRootFolder '後述の「ファイルパス書出」を呼び出して実行する。
    
    Set myFSO = Nothing 'メモリリークによるエラーを防ぐためにFSOを終了させる
    
       
    '≪拡張子なしのファイル名を書き込む≫
    Dim objFSO As New FileSystemObject
    Dim 拡張子無ファイル名 As String
    Dim フルパス As String
    Dim 行数 As Long
    Dim 最終行 As Long
    
    最終行 = Cells(Rows.Count, 1).End(xlUp).Row
    
    For 行数 = 3 To 最終行
         
        フルパス = Cells(行数, 5).Value
        拡張子無ファイル名 = objFSO.GetBaseName(フルパス)
        Cells(行数, 2).Value = 拡張子無ファイル名
        
    Next 行数
    
    Set objFSO = Nothing  'メモリリークによるエラーを防ぐためにFSOを終了させる
    
    
    '≪アーティスト名を書き込む≫
    Dim Shell As Variant
    Dim Folder As Variant
    Dim 拡張子付ファイル名 As Variant
    Dim フルパスその2 As Variant
    Dim ファイルのフォルダパス As Variant
    Dim 行数その2 As Long
    Dim 最終行その2 As Long

    最終行その2 = Cells(Rows.Count, 1).End(xlUp).Row

    For 行数その2 = 3 To 最終行その2
        
        拡張子付ファイル名 = Cells(行数その2, 1).Value
        フルパスその2 = Cells(行数その2, 5).Value
        ファイルのフォルダパス = Replace(フルパスその2, 拡張子付ファイル名, "") 'フルパスから拡張子付ファイル名を抜くようにVBAのReplace関数を使った
        Set Shell = CreateObject("Shell.Application")
        Set Folder = Shell.Namespace(ファイルのフォルダパス)
        Cells(行数その2, 3).Value = Folder.GetDetailsOf(Folder.ParseName(拡張子付ファイル名), 20) 'アーティスト名の取得(引数20番がアーティスト名)と書き込み
        
    Next 行数その2

    Set Shell = Nothing  'メモリリークによるエラーを防ぐためにFSOを終了させる
    Set Folder = Nothing  'メモリリークによるエラーを防ぐためにFSOを終了させる
    
    
    '≪最上段を表示した状態にしておきたいのでA3セルを選択状態にする≫
    Cells(3, 1).Select
    
     
    '≪最後に書き出しが完了したことをお知らせする≫
    MsgBox "ファイル情報の書き出しが完了しました。"

End Sub

Sub ファイルパス書出(ByRef myParentFolder As Folder)

    Dim myFolders As Folders
    Dim myFolder As Folder
    Dim myFiles As Files
    Dim myFile As File

    Set myFolders = myParentFolder.SubFolders

    If myFolders.Count <> 0 Then
        For Each myFolder In myFolders
            ファイルパス書出 myFolder
        Next myFolder
    End If

    Set myFiles = myParentFolder.Files

    If myFiles.Count <> 0 Then
        For Each myFile In myFiles
            With ActiveCell
                .Value = myFile.Name  'ファイル名を取得する
                .Offset(0, 4) = myFile.Path 'フルパスを取得する
                .Offset(1, 0).Select
            End With
        Next myFile
    End If
    
End Sub
―――――――――――――――――――――――――――――――――――――――

おしまい。
Posted at 2020/05/10 22:49:34 | コメント(0) | トラックバック(0) | VBA備忘録 | 日記
2020年05月09日 イイね!

VBA備忘録 ~一覧から大量のフォルダを一括で作る~

VBA備忘録 ~一覧から大量のフォルダを一括で作る~こんにちは。
今日は『水曜どうでしょう』を見ながら爽やかな(?)朝を迎えました。カブゴンです。

『水曜どうでしょう』の中で個人的に好きな企画は、『シェフ大泉 夏野菜スペシャル』です。
『ど~も。奥さん。知ってるでしょう? 大泉洋でございます。』
『おいパイ食わねぇか?』
これは名言中の名言ですね。笑

さて、今日もVBA備忘録です。
エクスプローラーやサーバー上で大量にフォルダを作りたいとき、ありますよね??
その作りたいフォルダ名が連番のような規則性を持ったものだったり、あるいは、他のデータベースから引っ張ってきたものだったり。。。
このような時に、Excelで作った一覧から一括でフォルダが生成されたら便利だなぁと思い作ってみました。

コードはコチラ↓↓
―――――――――――――――――――――――――――――――――――
Sub 一覧からフォルダを一括作成するマクロ()
     
    '作成フォルダー一覧を作成したかどうかの確認のダイアログボックスを開く
    Dim 答え As Integer
    答え = MsgBox("作成フォルダ一覧.xlsに作成したいフォルダの名称を書きましたか?", vbYesNo + vbQuestion + vbDefaultButton2, "確認")
    
    '「はい」が押された場合はフォルダ作成を実行する
    If 答え = vbYes Then
    
        '作成フォルダ一覧.xlsのパスを定義する
        Dim 作成フォルダ一覧のパス As String
    
        作成フォルダ一覧のパス = ThisWorkbook.Path & "\作成フォルダ一覧.xls"
    
       '作成フォルダ一覧を開く
        Workbooks.Open Filename:=作成フォルダ一覧のパス
    
        '作成フォルダ一覧の最終行を取得する
        Dim 最終行 As Long
        最終行 = Cells(Rows.Count, 1).End(xlUp).Row
        
        'フォルダを作成する
        For i = 2 To 最終行
            MkDir ThisWorkbook.Path & "\フォルダ作成先\" & Cells(i, 1).Value
        Next

        '作成フォルダ一覧.xlsを閉じて完了のメッセージを表示する
        Workbooks("作成フォルダ一覧.xls").Close
        MsgBox "完了しました。【フォルダ作成先】フォルダを確認してください。"

    '「いいえ」が押された場合はフォルダ名称の入力を促すメッセージを表示する
    Else
        MsgBox "作成フォルダ一覧.xlsに入力してから再度このVBAを実行してください。"
        
    End If

End Sub
―――――――――――――――――――――――――――――――――――

動作説明
①フォルダ構成・ファイル構成は以下と同じにしてください(そうでないと正しく動きません)。
alt


②生成したいフォルダ名を【作成フォルダ一覧.xls】のA2セルから縦方向に記述してください。
alt


③コードが記述してある実行ファイルでVBAを実行してください。

④【フォルダ作成先】フォルダに生成が完了されましたので、適宜必要な場所にフォルダを移してください。
alt


という感じです。
ちなみにExcelのバージョンは2010です。今回のコードは単純なので最新のExcelでも動くと思いますが、検証はしていません。
今回のVBAは、全ての動作が限られたフォルダの中だけで実行されるようにしてありますが、一応実行させる際は自己責任ということでお願いいたします。

おしまい。
Posted at 2020/05/09 13:35:49 | コメント(0) | トラックバック(0) | VBA備忘録 | 日記
2020年05月07日 イイね!

VBA備忘録 ~表の最終行を取得する~

こんばんは。
再び在宅勤務になりました。カブゴンです。
やはり在宅勤務は己との戦いです。

さて、今日から新企画です。
私の仕事では、データベースをよく取り扱います。
使うソフトウェアとしては、Microsoft AccessやExcelが多いです。
しかし、関数で事足りることも多々あるのですが、やっぱりVBAを使った方が早いことも多いです。
しかし、VBAは複雑なコードが多すぎて、数日前に覚えた事でもすぐ忘れてしまいます。
そもそも、コードを覚えるよりも、書籍やホームページのどこに何が書いてあるかを覚えて、その都度参照した方が効率が良いと思います。
というわけで、自分の備忘録がてら、このブログに頻出度の高いコードを綴っていこうと思います。

第1回はExcel VBAにおける表の最終行取得です。
このコードはデータベースから個別帳票に転記するときに必要になります。
繰り返しの構文「For」を使う時の終了を記述するためには必須です。

Dim 最終行 As Long

最終行 = Cells(Rows.Count, 1).End(xlUp).Row

セル(A1048576) から Ctrl+↑のセル の 行番号

詳しくは「エクセルの神髄」のホームページを参照です。

おしまい。
Posted at 2020/05/07 19:46:24 | コメント(0) | トラックバック(0) | VBA備忘録 | 日記

プロフィール

「今年の桜 http://cvw.jp/b/2574415/44990156/
何シテル?   04/04 16:54
カブゴンと申します。 日記をつけてみようと思い、みんカラを始めました。 よろしくお願いします。
みんカラ新規会員登録

ユーザー内検索

<< 2025/8 >>

     12
3456789
10111213141516
17181920212223
24252627282930
31      

リンク・クリップ

リコールとナット 
カテゴリ:その他(カテゴリ未設定)
2019/12/07 16:08:25

愛車一覧

ホンダ スーパーカブ90 ホンダ スーパーカブ90
ホンダの超ロングセラー、スーパーカブの90ccモデルに乗っています。主に通勤用です。 4 ...
ホンダ フィット ホンダ フィット
ホンダ フィット(GD3型)に乗っています。 この車は週末にお出かけするのに乗るのがメイ ...
マツダ ロードスター マツダ ロードスター
マツダが『人馬一体』をコンセプトに開発した2シーターオープンカーであるロードスターの二代 ...
トヨタ アルテッツァ トヨタ アルテッツァ
安かったので衝動買いしてしまいました。 青色のアルテッツァ(RS200, 5AT)です。 ...
ヘルプ利用規約サイトマップ
© LY Corporation