Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1544to1548
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
Datei endung prüfen
28.02.2017 08:23:13
Thomas
Hallo Excelfreunde,
zur Zeit prüfe ich mit:
If Mid(zelle, InStrRev(zelle, ".") + 1) = "xlsx" Or _
Mid(zelle, InStrRev(zelle, ".") + 1) = "xlsm" Or _
Mid(zelle, InStrRev(zelle, ".") + 1) = "xls" Or _
Mid(zelle, InStrRev(zelle, ".") + 1) = "xlsb" Or _
Mid(zelle, InStrRev(zelle, ".") + 1) = "xlst" Then
ob es sich bei der betroffenen Datei um eine Exceldatei handelt.
Kann ich dies irgendwie auch besser machen? Ich weiss zwar das es den Befehl Like gibt aber ich bekomme ihn nicht hier rein.
If Mid(zelle, InStrRev(zelle, ".") + 1) = like "xl*"
Da meckert Excel schon im VBA Fenster.
oder
If Mid(zelle, InStrRev(zelle, ".") + 1) = "like *.xl*"
Dies wirkt leider nicht
Der Hintergrund ist, ich möchte später diese Endung als Bedingung in eine TextBox ablegen. Mit meiner jetzigen Lösung benötige ich vier TextBoxen.
mfg Thomas

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Datei endung prüfen
28.02.2017 08:36:19
UweD
Hallo
das müsste reichen.
    Dim Zelle
    Zelle = "gfdgffg.xlsb"
    If InStrRev(Zelle, ".xls") > 0 Then
        MsgBox "Treffer"
    Else
        MsgBox ":-("
    End If

LG UweD
Anzeige
AW: Datei endung prüfen
28.02.2017 08:52:03
Luschi
Hallo Thomas,
versuch es mal so:

Sub test1()
Dim extD As String, zelle
'zelle = "c:\aaa\bbb\ccc\1234.xlsmm"
extD = LCase(Mid(zelle, InStrRev(zelle, ".", -1, vbTextCompare) + 1))
Select Case extD
Case "xlsm", "xlsb", "xlst", "xls", "xlt"
MsgBox "Hurra...", vbSystemModal + 48, "Weiter"
Case Else
MsgBox "Schade...", vbSystemModal + 16, "Ende"
Exit Sub
End Select
End Sub
Gruß von Luschi
aus klein-Paris
besten dank an UweD
28.02.2017 09:06:09
Thomas
Hallo UweD,
das klappt super.
Hab recht vielen dank für diesen super und auch superschnellen Vorschlag.
ich wünsch dir noch ein ruhigen tag
mfg thomas
Anzeige
gern geschehen mwT
28.02.2017 09:18:43
UweD
beachte aber auch die anderen Vorschläge
Meine Lösung würde bei z.B. .xlsmm eine (ungültige) Excel-Endung vorspielen
LG UweD
AW: Datei endung prüfen
28.02.2017 08:52:12
harry
Hallo Thomas,
für sowas sing Regular Expressions sehr gut geeignet:
Function regexsamp(strText As String) As Boolean
Set objRegEx = CreateObject("vbscript.regexp")
With objRegEx
.Global = True
.IgnoreCase = True
.Pattern = "^.*\.(xls|xlsm|xlsx|xlsb|xlst)$"
Set objmatch = .Execute(strText)
End With
For intIndex = 0 To objmatch.Count - 1
Next
Set objRegEx = Nothing
Set objmatch = Nothing
If intIndex = 0 Then
regexsamp = False
Else
regexsamp = True
End If
End Function
Grüße
harry
Anzeige
AW: Datei endung prüfen
28.02.2017 13:41:27
thomas
Hallo Luschi, harry, UweD,
ich habe gestern den ganzen abend gegoogelt und keine Variante gefunden nun habe ich zwei einhalb.
Einfach nur super.
Es hat ein wenig gedauert weil ich eure vorschläge erstmal eingebaut und getestet hab.
luschi dein vorschlag klappt bei mir super hab recht vielen dank dafür.
harry leider kann ich dein Vorschlag nicht testen habe einfach nicht raus bekommen wie ich die Funktion ansprechen kann.
liege ich hiermit
strText = zelle
If strText = True Then
MsgBox ("passt")
else
msgbox ("passt nicht" "
völlig daneben?
UweD hab auch du besten dank für dein hinweis.
eigentlich habe ich ja schon die Lösung ich stelle dies mal trotzdem auf offen denn ich mich interessiert jetzt noch wie ich so eine Funktion ansprechen kann .
Kann mir dies jemand zeigen?
mfg thomas
Anzeige
Einbau von Funktion(en)
28.02.2017 15:39:27
Funktion(en)
Hi,
das geht im Prinzip so:
Function regexsamp(strText As String) As Boolean
' Die Variablen waren nicht geDimt
Dim objRegEx As Object, objmatch As Object
Dim intIndex
Set objRegEx = CreateObject("vbscript.regexp")
With objRegEx
.Global = True
.IgnoreCase = True
.Pattern = "^.*\.(xls|xlsm|xlsx|xlsb|xlst)$"
Set objmatch = .Execute(strText)
End With
For intIndex = 0 To objmatch.Count - 1
Next
Set objRegEx = Nothing
Set objmatch = Nothing
If intIndex = 0 Then
regexsamp = False
Else
regexsamp = True
End If
End Function
Sub TestMitRegEx()
Dim zelle As String
zelle = "C:\DiesIstEinTest\ExcelDatei.xlsx"
If regexsamp(zelle) Then
MsgBox "gefunden"
Else
MsgBox "nicht gefunden"
End If
End Sub
Die RegEx werde ich nie begreifen, das ist mir zu viel Einarbeitungsaufwand.
Abgesehen davon kommt es auf die Menge von Daten an, die man verarbeitet. Jeder einzelne Aufruf von Funktionen benötigt Zeit, und das Erzeugen eines x-beliebigen Objekts (ob createobject für ein RegEx oder ein anderes Objekt) erst Recht, da letzteres im Prinzip von der Platte nachgeladen werden muß.
Deshalb eine weitere Variante:
Function XlFile(s As String) As Boolean
Dim s3$, s4&
Const Ext4 = "xmbt "
s3 = LCase(Right(s, 4))
If Mid(s3, 1, 1) = "." Then
XlFile = s3 = ".xls"
Else
XlFile = Left(s3, 3) = "xls" And InStr(Ext4, Right(s3, 1)) > 0
End If
End Function
Sub TestMitXlFile()
Dim zelle As String
zelle = "C:\DiesIstEinTest\ExcelDatei.xlsx"
If XlFile(zelle) Then
MsgBox "gefunden"
Else
MsgBox "nicht gefunden"
End If
End Sub
Was es für einen Unterschied macht, kann man damit nachvollziehen:
Sub TestVergleich()
Dim zelle As String
Dim i&, imax&
Dim erg&(1 To 2)
Dim t0 As Single, t1 As Single
imax = 5000
erg(1) = 0: erg(2) = 0
t0 = Timer
For i = 1 To imax
zelle = "C:\DiesIstEinTest\ExcelDatei" & i & ".xlsx"
If XlFile(zelle) Then erg(1) = erg(1) + 1 Else erg(2) = erg(2) + 1
Next
t0 = (Timer - t0) * 1000
MsgBox t0 & " ms. erg(1)=" & erg(1) & " erg(2)=" & erg(2)
erg(1) = 0: erg(2) = 0
t1 = Timer
For i = 1 To imax
zelle = "C:\DiesIstEinTest\ExcelDatei" & i & ".xlsx"
If regexsamp(zelle) Then erg(1) = erg(1) + 1 Else erg(2) = erg(2) + 1
Next
t1 = (Timer - t1) * 1000
MsgBox t1 & " ms. erg(1)=" & erg(1) & " erg(2)=" & erg(2)
MsgBox "Regex benötigt " & t1 / t0 & " mal so viel Zeit wie XlFile."
End Sub

Das ergibt auf meiner (lahmen) Maschine einen Faktor von rund knapp 400.
Bei "sehr vielen" Daten ist es vorteilhafter, eine Funktion *nicht* jedesmal *einzeln* aufzurufen, sondern ein Array mit allen Daten zu übergeben:
Function XlArray(s) As Variant
Dim s3$, i&
Const Ext4 = "xmbt " ' gültige Buchstaben nach "xls"
For i = LBound(s) To UBound(s)
s3 = LCase(Right(s(i, 1), 4))
If Mid(s3, 1, 1) = "." Then
s(i, 1) = s3 = ".xls"
Else
s(i, 1) = Left(s3, 3) = "xls" And InStr(Ext4, Right(s3, 1)) > 0
End If
Next
XlArray = s
End Function
Sub TestXLArray()
Dim z, e4 As String
Dim i&, imax&
Const Ext4 = "xmbt kenucy" ' gültige und nicht gültige Buchstaben
Dim lenExt4&
Dim t0 As Single, t1 As Single
imax = 5000
lenExt4 = Len(Ext4)
t0 = Timer
ReDim z(1 To imax, 1 To 1)
For i = 1 To imax
e4 = Mid(Ext4, (i Mod lenExt4) + 1, 1)
If e4 = " " Then e4 = ""
z(i, 1) = "C:\DiesIstEinTest\ExcelDatei.xls" & e4
Next
t0 = (Timer - t0) * 1000
MsgBox t0 & " ms. für die Erzeugung der Testwerte"
Range("A1").Resize(imax, 1) = z
t1 = Timer
z = XlArray(z)
t1 = (Timer - t1) * 1000
MsgBox t1 & " ms zum Berechnen der Werte"
Range("B1").Resize(imax, 1) = z
End Sub
Ich habe hier bewußt ein "zweidimensionales" Array gewählt, weil man ein solches erhält, wenn man einen Bereich aus einem Tabellenblatt nimmt.
Anstelle der Erzeugung von Testnamen könntest Du auch eine Zuweisung zu Deinen Dateinamen machen, etwa
Sub ArrayAusBereich()
Dim z
Dim t0 As Single
Dim Bereich As String
t0 = Timer
Bereich = "A2:A200"
z = Range(Bereich).Value
z = XlArray(z)
Range(Bereich).Offset(, 1) = z
t0 = (Timer - t0) * 1000
MsgBox t0 & " ms für die Berechung von " & Bereich
End Sub
Viel Spaß beim Testen,
Michael
Anzeige
oh cool besten dank Michael
28.02.2017 17:26:03
Thomas
Hallo Michael,
das ist richtig lieb von dir das du dies so ausführlich beschrieben hast.
Damit werde ich mich jetzt erstmal richtig stark beschäftigen.
Da freu ich mich aber. Solche hintergrund infos helfen mir unwahrscheinlich beim besser werden.
hab recht vielen vielen dank
mfg thomas
gern geschehen
02.03.2017 12:34:31
Michael
Hallo Thomas,
es war mir ein Vergnügen, zumal ich mich immer wieder mal dafür interessiere, wie schnell welcher Code läuft.
Einen zugänglichen Text zu Arrays findest Du hier:
http://www.online-excel.de/excel/singsel_vba.php?f=152
Ich habe übrigens bei Variablen die Kurzschreibweise verwendet: & = as Long, $ = as String, Näheres findest Du hier:
http://de.wikibooks.org/wiki/VBA_in_Excel/_Variablen_und_Arrays
Ich wünsche Dir viel Spaß & Erfolg,
schöne Grüße,
Michael
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige
Archiv - Verwandte Themen