Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1160to1164
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Bildabmessungen mit GetDetailsOf

Bildabmessungen mit GetDetailsOf
Jeziro
Hallo an alle,
Ich kämpfe mit einem komischen Problem. Ich habe Windows 7 und Excel 2003. Ich habe mir ein VBA Script geschrieben, mit welchem ich die Bildabmessungen von JPG Dateien in beliebigen Ordnern für die weitere Verarbeitung auslesen kann. Hierzu wird der Bildname, die Breite und die Höhe des jeweiligen Bildes mit GetDetailsOf ausgelesen. Wichtig ist, dass die Abmessungen als Zahlen in der Zelle landen, damit ich anschließend Berechnungen damit durchführen kann. Dir (abgespeckte) Code sieht folgendermaßen aus:
Sub einlesen2()
Dim objShell As Object
Dim objFolder As Object
Dim lngZeile As Long
Dim varFolderItem
Dim wks As Worksheet
Set wks = ThisWorkbook.Sheets("HTML-Generator")
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(wks.Cells(2, 2).Value) 'Zelle B2 enthält den Pfad zum  _
auszulesenden Ordner
lngZeile = 10
For Each varFolderItem In objFolder.Items
'Namen und Bildgrößen holen
wks.Cells(lngZeile, 1) = varFolderItem.Name
wks.Cells(lngZeile, 2) = Replace(objFolder.GetDetailsOf(varFolderItem, 162), " Pixel", " _
")
wks.Cells(lngZeile, 3) = Replace(objFolder.GetDetailsOf(varFolderItem, 164), " Pixel", " _
")
lngZeile = lngZeile + 1
Next
End Sub

In den Spalten B und C sehe ich nun auch Zahlen (z.B. 170), versuche ich diese allerdings zu addieren, so erhalte ich einen Fehler. Eine genauere Untersuchung der Zahlen ergibt, dass diese ein weiteres unsichtbares Zeichen an erster Stelle enthalten. Der Befehl Code() zeigt mir, dass es sich um ein Fragezeichen handelt (Wert 63). Auch ein Blick in das Lokal-Fenster bestätigt dies, da dort das Fragezeichen sichtbar ist. Versuche ich es allerdings mit der Replace-Funktion zu entfernen, so klappt es nicht. Versuche ich via vba danach zu suchen, so wird nichts gefunden. Mit der Excel Funktion SUCHEN finde ich das Fragezeichen hingegen problemlos.
Wie kriege ich das mistding weg, ohne ungeprüft das erste Zeichen zu löschen. Ich würde gerne Prüfen, ob sich an erster Stelle ein Fragezeichen befindet und dies dann löschen.
Hat jemand eine Idee?

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Bildabmessungen mit GetDetailsOf
03.06.2010 16:57:15
Daniel
Hi
du unterliegst einem kleinen Irrtum.
das ist nicht das Zeichen mit dem Ascii-Code 63, sondern das ist ein Zeichen aus dem Unicode-Zeichensatz.
die normalen Ascii-Zeichen werden über 1 Byte definiert, die Unicode-Zeichen über 2 Byte, daher gibts auch wesentlich mehr.
der VBA-Editor kann aber nur die ASCII-Zeichen darstellen, und damit wird daraus eben das Fragezeichen.
den ZahlenCode für die Unicode-Zeichen prüft man mit ASCW(Zeichen) und schreibt sie mit CHRW(Nummer)
in deinem Fall ist das das Zeichen mit er Nummer 8206 und du kannst es mit
Replace(...., ChrW(8206), "")
entfernen. Dann werden die Werte als Zahlen in die Zellen geschrieben.
Gruß, Daniel
Anzeige
AW: Bildabmessungen mit GetDetailsOf
03.06.2010 17:34:48
Jeziro
Yippi,
Super, danke, klappt.
Weiß Du vielleicht auch, ob dieses Zeichen auch bei älteren Windowsversionen GetDetailsOf(varFolderItem, 27) auftaucht?
AW: Bildabmessungen mit GetDetailsOf
03.06.2010 18:54:31
Nepumuk
Hallo Jeziro,
bevor du da rumgrübelst, versuch es mal so:
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Private Declare Function CreateIC Lib "GDI32.dll" Alias "CreateICA" ( _
    ByVal lpDriverName As String, _
    ByVal lpDeviceName As String, _
    ByVal lpOutput As String, _
    ByRef lpInitData As Any) As Long
Private Declare Function DeleteDC Lib "GDI32.dll" ( _
    ByVal hDC As Long) As Long
Private Declare Function GetDeviceCaps Lib "GDI32.dll" ( _
    ByVal hDC As Long, _
    ByVal nIndex As Long) As Long
Private Declare Function MulDiv Lib "Kernel32.dll" ( _
    ByVal nNumber As Long, _
    ByVal nNumerator As Long, _
    ByVal nDenominator As Long) As Long

Private Const LOGPIXELSX = 88&
Private Const LOGPIXELSY = 90&

Private Const HimetricInch = 2540&

Private Sub Bildgroesse_auslesen(strPicturePath As String)
    Dim MyPicture As StdPicture
    Dim dblPixelX As Long, dblPixelY As Long
    Set MyPicture = LoadPicture(strPicturePath)
    dblPixelX = HimetricToPixelsX(MyPicture.Width)
    dblPixelY = HimetricToPixelsY(MyPicture.Height)
    MsgBox "Breite in Himetric " & CStr(MyPicture.Width) & vbLf & _
        "Höhe in Himetric " & CStr(MyPicture.Height)
    MsgBox "Breite in Pixel " & CStr(dblPixelX) & vbLf & _
        "Höhe in Pixel " & CStr(dblPixelY)
    MsgBox "Breite in Zoll " & CStr(dblPixelX / 72) & vbLf & _
        "Höhe in Zoll " & CStr(dblPixelY / 72)
    MsgBox "Breite in mm " & CStr(dblPixelX * 3.52777777777778E-02) & vbLf & _
        "Höhe in mm " & CStr(dblPixelY * 3.52777777777778E-02)
    MsgBox "Breite in Point " & CStr(dblPixelX * 0.75) & vbLf & _
        "Höhe in Point " & CStr(dblPixelY * 0.75)
    Set MyPicture = Nothing
End Sub

Private Function HimetricToPixelsX(ByVal inHimetric As Long) As Long
    HimetricToPixelsX = ConvertPixelHimetric(inHimetric, True, True)
End Function

Private Function HimetricToPixelsY(ByVal inHimetric As Long) As Long
    HimetricToPixelsY = ConvertPixelHimetric(inHimetric, True, False)
End Function

Private Function ConvertPixelHimetric(ByVal inValue As Long, _
        ByVal ToPix As Boolean, inXAxis As Boolean) As Long

    Dim TempIC As Long, GDCFlag As Long
    TempIC = CreateIC("DISPLAY", vbNullString, vbNullString, ByVal 0&)
    If (TempIC) Then
        If (inXAxis) Then GDCFlag = LOGPIXELSX Else GDCFlag = LOGPIXELSY
        If (ToPix) Then ConvertPixelHimetric = MulDiv(inValue, _
            GetDeviceCaps(TempIC, GDCFlag), HimetricInch) _
        Else ConvertPixelHimetric = MulDiv(inValue, _
            HimetricInch, GetDeviceCaps(TempIC, GDCFlag))
        Call DeleteDC(TempIC)
    End If
End Function

Public Sub test()
    Call Bildgroesse_auslesen("D:\Eigene Dateien\Eigene Bilder\15668.jpg")
End Sub

Gruß
Nepumuk
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige