忍者ブログ
27 April

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

12 September

【Excel/VBA】ワークブック全体か、ワークシート単品をクリアーするだけ

昨日はシートを埋めるモジュールだったので、今日はクリアーするモジュール。

デバッグ含めて10分くらいでできないかなと思ったが、20分くらいかかってた。ちぇっ

Worksheets.Countとかわざわざ格納してるのは、.Cells.Clearのところも一行でできないかなと思ったからなんだけど、考えてる間にこっちの方が簡単だってなってしまって産廃。エラーハンドラの無責任っぷりパネェので見ても真似しないでね。

あと、わざわざSet ~NothingとかRidim ~(0)とか要るの?って話なんだけど、この「モジュールごとのメモリの解放は自動」というエクセルの仕様が割と胡散臭くて、そうでもない事があったり無かったりみたいなので、これ癖にしておかないと、ちょっと大きなツール作るときにメモリが死ぬ。

パブリックの関数や変数や定数量産しても死ぬ。経験則。

'-----------------------------------------------------------------------------
Public Sub morning2013_9_12(Workbook_Or_Worksheet As Variant)
Dim wkTgt As Object, wkTgType As Byte, i() As Long

On Error GoTo Err_Get

wkTgType = 0

Select Case TypeName(Workbook_Or_Worksheet)
Case "Workbook", "Worksheet"

ReDim i(1)

i(1) = 1
wkTgType = 2
Set wkTgt = Workbook_Or_Worksheet

If TypeName(Workbook_Or_Worksheet) = "Workbook" Then
wkTgType = 1
i(1) = wkTgt.Worksheets.Count
End If

Case Else

MsgBox "渡し値が無効です。ターゲットの判定ができません。処理は失敗しました。", , "【" & ThisWorkbook.Name & "】"
Exit Sub

End Select

If wkTgType = 1 Then

For i(0) = 1 To i(1)

wkTgt.Worksheets(i(0)).Cells.Clear

Next

Else

wkTgt.Cells.Clear

End If

Set wkTgt = Nothing
ReDim i(0)

Exit Sub
Err_Get:

Debug.Print Err.Number & " " & Err.Description
Resume Next

End Sub
'-----------------------------------------------------------------------------

拍手

PR