アドベントカレンダー 1日目
今日はすごい捗ったなぁ。。
なんて日があってどれくらいの行数書いたんだろ?
なんて思うことありますよね。
はい。
あります。
ということで、行数を調べてみます。
VBE側のVBProjectというオブジェクトにアクセスできればわかります。
ただ、デフォルトではアクセスすることができないので
VBProjectにアクセスできるようにしましょう。
※以下はoffice2003の場合です
Excelのメニューバーで
[ツール]→[マクロ]→[セキュリティ]を選択
セキュリティのウィンドウが開いたら
[信頼できる発行元]のタブを選択
Visual Basic プロジェクトへのアクセスを信頼する
にチェックを入れます。
なんでデフォルトでアクセスできないかって?
そりゃ、コードの書き換えとかもできちゃうんで、全コード削除から
悪さをするコードの挿入までできちゃうので、任意で管理してくださいね。
っていうことです。
では、さっそくコードです。
やっていることは、各コンポーネントオブジェクト(モジュールとかクラスとか)をループで取り出し
それらの全コードを改行でスプリットすることで桁数を割り出しているだけです。
実行するとコンポーネント名(シート名、モジュール名、クラス名などなど)と共に各行数が出力されます。
ちょっと見栄えば悪いですね。
見栄えを整えてみましょうか。
コンポーネント名は左揃え、行数は右揃えにしてみましょう
今日はすごい捗ったなぁ。。
なんて日があってどれくらいの行数書いたんだろ?
なんて思うことありますよね。
はい。
あります。
ということで、行数を調べてみます。
VBE側のVBProjectというオブジェクトにアクセスできればわかります。
ただ、デフォルトではアクセスすることができないので
VBProjectにアクセスできるようにしましょう。
※以下はoffice2003の場合です
Excelのメニューバーで
[ツール]→[マクロ]→[セキュリティ]を選択
セキュリティのウィンドウが開いたら
[信頼できる発行元]のタブを選択
Visual Basic プロジェクトへのアクセスを信頼する
にチェックを入れます。
なんでデフォルトでアクセスできないかって?
そりゃ、コードの書き換えとかもできちゃうんで、全コード削除から
悪さをするコードの挿入までできちゃうので、任意で管理してくださいね。
っていうことです。
では、さっそくコードです。
Option Explicit
Sub SampleCode()
Dim ComponentName As String
Dim i As Integer
Dim SplitData As Variant
With ThisWorkbook.VBProject
For i = 1 To .VBComponents.Count
ComponentName = .VBComponents(i).Name
With .VBComponents(ComponentName).CodeModule
SplitData = Split(.Lines(1, .CountOfLines), vbCrLf)
Debug.Print ComponentName & ":" & UBound(SplitData)
End With
Next
End With
End Subやっていることは、各コンポーネントオブジェクト(モジュールとかクラスとか)をループで取り出し
それらの全コードを改行でスプリットすることで桁数を割り出しているだけです。
実行するとコンポーネント名(シート名、モジュール名、クラス名などなど)と共に各行数が出力されます。
ThisWorkbook:8 Sheet1:1 Sheet2:1 Sheet3:1 Code1:852 SampleCode:20 Code2:11600
ちょっと見栄えば悪いですね。
見栄えを整えてみましょうか。
コンポーネント名は左揃え、行数は右揃えにしてみましょう
Option Explicit
Sub SampleCode()
Dim ComponentName As String
Dim ComponentLineData As New Collection
Dim FormatStyle1 As String
Dim FormatStyle2 As String
Dim i As Integer
Dim MaxStringLen As Integer
Dim MaxValueLen As Integer
Dim SplitData As Variant
With ThisWorkbook.VBProject
For i = 1 To .VBComponents.Count
'コンポーネント名を取得
ComponentName = .VBComponents(i).Name
With .VBComponents(ComponentName).CodeModule
SplitData = Split(.Lines(1, .CountOfLines), vbCrLf)
ComponentLineData.Add Array(ComponentName, UBound(SplitData))
'コンポーネント名で最大文字数を取得
If MaxStringLen < Len(ComponentName) Then _
MaxStringLen = Len(ComponentName)
'行数の桁数で最大文字数を取得
If MaxValueLen < Len(CStr(UBound(SplitData))) Then _
MaxValueLen = Len(CStr(UBound(SplitData)))
End With
Next
End With
'コンポーネント名は左揃え、行数は右揃えにする
FormatStyle1 = "!" & String(MaxStringLen, "@")
FormatStyle2 = String(MaxValueLen, "@")
For i = 1 To ComponentLineData.Count
Debug.Print Format(ComponentLineData.Item(i)(0), FormatStyle1) & ":" & Format(ComponentLineData.Item(i)(1), FormatStyle2)
Next
Set ComponentLineData = Nothing
End Sub
実行結果は以下の通りです。
ThisWorkbook: 8 Sheet1 : 1 Sheet2 : 1 Sheet3 : 1 Code1 : 852 SampleCode : 44 Code2 :11600これなら見やすいですね!
0 件のコメント:
コメントを投稿