気まぐれブログパーツ

  • SAMURAI&DRAGONS
  • 炎の刃 大谷晋二郎
  • 風量・風力予報
  • つぶやいた~
  • Xbox360
  • 骨髄バンク

アソシエイト

買おうぜプロレスの向こう側

July 2021
Sun Mon Tue Wed Thu Fri Sat
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

Excel

2011.07.31

我流Excelマクロの基本~ExcelVBAでMP3整理その1~

前回は第0回として動機と目的、そしてオススメのExcelマクロの基本サイトを紹介しました。続けて今回も基本的な内容をおさらいしつつ、8BitPC時代のBASICを懐かしむネタを挟んでいきましょう。

なお、マジメにExcelマクロを勉強したい方は、前回の記事で紹介したリンクや次のサイトなどをご覧ください。

Excelのマクロ・VBA塾
http://kabu-macro.com/index.html
初心者の方は、上記サイトの自動記録から覚えると良いでしょう。

前回も紹介しましたが、次の初期設定を行った上での画面スナップを使います。
Excelでお仕事!お勧めの初期設定
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_040.html
Excelマクロを覚えようと思った時にとてもお世話になったので、身についたと言える今でも一番最初に初心者へ伝えることは「初期設定は上記サイトを見て準備して下さい。」と言ってるくらいです。

話は飛びますが、私がExcelマクロを覚える必要に駆られたのは、集計関係の業務を担うようになったからですが、もともと30年くらい前の8BitPC時代にFM-NEW7でF-BASIC3.0で遊んでおりました。

BASICの基本はその時に覚えたので、仕事でVBAを扱い始めても馴染むのは早かったです。ことわざで「好きこそものの上手なれ」とありますが、ぶっちゃけゲームを作りたくて覚えようとしてすぐに挫折したので、言うほど「好き」ではありません。

しかし仕事なのでせざるを得ない状況のため、右も左もわからないVBAでしたが「勉強して給料が貰える。(懐かしんでて業務時間を潰せる。)」と前向きに考えて乗り切ることができました。

そんな訳で、ン十年ぶりに触るBASIC言語ですが。まず驚いたのが環境の進化です。上記サイトの色変えくらいは驚きませんが、ステップ実行とローカルウィンドウの変数表示などの便利さは「タダ(Officeが標準ならば・・・ですが。)でこんな開発環境がついてるなんて!」とMicrosoft信者になりそうでした。

昔のF-BASICでは、バグ探しに「TRON」(トレースオン)ってコマンドがあったんですが、一行ごとに実行を表示させる機能なので、ソレを使うと文字通り「表示」されて本来求めていた表示が壊れてしまう弊害があったんですね。

F-BASICとExcelVBA、比べてみるとこんな感じでしょうか。

20110731_001

20110731_002_4

なお、エミュレータ画面はXM7から使用しています。
FM-7エミュレータ XM7
http://retropc.net/ryu/xm7/xm7.shtml
吸出し方も解説いただいているので、AVなら本体だけでモニターが無くてもナントカなります。8BitPCに思いを馳せる方、AVなら今でも見つかりますので早めに保護しておくと良いでしょう。

さて、そろそろ本題に入りましょう。

本来なら何をどうしたいのかまとめて、フローチャートとかにするんでしょうが、男の料理にレシピは要らぬ!・・・って違うけど、私はとりあえずプロシージャーを書き始めるところから考えます。

っていうか、フローチャートを作ったりするのが面倒なだけですが、そもそも売り物にする訳でもないから動けばOK。動かなかったら回避方法を考えれば良いだけなので、突き進んでナンとかします。

20110731_003
まずは、普段使っている「自パス」などの変数指定から始めます。

本職のプログラマーじゃないので、変数のつけ方も漢字(2バイト文字)を平気で使います。さらにオブジェクト指向プログラミングなんて身についてませんので、結果論ならともかくとりあえず一つプロシージャーを作って使えそうな部分をコピペして再利用しております。

続いて、各種情報を入れるための配列変数です。

とりあえず「10000」にしてますが、Excel2003の行数を考えれば「65000」くらいにしておく方が良いかもしれませんが、メモリ不足の発生は避けたいところなので少なめにしておきます。ちなみに私のMP3ファイル数は6000未満でした。足りないと思われる方は適当に増やしてください。

・・・と・・・今回の記事も長くなったので、ロクに進んでませんがこの辺りで第一回終了としましょう。週一くらいで更新したいと思っておりますが、これまた面白いゲームがあれば浮気する程度のモチベーションなので、更新頻度や完成時期は全く未定ということでノンビリ進めるとします。

最後にお約束:
当ブログで紹介するExcelマクロに関する内容・配布ファイルなどで、どんな損害を被っても一切関知しません。自己責任でお願いします。また、コメントでご質問などを頂いても、自分のブログを見直す事は滅多にしませんので、twitterなどで一声かけて頂く方が気づきやすいです。アカウントについては、プロフィールページをご確認ください。

2011.07.23

MP3ファイルの整理をしたい!~ExcelVBAでMP3整理その0~

ふと、HDD容量が気になり始めました。

数ヶ月前に新PCを買ったんですが、調子に乗ってメインドライブをSSD(notスコット・スタイナー・スクリュードライバー)にしたため、言う程の空き容量はありません。

さらにiTunesと連動させてiPhoneを活用しているんですが、オーディオファイルの容量が10GBを超えています。・・・そもそも、ランダムで聞いているとそれほど好きでもないゲーム効果音が延々と流れたりします。

そもそも私は根っからのゲーマーで、聞く曲目はゲーム関係が主です。特にセガOutRunの曲はSEGAマーク3のFM音源パックの曲ですらカセットテープに入れて聴きまくっているほどでした。そして初任給でソニーのウォークマンを購入し、その音質とステレオ効果に感動したのもつかの間、うっかりおっことして早々と故障させた暗い記憶があります。

そんな私ですから、携帯プレイヤーの進化(というより、低価格化)には興味があり、MP3プレイヤーが広まった時期にはMP3化(リッピング)の方法や加工についてはそれなりの知識がありました。

CDを買ってきてMP3化して携帯プレイヤーに取り込むにしても。当時は結構複雑な手順が必要で、ネットでタグ情報を補完してくれる機能もなかったので自分でファイル名(曲名)から設定したものです。

今はCDを放り込むと、自動でiTunesに取り込み、さらにiPhoneへ連動して意識せずとも携帯プレイヤー(兼電話)に取り込まれる良い時代になったもんです。ちょうどクラブニンテンドーから届いてたゼルダの伝説のサントラCDを取り込んでみました。

20110723_01

ゼルダの伝説 時のオカリナ3D オリジナルサウンドトラック
http://www.nintendo.co.jp/3ds/aqej/soundtrack/

が・・・しかし・・・。

そんな今の便利さはともかく、過去のライブラリーは古いままです。ファイル名に全角文字を使っていたり、ツールの禁則文字を避けるために今見直すと許せないタイトルだったり、さらにはアレンジバージョンが多すぎて同じ曲名を避けるためのルールがマチマチでわかりにくかったりします。

さらにはバックアップ用にCDやDVDへ焼いたり、はたまたHDDが壊れた時に無理やりサルベージしたりしたので重複してしまっているのも沢山あります。そもそもサントラ系は同じ曲が違うCDでダブることもありますからね。

そんな訳でMP3管理ソフトを試してみましたが、iTunesを始めイロイロとありますけど整理すること(ファイルの削除、移動)を念頭に置いたソフトはあまり見ないため「無かったら作ってしまえホトトギス」ということで、自作しようという結論に至りました。

とにかく自分が満足いく整理方法を実行するには「ファイル名」「保存パス」はもちろん「アルバム」「アーティスト」「曲の長さ」などの情報が必要です。MP3の規格をWikiで確認しつつ先ほどのサントラからMP3タグ情報はどうなっているのか、バイナリーエディタで調べてみました。

20110723_02

うむ、これならイケそうだ。

ちなみに私の Excel そして、VBA(マクロ)に関する知識は大したこと有りません。以前もネタにしましたが、大して作りこんだりしないのでエラー処理を放置したりします。

前回のネタ:ニコニコ生放送 放送履歴取得Excelマクロ
http://gamearc.cocolog-nifty.com/best/2010/11/excel-e507.html
(レイアウトとか変更になっているので、もう使えないかもしれません。)

前置きのつもりが長くなってきたので、今回のブログ記事は準備編ということでExcelマクロのお気に入りリンク集としておきましょう。

次に紹介するサイトでExcelVBAの基本を勉強しました。ここまで読まれた方は言うまでもありませんが、私のブログ記事は適当なので、マジメにExcel VBA を勉強したい方は次のサイトをオススメします。

Excelでお仕事!
http://www.asahi-net.or.jp/~ef2o-inue/top01.html
超オススメ・・・っていうか必須。→お勧めの初期設定
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_040.html

すぐに役立つエクセルVBAマクロ集
http://www.asahi-net.or.jp/~zn3y-ngi/index.html

そして「Excel」「VBA」「MP3」「タグ情報」で検索してみますと、バイナリーエディタでワザワザ調べたりしなくても解説しているサイトがありました。

Office TANAKA
MP3の「曲の長さ」を調べる
http://officetanaka.net/other/extra/tips16.htm

今回使用したバイナリーエディター
Dump4w バイナリエディタ
http://www.asahi-net.or.jp/~uq7k-hrsm/

お約束:
当ブログで紹介するExcelマクロに関する内容・配布ファイルなどで、どんな損害を被っても一切関知しません。自己責任でお願いします。また、コメントでご質問などを頂いても、自分のブログを見直す事は滅多にしませんので、twitterなどで一声かけて頂く方が気づきやすいです。アカウントについては、プロフィールページをご確認ください。

2010.11.13

ニコニコ生放送 放送履歴取得Excelマクロ

お気に入りのニコニコ生放送を見ていて、コミュニティの放送履歴を全部取得して整理したくなりました。

私の好きな生放送主さんは、色々なレトロゲームを生放送されています。

ふと・・・
「あのゲームの生放送は何枠かかったんだろう?」
「あのゲームの生放送は何時頃クリアしたんだろう?」

そんな疑問に行き着き、つい取得したくなった訳ですが、ニコニコ生放送の放送履歴ページを、1ページずつクリックして表示させるのは大変です。

王様フラッ○ーだけで360枠突破・・・12ページ・・・いや、なんでもないです。

話は飛びますが、現在の仕事はExcelのマクロに接する機会が多く・・・っていうかそればっかりになってきてるので、Webからの情報取得はお手の物です。WEBクエリやIE操作、果てはソースを取得してhtmlタグを解析したり・・・いや愚痴になるのでやめましょう。
話は戻って「じゃあ、つくってみるか・・・」と、有給休暇で連休を作った初日に、何故か仕事と変らない事に手をつけてしまいました。

単純に取得するだけのマクロなら2時間くらいで作れたんですが、なんとなく需要がありそうなので、できるだけ分かりやすいマクロに改良していると4時間くらいかかってしまいました。・・・さらに、予約枠の場合「開場」なんて行があるため、その法則崩れ対策&取得やりなおしで+1時間、結局5時間もマクロを組んでいたことになります。

・・・まぁ、好きなんでしょうね、この程度のプログラミングなら。今の部署に移って来てからストレスはあまり感じませんからね。

せっかくですから、ブログネタにします。

ニコニコ生放送 放送履歴取得Excelマクロ
http://homepage2.nifty.com/gamearc/Free/niconamacro.zip

使用方法は、設定シートにコミュ番号を入れて、実行してください。

環境にもよりますが、1ページ10秒前後で取得できると思います。
あとはメッセージが出るまで待つだけです。

Niconamacro

保存は行っておりませんので、必要なシートだけ別ファイルに保存するといいでしょう。念のため、設定シートのF列を見て前後のURLをブラウザで開いて確認して下さい。

ハッキリ言って、バグやしょうもないミスは沢山してると思います。

ほぼ全ての終了パターンがエラー処理で終わる仕組みなので、あまり褒められたプログラムじゃありません。また、サイトのレイアウトが変わると対応できない仕様です。

注意:放送履歴が無いコミュ番号などを入れて実行するといきなりエラーになります。
使用・改造については、すべて自己責任でお願いします。
コメントを入れまくってますので、それなりに理解しやすいと思います。
「全てのエラー」=「取得部分が無い」と判断して、取得終了との表示がでます。

なお、設定シートは関数でURLを作っているだけなので、F11~F2011までにURLを入れることと「作業用」シートさえあれば文末に公開するプロシージャーをモジュールにいれて実行できます。

そのため「興味はあるけど変なウィルス絡みだったら嫌だな~」って方は、必要な部分を自由にパクッてご活用ください。

--------------

Option Explicit

Sub ニコ生履歴取得()

' ニコニコ生放送履歴取得Excelマクロ by Rei2793
'
'
' WEBの取得方法は、「WEBクエリ」や「IEを操作」「ソースを取得」など色々ありますが
' 今回は頒布用になるべく手順が見えるよう、「ブックを開く」でURLを入れる方法を取ります。
'
' 変数を指定します。構想では色々考えていたので、使ってない変数が沢山あります。

'追記:変数の指定を一度に行ってますが、この方法は右端以外は「Variant」形式となります。 

    Dim URL行, URL列, 判定行, X As Long           '行数、列数を指定 URL用と判定用 そして配列変数用のX
    Dim 行, 列, 読行, 読列, 書行, 書列 As Long    '行数、列数を指定 読み込み用と書き込み用
    Dim 自ブック, 自シート As String              'ファイル名・シート名変更に対応するための文字列指定
    Dim 履歴ページ As String                      '履歴ページの文字列指定
    Dim 保存先, ファイル名   As String            '保存先、ファイル名用文字列指定
    Dim コミュ番号, 履歴URL As String             '履歴URL用文字列指定
    Dim 放送日時(30)  As Date                     '取得用日時を配列変数に指定 1to30 ・・・いやなんでもないです
    Dim 放送主(30), タイトル(30) As String        '取得用文字列を配列変数に指定
    Dim 説明文(30), 開演(30) As String            '取得用文字列を配列変数に指定
    Dim シート判別 As Object                      'ワークシート用オブジェクト指定

   
On Error GoTo エラー処理                      'エラー処理=取得完了と判断します。

    Application.DisplayAlerts = False             '警告メッセージを出さない

' ここから実行用のプロシージャー

    自ブック = ActiveWorkbook.Name                'ThisWorkBook.Name でもいいです。
    自シート = ActiveSheet.Name
   
    Workbooks(自ブック).Activate                  'ブック指定
    Sheets("作業用").Select                       '作業用シートをクリア
    Range(Cells(2, 1), Cells(65536, 256)).Select  '2行目以降を直接選択し、
    Selection.Delete Shift:=xlUp                  '問答無用で削除

    書行 = 2
   
    Sheets(自シート).Activate                     'シート指定
    Range("F11:F2011").ClearContents              '取得完了マークをクリア
   
    コミュ番号 = Cells(6, 2)
   
    For Each シート判別 In ActiveWorkbook.Sheets  'ワークシートの数だけ繰り返す
      If コミュ番号 = シート判別.Name Then        'コミュ番号のシートがあれば
        Sheets(コミュ番号).Delete
      End If
    Next
   
   
   
' 履歴用URLを読み取り、なくなるまでループします。

    URL行 = 11                                    'URLの行数を代入。
    Do While Cells(URL行, 2) <> ""                'URL列の文字列がなくなるまでループします。
      
      Workbooks(自ブック).Activate                'ブック指定
      Sheets(自シート).Select                     'シートの指定
      
      履歴URL = Cells(URL行, 5).Value             'URLにリンク先を入れます。
      If URL行 > 11 Then Cells(URL行 - 1, 6) = "取得完了"    '前行がうまくいったと仮定して記しを入れます。
      
      
'「ブックを開く」でURLを入れ 読み取り専用で開きます。(警告メッセージは止めておりますが・・・)
      Workbooks.Open Filename:=履歴URL, ReadOnly:=True
      履歴ページ = ActiveWorkbook.Name            '履歴ページのブック名を取得
      
      Workbooks(履歴ページ).Activate          'ブック指定
      
      判定行 = 1: X = 1                           '1行目から読み取って判定に利用します。配列変数も1から。
      
      Do While 判定行 < 200                      '200行までループ (200というのは適当)
'読み取り

        Workbooks(履歴ページ).Activate          'ブック指定
        If Cells(判定行, 1) = "放送日時" Then     '放送日時の文字列を見つけたら end if まで実行
         
          読行 = 判定行 + 1
         
          X = 1
          Do While X <> 31                        'Xが31以外ならループを続ける
          '「ぎゃぁぁぁぁ 予約枠には「開場」って行があって法則が崩れた~!」対策
            
            If Left(Cells(読行, 1), 2) = "20" And Mid(Cells(読行, 1), 5, 1) = "/" Then  '日付っぽいなら
            
                放送日時(X) = Cells(読行, 1)
                  放送主(X) = Cells(読行, 2)
                タイトル(X) = Cells(読行, 3)
                  説明文(X) = Cells(読行, 4)
            
              If "開場" = Left(Cells(読行 + 1, 1), 2) Then                '開場の特殊対応
                開演(X) = Right(Cells(読行 + 2, 1), 5)  '開演だけ特殊なので、右から5文字を代入
                Else
                開演(X) = Right(Cells(読行 + 1, 1), 5)  '開演だけ特殊なので、右から5文字を代入
              End If
               
              X = X + 1                    '日付行が見つかる=代入が完了したと判断して次の配列変数へ
          
            End If
            読行 = 読行 + 1
            If 読行 = 10000 Then Exit Do   '読込行が10000行を超えたら終了

          Loop
       
       
'作業用に書き込み
         
          Workbooks(自ブック).Activate                'ブック指定
          Sheets("作業用").Select                     'シートの指定
         
          For X = 1 To 30                             '配列に代入しただけ繰り返す
            Cells(書行 + X - 1, 1) = 放送日時(X)      '美しない数式・・・orz
            Cells(書行 + X - 1, 2) = 開演(X)
            Cells(書行 + X - 1, 3) = 放送主(X)
            Cells(書行 + X - 1, 4) = タイトル(X)
            Cells(書行 + X - 1, 5) = 説明文(X)
            Cells(書行 + X - 1, 6) = Now              '取得日時を入れます。
          Next
          書行 = 書行 + 30                            '一ページ30履歴と判断して。法則崩れたらごめんなさい。
            
        End If
        判定行 = 判定行 + 1                          '次の行へ
      Loop
   
      Workbooks(履歴ページ).Activate                    'ブック指定
      ActiveWindow.Close                                '履歴ページを閉じる。
   
      
      URL行 = URL行 + 1
      Workbooks(自ブック).Activate                  'ブック指定
      Sheets(自シート).Activate                     'シート指定

    Loop
    Workbooks(自ブック).Activate                  'ブック指定
    ThisWorkbook.Sheets("作業用").Copy after:=Sheets(コミュ番号)    '作業用シートを複写

    Workbooks(自ブック).Activate                  'ブック指定
    Sheets(コミュ番号).Select                     'シートの指定
   
    MsgBox "取得完了しました。(注意:保存は行ってません。)"

    Application.DisplayAlerts = True              '警告メッセージを出す

Exit Sub

エラー処理:
   
    Workbooks(自ブック).Activate                  'ブック指定
    ThisWorkbook.Sheets("作業用").Copy after:=Sheets(コミュ番号)    '作業用シートを複写

    Workbooks(自ブック).Activate                  'ブック指定
    Sheets(コミュ番号).Select                     'シートの指定
   
   
    Application.DisplayAlerts = True              '警告メッセージを出す

    MsgBox "取得完了したかも。(注意:保存は行ってません。)"

End Sub