excelvbabatterybatterylevelsystem-properties

Retrieve the computer's charging status & current battery level


I needed a VBA procedure to retrieve the system's current battery charge level and charging status.

I was surprised not to find anything on Stack Overflow, and I eventually figured it out, so I'll share the code here as a Q+A.


Solution

  • Private Declare PtrSafe Function GetSystemPowerStatus Lib "kernel32" (lpSystemPowerStatus As SYSTEM_POWER_STATUS) As LongPtr
    
    Private Type SYSTEM_POWER_STATUS
        ACLineStatus As Byte
        BatteryFlag As Byte
        BatteryLifePercent As Byte
        SystemStatusFlag As Byte
        BatteryLifeTime As Long
        BatteryFullLifeTime As Long
    End Type
    
    
    Public Sub getBatteryStatus() 'batt info to immediate window
        
        Dim SPS As SYSTEM_POWER_STATUS
        GetSystemPowerStatus SPS 'get system batt power status
        
        With SPS
            Debug.Print "Battery Life:  ", ;
            Select Case .BatteryLifePercent
                Case 255:   Debug.Print "Unknown"
                Case Else:  Debug.Print .BatteryLifePercent & "%"
            End Select
            
            Debug.Print "Battery Life Time: ", ;
            Select Case .BatteryLifeTime
                Case -1:    Debug.Print "Charging"
                Case Else
                    Debug.Print Int(.BatteryLifeTime / 60) & "min / ";
                    Select Case .BatteryFullLifeTime
                        Case -1
                            If .BatteryLifePercent = 0 Then
                                Debug.Print "Unknown"
                            Else 'estimate FullLifeTime:
                                Debug.Print "~" & Int(.BatteryLifeTime / .BatteryLifePercent * 5 / 3) & "min"
                            End If
                        Case Else
                            Debug.Print .BatteryFullLifeTime & "sec"
                    End Select
            End Select
    
            Debug.Print "AC power status: ", ;
            Select Case .ACLineStatus 'show some information
                Case 0:     Debug.Print "Offline"
                Case 1:     Debug.Print "OnLine"
                Case Else:  Debug.Print "Unknown"
            End Select
            
            Debug.Print "Battery charge status: ", ;
            Select Case .BatteryFlag
                Case 0:     Debug.Print "Not Charging (33-66%)"
                Case 1:     Debug.Print "High (>66%)"
                Case 2:     Debug.Print "Low (<33%)"
                Case 4:     Debug.Print "Critical (<5%)"
                Case 8:     Debug.Print "Charging"
                Case 1 + 8: Debug.Print "High (>66%)- Charging"
                Case 2 + 8: Debug.Print "Low (<33%) - Charging"
                Case 4 + 8: Debug.Print "Critical (<5%) - Charging"
                Case 128:   Debug.Print "No System Battery"
                Case 255:   Debug.Print "Unknown Status"
            End Select
        
            Debug.Print "Battery saver: ", ;
            Select Case .SystemStatusFlag
                Case 0:     Debug.Print "Off"
                Case 1:     Debug.Print "On (Save energy where possible)" 'Windows 10 only
            End Select
    
        End With
    End Sub
    

    More Information: