つらつら Excel VBA

私の備忘録です。

オートフィルタ

'オートフィルタで絞り込み、必要列だけデータを取得する。
searchData = "*条件を含む*"
wsh.AutoFilterMode = False 'オートフィルタ解除
wsh.Range("A1").CurrentRegion.AutoFilter Field:=1, Criteria1:=searchData
Set targetRange = wsh.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible)

For Each c In targetRange
    '1行目以外かつ5列目(タイトル行以外の指定データ列)
    If c.Row > 1 And c.Column = 5 Then
        getData = c.Value
    End If
Next c

Set targetRange = Nothing

シートコピー失敗

wsh.Copy After:=ThisWorkbook.Worksheets(1)

Excel2007以降の環境で上記のコードをExcel2003(*.xls)ファイルで実行すると失敗する。

 

原因

扱うことのできるExcelシートの行数、列が異なるため。

行・列数をExcelのバージョン毎に覚えるのは嫌なので、どうしても知りたいときは知りたいバージョンのExcelで縦横にスクロールしる。

 

対策方法

Excel2007以降のファイル形式で保存しなおし、ファイルを開きなおす

※保存直後に実行しても失敗します。

ブックのパスワード解除

On Error Resume Next

SendKeys "{ESC}"
Dim wb As Workbook
Set wb = Workbooks.Open(fileName:=target_path, Password:="Password")

If ActiveWorkbook.Name = FileName Then
    Debug.Print "開きました。"
End If

On Error GoTo 0
Set wb = Nothing

シートの保護解除

Dim wsh As Worksheet
Set wsh = ThisWorkbook.ActiveSheet

If wsh.ProtectContents Then
    wsh.Unprotect Password:="Password"
End If

wsh.Protect Password:="Password"

Set wsh = Nothing

※シート保護されていれば保護解除し、最後にシート保護をする。意味無い

サービスを起動するバッチファイル

@echo off

echo.
echo ============================================================
echo サービスSQLServerを起動します。
echo.
echo 本バッチファイルは管理者権限で実行して下さい。
echo ============================================================
echo.

pause

echo.
echo.
echo 処理を開始しました。処理が終了すると本ウィンドウは終了します。
echo.

rem ■サービスを起動
net start "SQL Server (SQLEXPRESS)"

※メモ帳で上記をコピペし、拡張子.batで保存。
管理者権限で実行する方法は、右クリックすれば分かる。