시트를 반투명하게

반투명 Window



일부 텍스트 편집기 또는 의사 단말 소프트웨어 등은 창을 반투명하게 설정할 수 있습니다. 배경에서 무언가 움직이고 있는 것이 보이든, 장점은 각각 있다고 생각합니다만, 무언가를 참조하면서 입력할 때 반투명하면 입력 화면에서 데이터가 비쳐 보이는 장점이 있다 경우도 있습니다.

VBA에서 Window를 반투명화



VBA에서도 Windows API를 사용하여 Windows의 투명도를 변경할 수 있습니다. 너무 얇게 하면 보이기 어렵다든가, 조정이 어렵습니다만, 특정의 시트만 반투명하게 할 수 있으면 더 사용법이 퍼질지도! 라고 생각한 대로.

먼저 다음 코드를 표준 모듈에 씁니다.
Const LWA_COLORKEY = &H1
Const LWA_ALPHA = &H2
Const GWL_EXSTYLE = (-20)
Const WS_EX_LAYERED = &H80000

Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal color As Long, ByVal bAlpha As Byte, ByVal alpha As Long) As Boolean

' 不透明度opacityは0(透明)から1(通常)の間
Sub SetOpacity(opacity As Double)

    On Error GoTo DoNothing

    Dim h As Long
    Dim attr As Long

    h = Application.hwnd
    attr = GetWindowLong(h, GWL_EXSTYLE)
    SetWindowLong h, GWL_EXSTYLE, attr Or WS_EX_LAYERED

    SetLayeredWindowAttributes h, RGB(0, 0, 0), CByte(opacity * 255), LWA_ALPHA

DoNothing:

End Sub

사용법은 간단하며 인수에 0과 1 사이의 숫자를 전달하면됩니다. 0.5를 전달하면 그냥 반투명하게 되고, 0.7이라면 그것보다 진하고, 0.3이라면 그것보다 얇게 표시됩니다.

시트별 투명도 지정



시트마다 opacity라는 이름을 정의하고 책(ThisWorkbook)에 다음 코드를 넣으면 시트를 전환할 때마다 각각의 시트의 셀(%포맷으로 해 두는 것이 좋네요)에 쓰여졌다 불투명도가 자동으로 설정됩니다.
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    On Error GoTo Opac
    SetOpacity Evaluate("opacity")
    Exit Sub
Opac:
    SetOpacity 1
End Sub

opacity의 이름을 설정하지 않은 시트는 자동으로 100%가 되므로, 반투명화하고 싶은 시트만, opacity를 정의해 두면 좋게 되어 있습니다.

실행 예



Sheet1을 50%, Sheet2를 75%, Sheet3을 90%, Sheet4/Sheet5는 설정하지 않은 실행 예입니다.


시트 범위의 이름을 함께 정의



이름은 각각의 시트에 정의해도 되고, 각 시트 범위의 opacity를 다른 시트에 일괄 설정하는 것도, 하나의 방법입니다.

문장으로 말해도 이해하기 어렵기 때문에, 모든 시트를 80% 투명도로서 일람의 opacity 시트를 작성하는 VBA 코드를 마지막에 써 둡니다. 시트마다의 범위명은, 다른 시트에 정의할 수 있네요.
Sub CreateOpacityList()
    Dim sheet As Worksheet
    On Error Resume Next
    Set sheet = Worksheets("opacity")
    If sheet Is Nothing Then
        ' opacityシートがなければブックの最後に追加する
        Worksheets.Add after:=Worksheets(Worksheets.Count)
        Set sheet = ActiveSheet
        sheet.Name = "opacity"
    End If
    ' 1行目は見出し
    sheet.Range("A1").Value = "シート名"
    sheet.Range("B1").Value = "不透明度"
    Dim cell As Range
    Set cell = sheet.Range("A2")
    For Each sheet In Worksheets
        If sheet.Name <> "opacity" Then
            cell.Value = sheet.Name
            With cell.Offset(0, 1)
                .Value = 0.8
                .Style = "Percent"
            End With
            sheet.Names.Add Name:="opacity", RefersTo:=cell.Offset(0, 1)
            Set cell = cell.Offset(1, 0)
        End If
    Next
End Sub

위의 코드를 실행하여 생성된 opacity 시트는 시트 이름당 80%로 작성되어 있으므로 이 값을 변경하여 시트별 불투명도를 설정할 수 있습니다.

좋은 웹페이지 즐겨찾기