Computer‎ > ‎

Blog


[Excel-VBA] Zählen, wenn Fett/Kursiv ua.

veröffentlicht um 29.11.2015, 02:35 von Erhard Rainer   [ aktualisiert: 29.11.2015, 02:40 ]

Kürzlich stand ich vor dem Problem, nur die Zellen zählen zu wollen, die eine bestimmte Formatierung aufweisen.
Anbei die Funktionen:
  • Zählen, wenn Fett/Bold = CountBold

CountBold

Public Function CountBold(myRange As Range) As Integer
Dim i As Integer
Dim j As Integer
Dim BoldCounter As Integer
With myRange
    For i = 1 To myRange.Rows.Count
        For j = 1 To myRange.Columns.Count
            If .Cells(i, j).Font.Bold = True And .Cells(i, j).Value <> "" Then
                BoldCounter = BoldCounter + 1
            End If
        Next j
    Next i
End With
CountBold = BoldCounter
End Function
  • Zählen, wenn Kursiv/Italic = CountItalic

CountItalic

Public Function CountItalic(myRange As Range) As Integer
Dim i As Integer
Dim j As Integer
Dim ItalicCounter As Integer
With myRange
    For i = 1 To myRange.Rows.Count
        For j = 1 To myRange.Columns.Count
            If .Cells(i, j).Font.Italic = True And .Cells(i, j).Value <> "" Then
                ItalicCounter = ItalicCounter + 1
            End If
        Next j
    Next i
End With
CountItalic = ItalicCounter
End Function
  • Zählen, wenn Fett/Bold und Kursiv/Italic = CountItalicBold

CountItalicBold

Public Function CountItalicBold(myRange As Range) As Integer
Dim i As Integer
Dim j As Integer
Dim ItalicBoldCounter As Integer
With myRange
    For i = 1 To myRange.Rows.Count
        For j = 1 To myRange.Columns.Count
            If .Cells(i, j).Font.Italic = True And .Cells(i, j).Font.Bold = True And .Cells(i, j).Value <> "" Then
                ItalicBoldCounter = ItalicBoldCounter + 1
            End If
        Next j
    Next i
End With
CountItalicBold = ItalicBoldCounter
End Function

[powershell] Test auf zu lange Pfade

veröffentlicht um 23.01.2015, 11:43 von Erhard Rainer

Es ist bei Dateioperationen sehr lästig, Fehlermeldungen zu bekommen, die darauf hinweisen, dass ein Pfad zu lang ist. Daher bin ich dazu übergegangen, die Verzeichnisse vor deren Bearbeitung auf zu lange Pfade zu prüfen.

Textfeld

function TestTooLongPath([string]$StartDir,[bool]$retunfolder = $false)
{
[bool]$myretval = $false
[int]$counterErrors = 0
Get-ChildItem -Path $StartDir -Recurse -ErrorAction SilentlyContinue -ErrorVariable err | Out-Null
foreach ($errorRecord in $err)
{
    if ($errorRecord.Exception -is [System.IO.PathTooLongException])
    {
        if ($retunfolder -eq $true) {Write-Warning "Path too long in directory '$($errorRecord.TargetObject)'."}
        $myretval = $true
        $counterErrors = $counterErrors + 1
    }
    else
    {
        Write-Error -ErrorRecord $errorRecord
    }
    if ($retunfolder -eq $true) {Write-Host "Too Long Path Count: $counterErrors"}
}
return,$myretval
}
Verwendung:

ohne Ausgabe der betroffenen Ordner:
if ((TestTooLongPath -StartDir "<PATH>") -eq $false) { Get-ChildItem -Path "<PATH>" -Recurse} else { Write-Host "Folder has too long Path" }

mit Ausgabe der betroffenen Ordner und der Anzahl der Fehler
if ((TestTooLongPath -StartDir "<PATH>" -retunfolder $true) -eq $false) { Get-ChildItem -Path "<PATH>" -Recurse} else { Write-Host "Folder has too long Path" }

[powershell] Return Values in Funktionen

veröffentlicht um 08.12.2014, 07:24 von Erhard Rainer

Powershell hat ein nicht immer klares Verhalten in Bezug auf die Rückgabewerte einer Funktion.

Beispiel Rückgabewerte

function returnValueTest1()
{
    "Test1"
    return "Test2"
}

Write-host "Beispiel 1:" -ForegroundColor Red
$ret = returnValueTest1
$ret[0] #liefert Test1
$ret[1] #liefert Test2


#**************************
function returnValueTest2()
{
    "Test1" | Out-Null
    return "Test2"
}

Write-host "Beispiel 2:" -ForegroundColor Red
$ret = returnValueTest2
$ret #liefert Test2
$ret[0] #liefert T (erster Buchstabe)

#**************************
function returnValueTest3()
{
    "Test1" | Out-Null
    return,"Test2" #erzwingt einen Array als Rückgabewert
}

Write-host "Beispiel 3:" -ForegroundColor Red
$ret = returnValueTest3
$ret #liefert Test2
$ret[0] #liefert T (erster Buchstabe)

#**************************
function returnValueTest4([string]$myString)
{
    $ismatching = $myString -match "^.*?-.*?$"
    if ($ismatching -eq $true) {
        $myString -match '^(.*?)-(.*?)$'
        $Teil1 = $Matches[1].trim()
    } else {
        $Teil1 = "Unbekannt"
    }
    return $Teil1
}
Write-host "Beispiel 4:" -ForegroundColor Red
Write-host "Beispiel 4a:" -ForegroundColor Blue
$ret = returnValueTest4("Ein-Test")
$ret #liefert true,Ein
$ret[1] #liefert Ein
Write-host "Beispiel 4a:" -ForegroundColor Blue
$ret = returnValueTest4("Ein Test")
$ret #liefert Unbekannt
$ret[1] #liefert n

function returnValueTest5([string]$myString)
{
    $ismatching = $myString -match "^.*?-.*?$"
    if ($ismatching -eq $true) {
        $myString -match '^(.*?)-(.*?)$' | Out-Null
        $Teil1 = $Matches[1].trim()
    } else {
        $Teil1 = "Unbekannt"
    }
    return $Teil1
}
Write-host "Beispiel 5:" -ForegroundColor Red
Write-host "Beispiel 5a:" -ForegroundColor Blue
$ret = returnValueTest5("Ein-Test")
$ret #liefert Ein
Write-host "Beispiel 5a:" -ForegroundColor Blue
$ret = returnValueTest5("Ein Test")
$ret #liefert Unbekannt

[powershell] Checksumme von Dateien ermitteln

veröffentlicht um 23.11.2014, 08:55 von Erhard Rainer

Um die Checksumme einer Datei in Powershell ermitteln zu können, gibt es in Powershell 2 Möglichkeiten:
  1. Für die Powershell Version 1-3 kann man auf die HashAlgorithm Class des .NET Frameworks zurückgreifen.
  2. Seit Powershell Version 4 gibt es einen eigenen Powershell-Befehl Get-FileHash.



[Storage Pool] Wiederherstellen des Storage Pools nach einer Neuinstallation

veröffentlicht um 13.11.2014, 12:12 von Erhard Rainer

Nach einer Neuinstallation von Windows 2012 R2 bleibt der Storage Pool grundsätzlich erhalten, wenngleich er nicht sofort danach wieder ersichtlich ist. 

Der Storage Pool ist nach einer Neuinstallation im OperationalStatus "Read-only"


Um diesen zu reaktivieren, kann man folgenden Powershell-Befehl anwenden:

$StoragePoolReadOnly = (Get-StoragePool | Where { $_.OperationalStatus -eq "Read-only" })
$StoragePoolReadOnly | Set-StoragePool -IsReadOnly $false

Danach ist jedoch der die dazugehörige Virtual Disk noch im OperationalStatus "Detached".


Diese virtuelle Disk wird reaktiviert mittels:

Get-VirtualDisk | Where-Object {$_.IsManualAttach –eq $True} | Set-VirtualDisk -IsManualAttach $False

[PowerGUI] Root Element is missing

veröffentlicht um 27.08.2014, 13:33 von Erhard Rainer

Wenn man die Fehlermeldung "Root Element is missing" erhält, hilft selbst ein entfernen und Neuinstallation der Software nichts.
Lösung (powershell)

 $username = [Environment]::UserName

 remove-item -path "c:\Users\$username\AppData\Local\Quest Software\" -recurse -force

 remove-item -path "c:\Users\$username\AppData\Roaming\Quest Software\" -recurse -force


[powershell] Shutdown / Wake Up Computer remote

veröffentlicht um 17.07.2014, 09:17 von Erhard Rainer   [ aktualisiert: 17.07.2014, 09:18 ]

Shutdown

Vorausgesetzt man hat die Rechte dazu, kann man einen Remote Computer mittels
> Stop-Computer -ComputerName $ComputerName 
herunterfahren.

Wird dieser Computer jedoch verwendet, weil beispielsweise ein Programm noch auf eine Netzwerkfreigabe zugreift, dann bekommt man die Fehlermeldung:
Stop-Computer : This command cannot be run on target computer('ComputerName') due to following error: The system shutdown cannot be initiated because there are other users logged on to the computer.

Da hilft ein ... dagegen.
> Stop-Computer -ComputerName $ComputerName -force

WakeUp
Um einen Computer aufzuwecken, bedarf es eines soganannten Wake-Up-Befehls. Als Standalone Programm empfiehlt sich WOL2. Aber es geht auch mit der Powershell.
siehe dazu:

WOL

function isComputerAlive([string]$ComputerName)
{
    if (Test-Connection  $ComputerName -Quiet)
        {
            return,$true
        } else {
            return,$false
        }
}


function WOL([string]$MACStr, [string]$ComputerName)
{
    if (((Get-Service spooler -ComputerName $ComputerName -ErrorAction SilentlyContinue).status -eq "Running") -and (isComputerAlive -ComputerName $ComputerName))
    {
        Write-Host "$ComputerName is already on"
        return,$true
    }    else {
        Write-Host "Try to power on $ComputerName"
        $MACAddr = $MACStr.split(':') | %{ [byte]('0x' + $_)}
        $MACAddrParts = $MACStr.split(':') 
        if ($MACAddrParts.Length -ne 6)
                 {
                         Write-Host 'MAC address must be format xx:xx:xx:xx:xx:xx' -ForegroundColor Red
                 }
        $UDPclient = new-Object System.Net.Sockets.UdpClient
        $UDPclient.Connect(([System.Net.IPAddress]::Broadcast),4000)
        $packet = [byte[]](,0xFF * 6)
        $packet += $MACAddr * 16
        [void] $UDPclient.Send($packet, $packet.Length)
        write "Wake-On-Lan magic packet sent to $MACStr, length $($packet.Length)"
        [bool]$serverup = $false
        [int]$counter = 0
        Do 
        {
            if (((Get-Service spooler -ComputerName $ComputerName -ErrorAction SilentlyContinue).status -eq "Running") -and (isComputerAlive -ComputerName $ComputerName))
            {
                $serverup =  $True
            }
            sleep -Seconds 10
            $counter += 1
            if ($counter -eq 20)
            {
                $serverup =  $True
            }
        } while ($serverup -eq $false)
        if (isComputerAlive -ComputerName $ComputerName)
        {
            return, $True
        } else {
            return, $False
        }
    }
}

$MACStr = "XX:XX:XX:XX:XX:XX"
$CompName = "fileserver"
[bool]$success = (WOL -MACStr $MACStr -ComputerName $CompName)
if ($success -eq $true)
{
    Write-Host "Server $CompName successfully powered on" -ForegroundColor green
} else {
    Write-Host "Problems powering on $CompName" -ForegroundColor red
}

Shutdown

function isComputerAlive([string]$ComputerName)
{
if (Test-Connection  $ComputerName -Quiet)
{
    return,$true
} else {
    return,$false
}
}

function shutdownComputer([string]$ComputerName)
{
    [bool]$alive = (isComputerAlive -Computername "fileserver3")
    if($alive -eq $true)
    {
        #Computer is up => Stop-Computer
        Stop-Computer -ComputerName $ComputerName -Force
        #Check the Shutting Down
        [bool]$serverup = $true
        [int]$counter = 0
        Do 
        {
            if (isComputerAlive -ComputerName $ComputerName)
            {
                $serverup = $true
            } else {
                $serverup = $false
            }
            sleep -Seconds 10
            $counter += 1
            if ($counter -eq 20)
            {
                $serverup = $false
            }
        } while ($serverup -eq $true)
        #Check the Server still up
        if (isComputerAlive -ComputerName $ComputerName)
        {
            return,$false
        } else {
            return,$true 
        }
    } else {
        #Computer is already down
        return,$true
    }
}

[string]$CompName = "fileserver"
[bool]$success = shutdownComputer -ComputerName $CompName
if ($success -eq $true)
{
    Write-Host "Server $CompName successfully shut down" -ForegroundColor green
} else {
    Write-Host "Problems shutting down Computer $CompName" -ForegroundColor red
}




[Excel, CSV] Exportieren von Tabellenblättern nach CSV & wissenschaftliche Notierung von Zahlen

veröffentlicht um 31.05.2014, 04:45 von Erhard Rainer   [ aktualisiert: 28.06.2014, 09:44 ]

Wenn man eine Excel-Datei in einer CSV speichert, wird das in der Zelle verwendete Zahlenformat auch in die csv-Datei geschrieben. Dies ist natürlich bei der wissenschaftlichen Notierung nicht gewünscht.


Das kann man manuell recht schnell ändern, indem man die Anzahl der Dezimalstellen entsprechend einstellt.


oder als VBA

RemoveScientificNotation

Public Sub RemoveScientificNotation()
    Dim i As Long
    Dim j As Long
    Dim maxRow As Long
    Dim maxColumn As Long
    maxRow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
    maxColumn = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column
    For i = 1 To maxRow
        Debug.Print "Row: " & i
        For j = 1 To maxColumn
            Dim myRange As Range
            Set myRange = ActiveSheet.Cells(i, j)
            If IsNumeric(myRange.Value) And InStr(1, myRange.Value, "E") > 0 Then
                myRange.NumberFormat = "0.000000000000000000000"
            End If
        Next
    Next
End Sub


[RDP] An authentication error has orrcured

veröffentlicht um 18.05.2014, 23:43 von Erhard Rainer

Die Fehlermeldung "An authentication error has occured" kann ein Indiz dafür sein, dass das PW des Users mit dem man sich remote einloggen will, abgelaufen ist.


[powershell] Skript um Snap-Ins zu laden

veröffentlicht um 13.05.2014, 02:32 von Erhard Rainer   [ aktualisiert: 13.05.2014, 02:37 ]

Load Snapin

$myprogram = "SharePoint"
$myversion = 2013

#Funktion zum Laden des Snap-Ins
function LoadSnapin([string]$SnapInName) {
    add-pssnapin $SnapInName
    write-host "Loading $SnapInName in session" -ForegroundColor DarkRed -BackgroundColor White
}

#Funktion zum Ermitteln der benötigten Snapins für ein entsprechendes Programm
#kann erweitert werden
function GetSnapin([string]$program, [int]$Version) {
    if ($program -eq "SQL") {
        if ($Version -eq 2012) {
            return,"SqlServerProviderSnapin110"
        } 
        elseif ($Version -eq 2010) {
            return,"SqlServerProviderSnapin100"
        }
    } elseif ($program -eq "SharePoint") {
            return,"Microsoft.SharePoint.PowerShell"
    }
}
#Funktion zum Ermitteln der für das SnapIn benötigten DLLs
#kann erweitert werden
function GetSnapinDLL([string]$program, [int]$Version) {
    if ($program -eq "SQL") {
            return @("Microsoft.SqlServer.Management.PSSnapins.dll","Microsoft.SqlServer.Management.PSProvider.dll")

    } elseif ($program -eq "SharePoint") {
            return @("Microsoft.SharePoint.PowerShell.dll")
    }
}


#Header
Write-host "Snapin für $myprogram $myversion"
#Ermitteln, welches Snapin benötigt wird
$mySnapIn = GetSnapin -program $myprogram -Version $myversion
Write-Host "benötigtes SnapIn: $mySnapIn"
#Lade das Snapin 
if (!(Get-PSSnapin | ?{$_.name -eq $mySnapIn}))
{
    if(Get-PSSnapin -registered | ?{$_.name -eq $mySnapIn})
    {
        LoadSnapin($mySnapIn)
    }
    else
    {
        write-host "$mySnapIn is not registered with the system." -Backgroundcolor Red –Foregroundcolor White
        write-host "Registering SnapIn"
        $framework=$([System.Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory())
        Set-Alias installutil "$($framework)installutil.exe"
        #Ermitteln der benötigten DLLs
        $myDLLs = GetSnapinDLL -program $myprogram -Version $myversion
        foreach($myDLL in $myDLLs) {
            Get-ChildItem -Path "C:\" -Filter $myDLL -Recurse | % {
                $myDLLPath = $_.FullName
                Write-Host "Pfad der DLL: $myDLLPath"
				installutil $myDLLPath
            } 
        }
        LoadSnapin($mySnapIn)
    }
}
else
{
  write-host "$mySnapIn is already loaded" -ForegroundColor DarkGreen -BackgroundColor White
}

1-10 of 152